Vấn đề Docker và bảo mật mật khẩu
Tôi đã thử nghiệm với Docker gần đây về xây dựng một số dịch vụ để chơi xung quanh với và một điều mà giữ nagging tôi đã được đặt mật khẩu trong một Dockerfile. Tôi là một nhà phát triển để lưu trữ mật khẩu trong nguồn cảm thấy như một cú đấm vào mặt. Điều này có nên là một mối quan ngại không? Có bất kỳ quy ước tốt nào về cách xử lý mật khẩu trong Dockerfiles không?
Có một vấn đề mở trên Github yêu cầu thực hành tốt nhất liên quan đến Docker và bí mật, vấn đề là ở đây: github.com/docker/docker/issues/13490 - Luís Bianchin.
Các câu trả lời:
Chắc chắn nó là một mối quan tâm. Dockerfiles thường được đăng ký vào kho và chia sẻ với người khác. Cách khác là cung cấp mọi thông tin đăng nhập (tên người dùng, mật khẩu, mã thông báo, bất kỳ điều gì nhạy cảm) dưới dạng biến môi trường khi chạy. Điều này có thể thông qua -e
đối số (đối với các vars cá nhân trên CLI) hoặc --env-file
đối số (cho nhiều biến trong một tệp) docker run
.
Sử dụng --env-file
chắc chắn là một lựa chọn an toàn hơn vì điều này bảo vệ chống lại những bí mật hiển thị trong ps
hoặc trong nhật ký nếu người dùng sử dụng set -x
.
Tuy nhiên, env vars không đặc biệt an toàn. Chúng hiển thị qua docker inspect
và do đó chúng có sẵn cho bất kỳ người dùng nào có thể chạy docker
lệnh. (Tất nhiên, bất kỳ người dùng nào có quyền truy cập vào docker
trên máy chủ cũng có gốc dù sao.)
Mẫu ưa thích của tôi là sử dụng tập lệnh trình bao bọc làm ENTRYPOINT
hoặc là CMD
. Kịch bản trình bao bọc đầu tiên có thể nhập các bí mật từ một vị trí bên ngoài vào vùng chứa trong thời gian chạy, sau đó thực thi ứng dụng, cung cấp các bí mật. Cơ chế chính xác của điều này thay đổi dựa trên môi trường thời gian chạy của bạn. Trong AWS, bạn có thể sử dụng kết hợp các vai trò IAM, Dịch vụ quản lý khóavà S3 để lưu trữ bí mật được mã hóa trong thùng S3. Cái gì đó như HashiCorp Vault hoặc là credstash là một lựa chọn khác.
AFAIK không có mẫu tối ưu để sử dụng dữ liệu nhạy cảm như một phần của quá trình xây dựng. Trong thực tế, tôi có một SO câu hỏi về chủ đề này. Bạn có thể dùng người xếp dỡ để xóa lớp khỏi hình ảnh. Nhưng không có chức năng gốc trong Docker cho mục đích này.
Bạn có thể tìm thấy shykes nhận xét về cấu hình trong vùng chứa hữu ích.
Nhóm của chúng tôi tránh đặt thông tin đăng nhập vào kho, vì vậy điều đó có nghĩa là chúng không được phép trong Dockerfile
. Thực hành tốt nhất của chúng tôi trong các ứng dụng là sử dụng tín dụng từ các biến môi trường.
Chúng tôi giải quyết vấn đề này bằng cách sử dụng docker-compose
.
Trong docker-compose.yml
, bạn có thể chỉ định tệp có chứa biến môi trường cho vùng chứa:
env_file:
- .env
Đảm bảo thêm .env
đến .gitignore
, sau đó đặt thông tin xác thực trong .env
tệp như:
SOME_USERNAME=myUser
SOME_PWD_VAR=myPwd
Lưu trữ .env
tập tin cục bộ hoặc ở một vị trí an toàn, nơi phần còn lại của nhóm có thể lấy nó.
Xem: https://docs.docker.com/compose/environment-variables/#/the-env-file
Bạn không bao giờ nên thêm thông tin đăng nhập vào vùng chứa trừ khi bạn OK phát tín hiệu cho bất kỳ ai có thể tải xuống hình ảnh. Đặc biệt, làm và ADD creds
và sau đó RUN rm creds
không an toàn vì tệp tin creds vẫn ở hình ảnh cuối cùng trong lớp hệ thống tệp trung gian. Thật dễ dàng cho bất kỳ ai có quyền truy cập vào hình ảnh để trích xuất hình ảnh đó.
Các giải pháp điển hình tôi đã nhìn thấy khi bạn cần creds để kiểm tra phụ thuộc và như vậy là sử dụng một container để xây dựng khác. Nghĩa là, thông thường bạn có một số môi trường xây dựng trong vùng chứa cơ sở của mình và bạn cần phải gọi điều đó để tạo vùng chứa ứng dụng của mình. Vì vậy, giải pháp đơn giản là thêm nguồn ứng dụng của bạn và sau đó RUN
các lệnh xây dựng. Điều này là không an toàn nếu bạn cần sự tín nhiệm trong đó RUN
. Thay vào đó, những gì bạn làm là đặt nguồn của bạn vào một thư mục cục bộ, chạy (như trong docker run
) vùng chứa để thực hiện bước xây dựng với thư mục nguồn cục bộ được gắn kết dưới dạng ổ đĩa và các tín hiệu được bơm hoặc được gắn kết như một ổ đĩa khác. Khi bước xây dựng hoàn tất, bạn xây dựng vùng chứa cuối cùng của mình bằng cách đơn giản ADD
ing thư mục nguồn cục bộ hiện chứa các tạo phẩm được xây dựng.
Tôi hy vọng Docker thêm một số tính năng để đơn giản hóa tất cả điều này!
Cập nhật: trông giống như phương thức tiếp theo sẽ có các bản dựng lồng nhau. Tóm lại, dockerfile sẽ mô tả một container đầu tiên được sử dụng để xây dựng môi trường thời gian chạy và sau đó là một build container lồng nhau thứ hai có thể lắp ráp tất cả các mảnh vào trong thùng chứa cuối cùng. Bằng cách này, công cụ xây dựng thời gian không nằm trong vùng chứa thứ hai. Đây là một ứng dụng Java, nơi bạn cần JDK để xây dựng ứng dụng nhưng chỉ có JRE để chạy nó. Có một số đề xuất được thảo luận, tốt nhất để bắt đầu từ https://github.com/docker/docker/issues/7115 và làm theo một số liên kết cho các đề xuất thay thế.
Với Docker v1.9 bạn có thể dùng Hướng dẫn ARG để tìm nạp các đối số được truyền bởi dòng lệnh tới hình ảnh trên xây dựng hành động. Đơn giản chỉ cần sử dụng --build-arg cờ. Vì vậy, bạn có thể tránh để giữ cho mật khẩu rõ ràng (hoặc thông tin hợp lý khác) trên Dockerfile và vượt qua chúng trên bay.
nguồn: https://docs.docker.com/engine/reference/commandline/build/ http://docs.docker.com/engine/reference/builder/#arg
Thí dụ:
Dockerfile
FROM busybox
ARG user
RUN echo "user is $user"
xây dựng lệnh hình ảnh
docker build --build-arg user=capuccino -t test_arguments -f path/to/dockerfile .
trong khi xây dựng nó in
$ docker build --build-arg user=capuccino -t test_arguments -f ./test_args.Dockerfile .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM busybox
---> c51f86c28340
Step 2 : ARG user
---> Running in 43a4aa0e421d
---> f0359070fc8f
Removing intermediate container 43a4aa0e421d
Step 3 : RUN echo "user is $user"
---> Running in 4360fb10d46a
**user is capuccino**
---> 1408147c1cb9
Removing intermediate container 4360fb10d46a
Successfully built 1408147c1cb9
Hy vọng nó giúp! Tạm biệt.
Để thay thế cho việc sử dụng các biến môi trường, điều này có thể lộn xộn nếu bạn có nhiều thứ trong số đó, là sử dụng khối lượng để tạo một thư mục trên máy chủ có thể truy cập trong vùng chứa.
Nếu bạn đặt tất cả thông tin đăng nhập của mình dưới dạng tệp trong thư mục đó, khi đó vùng chứa có thể đọc tệp và sử dụng chúng như mong muốn.
Ví dụ:
$ echo "secret" > /root/configs/password.txt
$ docker run -v /root/configs:/cfg ...
In the Docker container:
# echo Password is `cat /cfg/password.txt`
Password is secret
Nhiều chương trình có thể đọc thông tin đăng nhập của họ từ một tệp riêng biệt, vì vậy theo cách này, bạn có thể trỏ chương trình đến một trong các tệp.
Cách tiếp cận của tôi dường như hoạt động, nhưng có lẽ là ngây thơ. Cho tôi biết tại sao nó sai.
Các ARG được thiết lập trong quá trình xây dựng docker được tiếp xúc bởi tiểu sử lịch sử, do đó không đi đến đó. Tuy nhiên, khi chạy một thùng chứa, các biến môi trường được đưa ra trong lệnh chạy có sẵn cho vùng chứa, nhưng không phải là một phần của hình ảnh.
Vì vậy, trong Dockerfile, hãy thiết lập không liên quan đến dữ liệu bí mật. Đặt CMD giống như /root/finish.sh
. Trong lệnh chạy, sử dụng các biến môi trường để gửi dữ liệu bí mật vào vùng chứa. finish.sh
sử dụng các biến cơ bản để hoàn thành các tác vụ xây dựng.
Để quản lý dữ liệu bí mật dễ dàng hơn, hãy đặt nó vào một tệp được trình docker nạp bằng --env-file
công tắc điện. Tất nhiên, giữ bí mật tập tin. .gitignore
và như vậy.
Cho tôi, finish.sh
chạy chương trình Python. Nó kiểm tra để đảm bảo rằng nó chưa chạy trước đó, sau đó kết thúc quá trình thiết lập (ví dụ: sao chép tên cơ sở dữ liệu vào Django's settings.py
).
Trong khi tôi hoàn toàn đồng ý thì không có giải pháp đơn giản nào. Có tiếp tục là một điểm thất bại duy nhất. Hoặc là dockerfile, vvd, v.v. Apcera có một kế hoạch trông giống như sidekick - xác thực kép. Nói cách khác, hai thùng chứa không thể nói trừ khi có quy tắc cấu hình Apcera. Trong bản demo của họ, uid / pwd đã ở trong tình trạng rõ ràng và không thể được tái sử dụng cho đến khi quản trị viên cấu hình liên kết. Để làm việc này, tuy nhiên, nó có thể có nghĩa là vá Docker hoặc ít nhất là các plugin mạng (nếu có một điều như vậy).
Có một lệnh docker mới [1] để quản lý "bí mật", nhưng nó chỉ hoạt động cho các cụm đám đông.
docker service create
--name my-iis
--publish target=8000,port=8000
--secret src=homepage,target="\inetpub\wwwroot\index.html"
microsoft/iis:nanoserver
giải pháp chỉ thời gian chạy
docker-compose cũng cung cấp một giải pháp chế độ không swarm (kể từ v1.11: Bí mật sử dụng gắn kết gắn kết).
Các bí mật được gắn dưới dạng tệp bên dưới /run/secrets/
bởi docker-compose. Điều này giải quyết vấn đề tại thời gian chạy (chạy container), nhưng không phải lúc xây dựng (xây dựng hình ảnh), bởi vì /run/secrets/
không được gắn ở thời gian xây dựng. Hơn nữa hành vi này phụ thuộc vào việc chạy container với docker-compose.
Thí dụ:
Dockerfile
FROM alpine
RUN cat /run/secrets/password
CMD sleep inifinity
docker-compose.yml
version: '3.1'
services:
app:
build: .
secrets:
- password
secrets:
password:
file: password.txt
Để xây dựng, thực hiện:
docker-compose up -d
Đọc thêm:
Các Phương pháp ứng dụng 12 yếu tố cho biết, mọi cấu hình sẽ được lưu trữ trong các biến môi trường.
Docker soạn có thể làm thay thế biến trong cấu hình, do đó có thể được sử dụng để chuyển mật khẩu từ máy chủ đến trình docker.
(Dịch tự động bởi: paginaswebpublicidad )
Có thể bạn quan tâm:
Hướng dẫn tạo webserver với Google Cloud free, cài đặt Kloxo lên ...
in dễ dàng, mọi lúc, mọi nơi với Google Cloud Print
Hướng dẫn tạo webserver với Azure Cloud free, cài đặt Kloxo lên ...
Làm thế nào để chuỗi cung ứng không bị hack?
Hack khách hàng của Facebook Fanpage
Tớ đã hack trang SinhVienIT. net như thế nào?
Tại sao app Facebook lại có id là Katana (kiếm Nhật)
How to Disable Directory Listing on Your Web Server
Mật khẩu mặc định của các camera an ninh thông dụng trên thị trường
Bảo vệ bản thân trên mạng xã hội
Cách chặn và report tin nhắn spam trên Facebook
Mách bạn cách "triệt" tin nhắn rác, quảng cáo hiệu quả
Top Free and Open Source Email Marketing Software
Điện thoại thông minh (smartphone) là gì?
Giới thiệu nền tảng hệ điều hành (OS) trên điện thoại
DVMS chuyên:
- Tư vấn, xây dựng, chuyển giao công nghệ Blockchain, mạng xã hội,...
- Tư vấn ứng dụng cho smartphone và máy tính bảng, tư vấn ứng dụng vận tải thông minh, thực tế ảo, game mobile,...
- Tư vấn các hệ thống theo mô hình kinh tế chia sẻ như Uber, Grab, ứng dụng giúp việc,...
- Xây dựng các giải pháp quản lý vận tải, quản lý xe công vụ, quản lý xe doanh nghiệp, phần mềm và ứng dụng logistics, kho vận, vé xe điện tử,...
- Tư vấn và xây dựng mạng xã hội, tư vấn giải pháp CNTT cho doanh nghiệp, startup,...
Vì sao chọn DVMS?
- DVMS nắm vững nhiều công nghệ phần mềm, mạng và viễn thông. Như Payment gateway, SMS gateway, GIS, VOIP, iOS, Android, Blackberry, Windows Phone, cloud computing,…
- DVMS có kinh nghiệm triển khai các hệ thống trên các nền tảng điện toán đám mây nổi tiếng như Google, Amazon, Microsoft,…
- DVMS có kinh nghiệm thực tế tư vấn, xây dựng, triển khai, chuyển giao, gia công các giải pháp phần mềm cho khách hàng Việt Nam, USA, Singapore, Germany, France, các tập đoàn của nước ngoài tại Việt Nam,…
Quý khách xem Hồ sơ năng lực của DVMS tại đây >>
Quý khách gửi yêu cầu tư vấn và báo giá tại đây >>