it-swarm-vi.com

Tiêu chuẩn để mã hóa mật khẩu trong tập tin cấu hình?

Nơi làm việc của tôi có một tiêu chuẩn rằng mật khẩu văn bản gốc không được phép trong các tệp cấu hình ứng dụng. Điều này đủ ý nghĩa trên khuôn mặt của nó, trong trường hợp ai đó có quyền truy cập vào các tệp cấu hình, họ không tự động có quyền truy cập vào tất cả các đặc quyền của ứng dụng đó. Trong một số trường hợp, có thể và rõ ràng nên có quyền truy cập liên quan đến thông tin đăng nhập hoặc tránh sử dụng mật khẩu, chẳng hạn như trong xác thực Windows Security cho SQL Server hoặc được cấu hình ở vị trí bên thứ ba, chẳng hạn như cấu hình JDBC trong môi trường J2EE , nhưng điều này không phải lúc nào cũng có thể.

  • Khi tôi phải có mật khẩu trong tệp cấu hình, nó sẽ mang mức mã hóa nào?
  • Làm thế nào để bạn đối phó với thực tế là khóa mã hóa cho mật khẩu phải được mã hóa cứng hoặc được lưu trữ trong một tệp cấu hình khác?
  • Các khóa mã hóa cho mật khẩu có thể đọc được?
57
C. Ross

Vì vậy, sau đây là một chút quá dài cho một bình luận ...

Có lẽ lùi một bước và so sánh lợi ích của kiểm soát phòng ngừa và thám tử có thể giúp ích. Kiểm soát phòng ngừa bao gồm mã hóa nhưng bạn cũng có thể mã hóa mật khẩu để làm cho nó ít rõ ràng hơn. Cách tiếp cận này nhằm bảo vệ mật khẩu khỏi việc chia sẻ ngẫu nhiên (mã hóa b32 sẽ tạo ra các ký tự ít ý nghĩa hơn (b32 tạo ra chuỗi dài hơn b64). Cách tiếp cận như vậy chỉ làm tăng khó khăn trong việc ghi nhớ chuỗi số ngẫu nhiên cũng như phương pháp nên được sử dụng để giải mã chuỗi. Mã hóa Base32/64 là một cách đơn giản để bảo vệ mật khẩu không yêu cầu logic bổ sung được xây dựng/duy trì.

Các phương pháp khác để kiểm soát phòng ngừa có thể sẽ sử dụng mã hóa. Có nhiều cách khác nhau để bảo vệ chìa khóa. Không đi sâu vào chi tiết hay nhắc lại những gì D.W. đã được đăng, bạn có thể lớp điều khiển thám tử để cải thiện tư thế bảo mật. Ví dụ: bạn có thể kiểm tra quyền truy cập vào một tệp có chứa khóa. Bạn có thể tương quan các sự kiện (như khởi động lại máy chủ/dịch vụ) với quyền truy cập vào tệp chính. Bất kỳ yêu cầu truy cập nào khác (thành công hay không) vào tệp chính có thể chỉ ra hoạt động bất thường.

Để có được câu hỏi của bạn, đây là tôi:

nếu bạn phải lưu trữ mật khẩu trong một tệp cấu hình, ít nhất tôi khuyên bạn nên mã hóa mật khẩu nếu có thể. Mã hóa mật khẩu sẽ làm giảm khả năng nó bị rò rỉ trong trường hợp ai đó cuộn qua tệp, nói với một đại diện hỗ trợ của nhà cung cấp đang xem. Mã hóa mật khẩu an toàn hơn nhiều, nhưng điều đó đòi hỏi sự phức tạp bổ sung.

Làm thế nào để đối phó với thực tế là một khóa phải được mã hóa cứng hoặc được lưu trữ trong một tệp khác. Chà, tách khóa mã hóa trong một tệp khác làm tăng khó khăn cho ai đó để xem khóa. Ví dụ: bạn có thể sử dụng kiểm soát truy cập để giới hạn quyền truy cập vào tệp chính nhưng vẫn duy trì ACL mở hơn cho tệp cấu hình. Tương tự, bạn có thể thực hiện kiểm toán để truy cập vào tệp chính mà bạn có thể sử dụng để tương quan trở lại các sự kiện yêu cầu sử dụng khóa. Mã hóa cứng khóa có thể tốt nếu bạn giới hạn quyền truy cập vào nhị phân. Mã hóa cẩn thận của mật khẩu có thể dễ dàng được phát hiện bằng cách chạy "chuỗi" chống lại nhị phân. Bạn có thể mã hóa/mã hóa mật khẩu được mã hóa cứng (nghĩa là yêu cầu một chức năng riêng (có thể là kiểm toán) khi giải mã mật khẩu, nhưng điều đó làm tăng sự phức tạp cho nhà phát triển và quản trị viên (tức là làm thế nào để thay đổi khóa mà không cần xây dựng lại/biên dịch lại nhị phân ?).

Các khóa mã hóa cho mật khẩu có thể đọc được? Nó phụ thuộc. Chỉ có một số cách hạn chế để bảo vệ chìa khóa. Khóa mã hóa thường được xem là một chuỗi ký tự chữ và số khó cam kết với bộ nhớ. Bạn luôn có thể mã hóa/mã hóa khóa, nhưng các phương pháp như vậy không ngăn cản ai đó đủ thông minh để chụp ảnh màn hình. Tuy nhiên, bạn có thể sử dụng các "khóa" đơn giản (giống như mật khẩu) làm đầu vào cho chức năng mở rộng khóa. Trong các trường hợp đó, có lẽ các biện pháp bổ sung như mã hóa sẽ thêm một số giá trị bổ sung liên quan đến chi phí phức tạp.

Nếu bất cứ điều gì, một cách tiếp cận tốt là thực hiện nhiều lớp điều khiển. Kiểm soát phòng ngừa là khó khăn hơn trong khi kiểm soát thám tử thường dễ thực hiện hơn. Việc tách các tệp chính có thể đơn giản hóa kiến ​​trúc tổng thể và thực hiện các điều khiển. Bất kể sử dụng kiểm soát phòng ngừa hoặc thám tử được sử dụng, cho phép một số chức năng kiểm toán là phải cùng với xem xét nhật ký kiểm toán. Bằng cách này, nếu điều không thể xảy ra (truy cập vào khóa), bạn có thể thực hiện hành động khắc phục.

25
bangdang

Nếu bạn đang chạy một máy chủ cần mật khẩu để truy cập vào một số dịch vụ từ xa, thì không có giải pháp tốt. Lưu trữ mật khẩu trong một tệp cấu hình được lưu trữ ở một vị trí phù hợp có lẽ là cách tốt nhất trong một tập hợp các lựa chọn kém.

Các lựa chọn là: yêu cầu người dùng nhập mật khẩu vào lúc khởi động (điều này rất tệ, bởi vì nếu máy chủ của bạn được khởi động lại, thì bây giờ máy chủ không thể truy cập được cho đến khi một người có thể đi đến máy chủ và nhập mật khẩu); mã hóa mật khẩu vào mã nguồn của mã máy chủ (điều này tệ hơn nhiều so với việc đặt nó trong một tệp cấu hình); hoặc lưu trữ mật khẩu trong một tệp cấu hình (ít tệ nhất trong tất cả các tùy chọn). Điều chính cần chú ý với tệp cấu hình, là đảm bảo nó được lưu trữ bên ngoài thư mục gốc của bạn và các quyền của tệp được khóa một cách thích hợp.

Mã hóa mật khẩu được lưu trữ trong tệp cấu hình không giúp ích gì, vì bây giờ bạn lưu trữ khóa giải mã ở đâu? Bạn vừa mới giải quyết vấn đề xung quanh. "Đó là rùa tất cả xuống" không phải là một phản ứng chấp nhận được.

Trên Windows, một tùy chọn khác bạn có thể xem là lưu trữ mật khẩu trong DPAPI. Điều này giúp một chút cho các ứng dụng máy tính để bàn, nhưng không hữu ích cho các máy chủ không giám sát.

Để biết thêm, hãy đọc các câu hỏi sau trên trang web này: Lưu mật khẩu để tránh tương tác người dùng , nơi lưu trữ khóa để mã hóa , Làm thế nào để thực hiện các dự án nguồn mở xử lý các tạo phẩm an toàn? , Làm cách nào tôi có thể giải mã dữ liệu bằng Java mà không cần mã hóa cứng? , Mật khẩu trong tệp .php , Trường hợp nào Tôi lưu trữ khóa một cách an toàn cho một hệ thống có thể nhìn thấy nguồn? .

P.S. Về nguyên tắc, bạn có thể sử dụng TPM để lưu trữ mật khẩu - nhưng trên thực tế, điều này khiến bạn gặp vấn đề về chảy máu, do đó có lẽ không khả thi đối với hầu hết mọi người.

37
D.W.

Lưu mật khẩu trong biến môi trường người dùng O/S (không phiên) và chạy chương trình với tư cách là người dùng đó.

Ưu điểm:

  1. Bạn sẽ không bao giờ vô tình kiểm tra mật khẩu vào kiểm soát nguồn vì không có tệp nào để đăng nhập.

  2. Nếu bạn tăng quyền truy cập tệp trên tệp cấu hình của mình (điều này không bao giờ xảy ra phải không?), Mật khẩu của bạn sẽ không bị xâm phạm

  3. Chỉ có thể được đọc bởi người dùng hoặc root (giống như tệp cấu hình, giống như khóa riêng bảo vệ tệp được mã hóa)

  4. Nếu bạn đang mã hóa tệp, làm thế nào bạn bảo mật khóa của mình?

  5. Xóa envvars của bạn trước khi bắt đầu các quy trình mới, vì chúng có thể được chuyển qua

Một lợi thế cho HSM là trong khi người dùng hoặc root có thể sử dụng HSM để giải mã một giá trị, họ không bao giờ có thể lấy được khóa bên trong nó.

5
Neil McGuigan

Lưu trữ mật khẩu cục bộ là một vấn đề dài tôi đã giải quyết. vì mã hóa sẽ không chống đạn, nhưng có thể giúp ích, nên có một vài lựa chọn khác:

  1. lưu trữ mật khẩu trên máy cục bộ trong một tệp mới (sẽ được mã hóa tốt hơn) và hạn chế quyền truy cập vào tệp
  2. lưu trữ mật khẩu trong một máy chủ khác, người sẽ xác thực thông qua OAUTH hoặc dịch vụ xác thực khác - kiểm tra tahoe-lafs: https://tahoe-lafs.org/trac/tahoe- lafs
  3. sử dụng dịch vụ cục bộ được mã hóa, người lưu trữ mật khẩu và truy cập nó bằng Chứng chỉ
  4. một số tổ chức lưu trữ mật khẩu của mình dưới dạng khóa đăng ký hoặc với DPAPI - http://msdn.Microsoft.com/en-us/l Library/ms995355.aspx
  5. sử dụng OTP bằng dịch vụ quản lý tài khoản
  6. sử dụng máy chủ proxy để truy cập dữ liệu bí mật và hạn chế quyền truy cập vào proxy

.

và cho câu hỏi của bạn:

Khi tôi phải có mật khẩu trong tệp cấu hình, nó sẽ mang mức mã hóa nào?

bạn không bao giờ phải có mật khẩu trong mã của mình, nhưng đó là cách dễ nhất và không an toàn nhất.

Làm thế nào để bạn đối phó với thực tế là khóa mã hóa cho mật khẩu phải được mã hóa cứng hoặc được lưu trữ trong một tệp cấu hình khác?

sử dụng các hạn chế truy cập và giám sát tập tin

Các khóa mã hóa cho mật khẩu có thể đọc được? nếu bạn có nghĩa là mật khẩu mạnh và dễ đọc của con người, thì không có vấn đề gì cả

4
Sergey Malych

2 xu của tôi ở đây là, để bảo mật hoàn hảo, bạn sẽ muốn ứng dụng có thể làm gì đó (đọc mật khẩu) mà kẻ tấn công trên máy vật lý có cùng đặc quyền không nên làm, điều này có vẻ mâu thuẫn .

Tốt nhất bạn có thể obfuscate mật khẩu trong cấu hình ( Base64 , khóa ở đâu đó trên máy tính, v.v ...)

0
Nicolas C