Có an toàn để lưu trữ mật khẩu quan trọng trong các biến môi trường máy chủ?


23

Tôi có một cụm máy chủ, mỗi máy chủ có các tệp cấu hình hiện chứa mật khẩu văn bản đơn giản cho các hệ thống nhạy cảm, quan trọng (hàng đợi tin nhắn, lưu trữ dữ liệu và các dịch vụ khác).

Một số người chuyển mật khẩu quan trọng ra khỏi tệp cấu hình vào biến môi trường của tài khoản người dùng mà máy chủ xử lý chạy. Theo cách này, các tệp cấu hình có thể được cam kết kiểm soát phiên bản và quản trị viên hệ thống chỉ cần tạo một biến môi trường phù hợp khi hệ thống máy chủ được thiết lập. Đương nhiên, việc truy cập vào các tài khoản chạy các dịch vụ này rất hạn chế.

Đây thực sự là cách tốt nhất để tránh mật khẩu trong các tệp cấu hình văn bản thuần, hay có cách nào tốt hơn?


3
tốt, hãy nhớ rằng, nếu bạn lưu trữ nó dưới dạng một biến, nó sẽ ở dạng văn bản gốc ở cả phần còn lại và khi người dùng truy vấn nó. điều đó có nghĩa là nếu bạn mất một chút quyền kiểm soát tầng máy chủ, bạn đã trao cho kẻ tấn công mật khẩu. Tôi có thể sử dụng tiền điện tử và giải mã thông tin mật khẩu khi cần.
Frank Thomas

Suy nghĩ tốt đẹp, Frank. Nếu bạn sử dụng tiền điện tử, bạn sẽ sử dụng loại hệ thống nào? Một cái gì đó dựa trên khóa RSA / SSH, công cụ móc khóa hoặc thứ gì khác? Chúng tôi hiện đang sử dụng các hệ thống Linux> 2.6 như CentOS và Amazon.
Steve HHH

Câu trả lời:


11

Nếu bạn đang sử dụng hệ thống Linux, hãy xem / Proc / * / môi trường và quyết định xem các biến môi trường có phải là nơi tốt để lưu trữ thông tin nhạy cảm hay không. / Proc / self là quy trình hiện tại:

$ tr '\0' '\n' < /proc/self/environ
USER=me
LOGNAME=me
HOME=/home/me
PATH=/usr/bin:/bin:/usr/sbin:/sbin
MAIL=/var/mail/me
SHELL=/usr/bin/sh
SSH_CLIENT=1.2.3.4 58195 22
SSH_CONNECTION=1.2.3.4 58195 7.8.9.0 22
SSH_TTY=/dev/pts/1
TERM=xterm

Đừng bận tâm rằng điều thiết lập biến môi trường có thể là đọc một tệp ở đâu đó.

Điều cần nhớ là sử dụng mật khẩu có nghĩa là mật khẩu có sẵn cho chương trình. Nếu mật khẩu này không được cung cấp bởi người dùng gõ nó mỗi khi chương trình cần, mật khẩu đó phải được truy cập chỉ dựa trên quyền truy cập của chương trình. Bạn có thể mã hóa mật khẩu cục bộ và giải mã chương trình bằng khóa, nhưng tất cả những gì làm mờ mật khẩu chống lại việc tiết lộ ngẫu nhiên; ai đó có cùng quyền truy cập như chương trình có thể thực hiện những điều tương tự mà chương trình có thể làm, bao gồm đọc khóa mã hóa.

Cách đúng đắn để làm điều này là để ứng dụng chạy như một tài khoản bị hạn chế và lưu trữ mật khẩu trong một tệp được bảo vệ với quyền cấp độ hệ thống tệp. Hy vọng rằng bạn có thể "bao gồm" một tệp hoặc tương tự để tránh mật khẩu khỏi hệ thống kiểm soát phiên bản (giả sử VCS không có kiểm soát bảo mật). Để bảo vệ chống lại sự tiết lộ vô tình, hãy che khuất mật khẩu theo bất kỳ cách nào bạn muốn - cơ sở mã hóa 64, sử dụng pgp để mã hóa, bất cứ điều gì có ý nghĩa trong bộ tùy chọn của chương trình máy chủ của bạn. Nếu bạn đang viết một chương trình để làm điều này, thì điều tốt nhất bạn có thể làm là nhắc người dùng chỉ nhập mật khẩu khi cần, sau đó xóa mật khẩu đó khỏi bộ nhớ ngay khi sử dụng.



3
Có, một tệp có chế độ 0600 thuộc sở hữu của người dùng đang chạy chương trình có thể truy cập được bởi cùng những người có thể truy cập vào môi trường của chương trình. Nhưng, như tôi đã đề cập, môi trường có thể được cấu hình bằng cách đọc một tệp, vì vậy sao chép dữ liệu vào môi trường chỉ là tăng số lượng địa điểm có sẵn dữ liệu. Và theo mặc định, môi trường được nhân đôi thành các tiến trình con. Và một số chương trình có các phương tiện bên ngoài để truy vấn các biến môi trường, do lỗi hoặc các quyết định thiết kế có chủ ý (nghĩ phpinfo ()). Nếu một tập tin sẽ được tham gia một trong hai cách, tại sao tăng bề mặt tấn công?
dannysauer

1
Lệnh tr mà bạn đưa ra không có tác dụng với tôi - điều này đã làm:cat /proc/self/environ | tr '\0' '\n'
robocat

Tôi đang ở trong điện thoại nên rất khó để nói ... Đó phải là số Không; bạn đã gõ chữ "o" chưa?
dannysauer

8

Cuối cùng, nếu bạn có bất kỳ dữ liệu nào cần đọc cũng như viết , cuối cùng bạn sẽ bảo vệ thứ gì đó bằng mật khẩu (hoặc nếu bạn thực sự hoang tưởng, với thẻ thông minh phần cứng vật lý và mã PIN), thì không cho dù bạn có bao nhiêu lớp mã hóa.

Điều này dẫn đến câu hỏi cơ bản về bảo mật hệ thống và sự tiện lợi. Bạn có thể thêm "phòng thủ theo chiều sâu" bằng cách có rất nhiều lớp kiểm soát bảo mật mà một tác nhân độc hại sẽ phải vi phạm để có được "hàng hóa", nhưng sau đó khi một diễn viên hợp pháp muốn đọc hoặc thay đổi một số dữ liệu, họ phải trải qua một loạt các vòng. Thay thế là mật khẩu văn bản gốc trong các tập tin văn bản.

Tôi sẽ làm gì nếu tôi thực sự muốn bảo vệ một số thông tin trong một hệ thống quan trọng:

  1. Sử dụng Mã hóa toàn bộ đĩa, để nội dung của toàn bộ bộ lưu trữ liên tục được mã hóa.

  2. Hạn chế truy cập vật lý vào các máy. Khóa khung máy của máy bằng cơ chế khóa an toàn và kiểm soát truy cập vật lý vào các phím. Thuê cơ bắp (bảo vệ vũ trang) để làm người gác cổng để truy cập.

  3. Thực thi Kiểm soát truy cập bắt buộc chi tiết (MAC) trong hệ điều hành của thiết bị. Bạn có thể bắt đầu với một cái gì đó như SELinux trên GNU / Linux và đặt nó thành Thực thi, sau đó điều chỉnh chính sách theo nhu cầu chính xác của phần mềm sản xuất, cho phép các tài khoản đó chính xác (và chỉ) các quyền mà họ cần cho các tệp họ cần.

  4. Nếu bạn sắp có mật khẩu dành riêng cho hệ thống và kiểm soát phiên bản cho các tệp cấu hình, bạn thực sự muốn tránh sai lầm có thể xảy ra khi mật khẩu văn bản bị nhầm lẫn với kiểm soát phiên bản, vì khó có thể đánh lừa mật khẩu bị rò rỉ từ một Bộ nhớ cache của VCS. Biến môi trường là một trong một số lựa chọn khả thi cho điều đó. Cái còn lại là một dấu nhắc mật khẩu khi chương trình khởi động, nhưng sau đó khởi động lại máy và khôi phục trạng thái hoạt động là một nỗ lực thủ công và không thể được thực hiện một cách tự động, vì vậy có sự thuận tiện so với bảo mật một lần nữa.

  5. Hãy chắc chắn rằng bạn có các chuyên gia mạng trong tay để chăm sóc các quyền tường lửa, để giảm thiểu tiếp xúc với một cuộc tấn công qua mạng. Kiểm toán (kiểm tra thâm nhập cũng như kiểm tra mã trắng) bất kỳ phần mềm nào có giao diện với các hệ thống bên ngoài, đặc biệt là Internet công cộng. "Giao diện" không chỉ bao gồm các kết nối mạng trực tiếp mà còn đọc hoặc ghi dữ liệu "không đáng tin cậy" (dữ liệu có byte bắt nguồn từ bên ngoài RAM / đĩa / CPU của máy chủ bảo mật).

Đây không phải là một danh sách đầy đủ, nhưng đặc biệt là điểm 4 có thể phù hợp với bạn, mặc dù nếu bạn không thực hiện ít nhất các bước từ 1 đến 3, thì việc xem xét điểm 4 và điểm 5 sẽ không giúp ích cho bạn lắm, bởi vì hệ thống không an toàn ở mức khá cơ bản.


Tôi sẽ bỏ qua # 1. Nếu hệ thống đang chạy, hệ thống tập tin được gắn kết và không được mã hóa. Nếu nó không chạy, kiểm soát truy cập vật lý của bạn phải đầy đủ. Nếu nó cần được khởi động lại, bạn cần ai đó cung cấp khóa giải mã trên mỗi lần khởi động (gây phiền nhiễu) hoặc bạn cần phải có máy cung cấp điều đó - trong trường hợp đó, thông tin đăng nhập thường có sẵn cho bất kỳ ai có quyền truy cập vào ổ cứng . Hầu hết các máy "máy chủ" thường không sử dụng mã hóa ổ đĩa vì chi phí đánh đổi đó. :)
dannysauer

"Điều này dẫn đến câu hỏi cơ bản về bảo mật hệ thống và sự tiện lợi" - trích từ câu trả lời của tôi - áp dụng tương tự cho nhận xét của bạn. Bạn không thể tối đa hóa an ninh tiện lợi cùng một lúc.
allquixotic

1
# 1 rất quan trọng trong trường hợp một số đoạn ram chạm vào đĩa (hoán đổi) hoặc nếu nó chạm vào vùng ssd trở nên "xấu" sau đó và bị di chuyển khỏi HĐH nhưng vẫn giữ đoạn ram đó. ngay cả khi đĩa hiện đang được mở khóa, đoạn dữ liệu cuối cùng bị xáo trộn trên đĩa.
akira

3

Truyền mật khẩu trong một biến môi trường cũng an toàn như việc chương trình đọc nó từ một tệp. Chỉ các quy trình chạy với cùng một người dùng mới có thể đọc môi trường của một quy trình và các quy trình này được phép đọc cùng một tệp.

Lưu ý rằng điều này khác với việc truyền mật khẩu trên dòng lệnh. Đối số dòng lệnh có thể đọc được bởi tất cả các quy trình đang chạy trên cùng một máy (chặn các biện pháp làm cứng), không chỉ các quy trình đang chạy như cùng một người dùng.

Nếu bạn chuyển một biến qua môi trường, hãy cẩn thận nếu chương trình khởi chạy các chương trình khác. Những chương trình khác sẽ kế thừa môi trường của cha mẹ họ. Vì vậy, đừng làm điều này nếu bạn sợ rằng các chương trình khác có thể vô tình làm rò rỉ nội dung trong môi trường của chúng.

Lỗ hổng trong kịch bản của bạn là có thể tạo ra một biến môi trường phù hợp khi hệ thống máy chủ được thiết lập. Một biến môi trường là một thuộc tính động của một quá trình. Bạn không thể tạo nó khi thiết lập một hệ thống, không phải nếu thiết lập bạn có nghĩa là một cái gì đó còn tồn tại khi khởi động lại. Ý bạn là có lẽ là quản trị viên đã sắp xếp cho biến này có mặt trong môi trường khi một người dùng nào đó đăng nhập. Điều này được thực hiện thông qua tệp cấu hình (thường ~/.pam_environmenthoặc ~/.profilehoặc một tệp được đọc từ đó ~/.profile). Vì vậy, trên thực tế, giải pháp này không di chuyển mật khẩu ra khỏi các tệp cấu hình.

Thiết lập mọi thứ để mật khẩu trong môi trường thời gian đăng nhập của người dùng không phải là một ý tưởng hay. Điều đó có nghĩa là mọi quy trình đang chạy vì người dùng đó sẽ có bí mật, do đó, nó dễ bị rò rỉ ở bất cứ đâu.

Mật khẩu phải được đặt trong một tệp nằm ngoài các tệp cấu hình nằm dưới sự kiểm soát phiên bản và từ các cơ chế triển khai thông thường. Bạn có thể đặt mật khẩu vào môi trường vào một lúc nào đó nếu thuận tiện, nhưng nên thực hiện với một bộ chương trình nhỏ nhất có thể.

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.