Cách kiểm tra bảo mật server Docker với Docker Bench cho bảo mật trên Ubuntu 16.04
Sử dụng Docker để chứa các ứng dụng và dịch vụ của bạn có thể mang lại cho bạn một số lợi ích bảo mật, nhưng cài đặt Docker mặc định vẫn có chỗ cho một số cải tiến cấu hình liên quan đến bảo mật. Trung tâm Bảo mật Internet , một tổ chức phi lợi nhuận có nhiệm vụ quảng bá các phương pháp hay nhất về bảo mật internet, đã tạo danh sách kiểm tra từng bước để bảo mật Docker . Sau đó, group Docker đã phát hành một công cụ kiểm tra bảo mật - Docker Bench for Security - để chạy qua danh sách kiểm tra này trên server Docker và gắn cờ bất kỳ vấn đề nào mà nó tìm thấy.Trong hướng dẫn này, ta sẽ cài đặt Docker Bench for Security, sau đó sử dụng nó để đánh giá trạng thái bảo mật của cài đặt Docker mặc định (từ repository Docker chính thức) trên server Ubuntu 16.04. Sau đó, ta sẽ khắc phục một số vấn đề mà nó cảnh báo cho ta .
Các bản sửa lỗi của ta chủ yếu bao gồm hai bản cập nhật cấu hình sau:
- Cài đặt
auditd
và cài đặt các luật kiểm tra cho daemon Docker và các file liên quan của nó - Cập nhật file cấu hình
daemon.json
của Docker
Ta sẽ không đi sâu vào bất kỳ chi tiết nào về việc tạo các containers an toàn, ta sẽ chỉ tập trung vào các bản cập nhật cho bảo mật server Docker trong hướng dẫn này.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần những thứ sau:
- Server Ubuntu 16.04 với user không root, đã kích hoạt sudo. Bạn có thể tìm hiểu cách cài đặt điều này với hướng dẫn Cài đặt server ban đầu với Ubuntu 16.04 của ta
- Docker được cài đặt từ repository Docker chính thức, như được đề cập trong Cách cài đặt và sử dụng Docker trên Ubuntu 16.04 . Đảm bảo cấp cho user không phải root của bạn quyền truy cập vào Docker bằng cách thêm nó vào group docker . Điều này được đề cập trong Bước 2 của hướng dẫn.
Bước 1 - Cài đặt Docker Bench Security
Để bắt đầu, hãy SSH vào server Docker với quyền là user không phải root của bạn.
Trước tiên, ta sẽ sao chép tập lệnh Docker Bench for Security vào server bằng git
, sau đó chạy tập lệnh trực tiếp từ repository đã nhân bản.
Điều hướng đến một folder mà user của bạn có thể ghi vào. Trong ví dụ này, ta sẽ tải tập lệnh xuống folder chính của user :
- cd ~
Sau đó sao chép repository Git docker-bench-security
:
- git clone https://github.com/docker/docker-bench-security.git
Thao tác này sẽ kéo tất cả các file từ repo và đặt chúng vào folder docker-bench-security
local . Tiếp theo, chuyển vào folder kết quả này:
- cd docker-bench-security
Cuối cùng, để thực hiện kiểm tra bảo mật, hãy chạy tập lệnh docker-bench-security.sh
:
- ./docker-bench-security.sh
Output# ------------------------------------------------------------------------------ # Docker Bench for Security v1.3.4 # # Docker, Inc. (c) 2015- # # Checks for dozens of common best-practices around deploying Docker containers in production. # Inspired by the CIS Docker Community Edition Benchmark v1.1.0. # ------------------------------------------------------------------------------ Initializing Tue Jun 5 18:59:11 UTC 2018 [INFO] 1 - Host Configuration [WARN] 1.1 - Ensure a separate partition for containers has been created [NOTE] 1.2 - Ensure the container host has been Hardened [INFO] 1.3 - Ensure Docker is up to date [INFO] * Using 18.03.1, verify is it up to date as deemed necessary . . .
Tập lệnh chạy qua nhiều bài kiểm tra khác nhau và đưa ra kết quả INFO
, NOTE
, PASS
hoặc WARN
cho mỗi bài kiểm tra. Cài đặt Docker mặc định trên Ubuntu 16.04 sẽ vượt qua nhiều bài kiểm tra này, nhưng sẽ hiển thị một số cảnh báo trong phần 1,2 và 4.
Trong phần còn lại của hướng dẫn này, ta sẽ giải quyết những cảnh báo này bằng cách bảo mật cài đặt Docker của ta .
Bước 2 - Chỉnh sửa cảnh báo cấu hình server
Phần đầu tiên của bài kiểm tra kiểm tra cấu hình hệ điều hành của server lưu trữ của bạn, bao gồm việc tăng cường độ cứng, các version gói và cấu hình kiểm tra. Hãy xem các bài kiểm tra trong phần này:
1.1 Đảm bảo một phân vùng riêng cho các containers đã được tạo
Để đảm bảo cách ly thích hợp, bạn nên giữ các containers Docker và tất cả /var/lib/docker
trên phân vùng hệ thống file của riêng chúng. Điều này có thể khó khăn trong một số tình huống lưu trữ cloud mà bạn có thể không có khả năng phân vùng ổ đĩa. Trong những trường hợp này, bạn có thể đáp ứng thử nghiệm này bằng cách di chuyển folder dữ liệu của Docker sang thiết bị khối gắn mạng bên ngoài.
- Để tìm hiểu cách phân vùng ổ đĩa, hãy xem Cách phân vùng và định dạng thiết bị lưu trữ trong Linux .
- Để gắn block storage device vào DigitalOcean Server, hãy đọc Giới thiệu về Lưu trữ khối DigitalOcean .
- Để tìm hiểu cách mount các block storage device trên các nền tảng cloud khác, hãy tham khảo tài liệu của nhà cung cấp của bạn.
1.2 Đảm bảo server chứa đã được củng cố
Bài kiểm tra này chỉ là một lưu ý để nhắc nhở bạn xem xét việc củng cố server của bạn. Việc củng cố thường bao gồm việc cài đặt firewall , khóa các dịch vụ khác nhau, cài đặt kiểm tra và ghi log cũng như thực hiện các biện pháp bảo mật khác. Bạn có thể bắt đầu với việc này bằng cách đọc 7 Biện pháp An ninh để Bảo vệ Server của Bạn .
1.3 Đảm bảo Docker được cập nhật
Thử nghiệm này in ra version Docker của bạn. Bạn có thể kiểm tra version nào là bản phát hành ổn định hiện tại bằng cách truy cập ghi chú phát hành Docker CE . Nếu bạn chưa cập nhật và bạn đã cài đặt Docker bằng apt-get install
, bạn có thể sử dụng lại apt-get
để nâng cấp gói Docker:
- sudo apt-get update
- sudo apt-get upgrade
1.4 Đảm bảo chỉ những user tin cậy mới được phép kiểm soát daemon Docker
Trong hướng dẫn cài đặt Docker yêu cầu , ta đã thêm user không phải root của bạn vào group docker để cấp cho nó quyền truy cập vào daemon Docker. Kiểm tra này xuất ra dòng của group docker từ file /etc/group
:
Outputdocker:x:999:sammy
Dòng này hiển thị tất cả user có trong group docker . Xem lại dòng và đảm bảo chỉ những user thích hợp mới được phép kiểm soát daemon Docker. Trong ví dụ trên, sammy user được ủy quyền của ta được đánh dấu. Để xóa user khỏi group này, bạn có thể sử dụng gpasswd
:
- gpasswd -d username docker
1.5–1.13 Đảm bảo kiểm tra được cấu hình cho các file Docker khác nhau
Ta cần cài đặt và cấu hình auditd
để cho phép kiểm tra một số file , folder và socket của Docker. Auditd là một hệ thống con kế toán và giám sát truy cập Linux ghi lại các hoạt động hệ thống đáng chú ý ở cấp kernel .
Cài đặt auditd
với apt-get
:
- sudo apt-get install auditd
Thao tác này sẽ cài đặt và khởi động trình auditd
. Bây giờ ta sẽ cấu hình auditd
để giám sát các file và folder Docker. Trong editor , hãy mở file luật kiểm tra:
- sudo nano /etc/audit/audit.rules
Bạn sẽ thấy văn bản sau:
# This file contains the auditctl rules that are loaded # whenever the audit daemon is started via the initscripts. # The rules are simply the parameters that would be passed # to auditctl. # First rule - delete all -D # Increase the buffers to survive stress events. # Make this bigger for busy systems -b 320 # Feel free to add below this line. See auditctl man page
Dán đoạn mã sau vào cuối file , sau đó lưu và thoát khỏi editor :
-w /usr/bin/docker -p wa -w /var/lib/docker -p wa -w /etc/docker -p wa -w /lib/systemd/system/docker.service -p wa -w /lib/systemd/system/docker.socket -p wa -w /etc/default/docker -p wa -w /etc/docker/daemon.json -p wa -w /usr/bin/docker-containerd -p wa -w /usr/bin/docker-runc -p wa
Các luật này hướng dẫn Auditd xem ( -w
) file hoặc folder được chỉ định và ghi lại mọi thay đổi thuộc tính hoặc ghi ( -p wa
) đối với các file đó.
Khởi động lại auditd
để các thay đổi có hiệu lực:
- sudo systemctl restart auditd
Đến đây, bạn đã cấu hình thành công auditd
để xem các file và folder Docker để tìm các thay đổi đáng ngờ. Bạn có thể chạy lại tập lệnh Docker Bench for Security để xác nhận các bài kiểm tra trong Phần 1 hiện đã vượt qua.
Để biết thêm thông tin về auditd
, bạn có thể đọc hướng dẫn Cách sử dụng Hệ thống Kiểm toán Linux trên CentOS 7 của ta . Mặc dù được viết cho CentOS, các phần về cấu hình và sử dụng hệ thống kiểm tra áp dụng như nhau cho Ubuntu.
Bây giờ ta đã xác minh cấu hình server của bạn , ta sẽ chuyển sang Phần 2 của kiểm tra bảo mật Docker, cấu hình daemon Docker.
Bước 3 - Sửa cảnh báo cấu hình Docker Daemon
Phần này của kiểm tra liên quan đến cấu hình của daemon Docker. Tất cả các cảnh báo này đều có thể được giải quyết bằng cách tạo file cấu hình cho daemon có tên daemon.json
, daemon.json
này ta sẽ thêm một số tham số cấu hình liên quan đến bảo mật. Trước tiên, ta sẽ tạo và lưu file cấu hình này, sau đó lần lượt xem lại các bài kiểm tra và các dòng tương ứng trong cấu hình.
Để bắt đầu, hãy mở file cấu hình trong editor yêu thích của bạn:
- sudo nano /etc/docker/daemon.json
Điều này sẽ hiển thị cho bạn một file văn bản trống. Dán vào phần sau:
{ "icc": false, "userns-remap": "default", "log-driver": "syslog", "disable-legacy-registry": true, "live-restore": true, "userland-proxy": false, "no-new-privileges": true }
Lưu file , sau đó khởi động lại trình Docker để nó chọn cấu hình mới này:
- sudo systemctl restart docker
Đến đây bạn có thể chạy lại kiểm tra để xác nhận tất cả các cảnh báo Phần 2 đã được giải quyết.
Các biến cấu hình mà ta đã chèn vào file này được sắp xếp theo thứ tự giống như các cảnh báo kiểm tra. Hãy xem xét từng người trong số họ:
2.1 Đảm bảo lưu lượng mạng bị hạn chế giữa các containers trên cầu nối mặc định
Cảnh báo này được giải quyết bằng "icc": false
trong file cấu hình. Cấu hình này tạo các containers chỉ có thể giao tiếp với nhau khi được liên kết rõ ràng bằng cách sử dụng --link= container_name
trên dòng lệnh Docker hoặc tham số links:
trong file cấu hình Docker Compose. Một lợi ích của việc này là nếu kẻ tấn công xâm phạm một containers , chúng sẽ gặp khó khăn hơn trong việc tìm kiếm và tấn công các containers khác trên cùng một server .
2.8 Bật hỗ trợ vùng tên user
Không gian tên Linux cung cấp sự cách ly bổ sung cho các quy trình chạy trong containers của bạn. Ánh xạ lại không gian tên user cho phép các quy trình chạy dưới quyền root trong containers trong khi được ánh xạ lại cho user ít quyền hơn trên server . Ta cho phép ánh xạ lại không gian tên user với dòng "userns-remap": "default"
trong file cấu hình.
Ta đặt tham số thành default
, nghĩa là Docker sẽ tạo một user dockremap mà user containers sẽ được ánh xạ lại. Bạn có thể xác minh user dockremap đã được tạo bằng lệnh id
:
- sudo id dockremap
Bạn sẽ thấy kết quả tương tự như sau:
Outputuid=112(dockremap) gid=116(dockremap) groups=116(dockremap)
Nếu ánh xạ lại user containers thành một user server lưu trữ khác có ý nghĩa hơn đối với trường hợp sử dụng của bạn, hãy chỉ định kết hợp user hoặc user:group
ở vị trí default
trong file cấu hình.
Cảnh báo: Ánh xạ lại user là một tính năng mạnh mẽ có thể gây ra gián đoạn và hỏng hóc nếu được cấu hình không đúng, vì vậy bạn nên đọc tài liệu chính thức và lưu ý các tác động trước khi thực hiện thay đổi này trong cài đặt production .
2.11 Đảm bảo rằng ủy quyền cho các lệnh client Docker được bật
Nếu bạn cần cho phép truy cập mạng vào Docker socket, bạn nên tham khảo tài liệu Docker chính thức để tìm hiểu cách cài đặt các certificate và khóa cần thiết để thực hiện việc này một cách an toàn.
Ta sẽ không đề cập đến quá trình này ở đây, bởi vì các chi tiết cụ thể phụ thuộc quá nhiều vào các tình huống cá nhân. Quá trình kiểm tra sẽ tiếp tục gắn cờ kiểm tra này là WARN
, mặc dù quyền truy cập vào socket Docker chỉ local mặc định được bảo vệ bằng cách yêu cầu tư cách thành viên trong group docker để có thể bỏ qua điều này một cách an toàn.
2.12 Đảm bảo ghi log tập trung và từ xa được cấu hình
Trong file cấu hình daemon Docker, ta đã bật tính năng ghi log hệ thống tiêu chuẩn với dòng "log-driver": "syslog"
. Sau đó, bạn nên cấu hình log hệ thống để chuyển tiếp log đến server log hệ thống tập trung. Điều này giúp đăng xuất khỏi server Docker và tránh xa bất kỳ kẻ tấn công nào có thể thay đổi hoặc xóa chúng.
Nếu bạn chỉ muốn chuyển tiếp log Docker và không muốn gửi log hệ thống, bạn có thể chỉ định server log hệ thống từ xa trong file cấu hình Docker bằng cách thêm thông số sau vào file :
`"log-opts": { "syslog-address": "udp://198.51.100.33:514" }`
Đảm bảo thay thế địa chỉ IP bằng địa chỉ server log hệ thống của bạn .
Cách khác, bạn có thể chỉ định một tài xế log như splunk
hoặc fluentd
xuất xưởng Docker log daemon sử dụng dịch vụ đăng nhập tập hợp khác. Để biết thêm thông tin về trình điều khiển log Docker và cấu hình của chúng, hãy tham khảo tài liệu chính thức về trình điều khiển ghi log Docker .
2.13 Đảm bảo các hoạt động trên register kế thừa (v1) bị vô hiệu hóa
Cảnh báo này được khắc phục bằng dòng "disable-legacy-registry": true
trong file cấu hình daemon. Điều này vô hiệu hóa một giao thức đăng ký hình ảnh kế thừa không an toàn. Vì hỗ trợ cho giao thức này đã bị xóa khỏi trình Docker, cờ này đang trong quá trình không được dùng nữa.
2.14 Đảm bảo đã bật khôi phục trực tiếp
Bằng cách chỉ định "live-restore": true
trong cấu hình daemon, ta cho phép các containers tiếp tục chạy khi không có trình Docker. Điều này cải thiện thời gian hoạt động của containers trong quá trình cập nhật hệ thống server lưu trữ và các vấn đề ổn định khác.
2.15 Đảm bảo Userland Proxy bị tắt
Dòng "userland-proxy": false
sẽ sửa cảnh báo này. Thao tác này sẽ vô hiệu hóa quy trình domain đất user docker-proxy
theo mặc định xử lý các cổng server chuyển tiếp đến containers và thay thế nó bằng luật iptables
. Nếu có sẵn hairpin NAT, proxy vùng user không cần thiết và nên tắt để giảm bề mặt tấn công của server của bạn.
2.18 Đảm bảo các containers bị hạn chế nhận các quyền mới
Dòng "no-new-privileges": true
trong cấu hình daemon ngăn chặn leo thang quyền từ bên trong các containers . Điều này đảm bảo các containers không thể nhận được các quyền mới bằng cách sử dụng mã binary setuid
hoặc setgid
.
Bây giờ ta đã cập nhật cấu hình daemon Docker, hãy khắc phục một cảnh báo còn lại trong phần bốn của kiểm tra.
Bước 4 - Bật Tin cậy Nội dung
Bài kiểm tra cuối cùng được kiểm tra của ta gắn cờ là 4.5 Ensure Content trust for Docker is Enabled
. Tin cậy nội dung là một hệ thống để ký Docker image và xác minh chữ ký của chúng trước khi chạy chúng. Ta có thể kích hoạt tin cậy nội dung với biến môi trường DOCKER_CONTENT_TRUST
.
Để đặt biến này cho phiên shell hiện tại của bạn, hãy nhập thông tin sau vào shell:
- export DOCKER_CONTENT_TRUST=1
Chạy kiểm tra sau lệnh export
này sẽ cho thấy Tin cậy nội dung đã được bật và xóa cảnh báo này. Để tự động bật tính năng này cho tất cả user và tất cả các phiên, hãy thêm biến DOCKER_CONTENT_TRUST
vào DOCKER_CONTENT_TRUST
/etc/environment
, đây là file để gán các biến môi trường trên toàn hệ thống:
- echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment
Bạn có thể tìm thấy thêm thông tin về Docker Content Trust trong tài liệu chính thức về Docker Content Trust .
Đến đây, ta đã giải quyết tất cả các cảnh báo được gắn cờ bởi tập lệnh Docker Bench for Security. Như vậy, ta có một server Docker an toàn hơn để chạy các containers .
Kết luận
Trong hướng dẫn này, ta đã cài đặt tập lệnh Docker Bench for Security, sử dụng tập lệnh này để kiểm tra tính bảo mật của cài đặt Docker của ta và giải quyết các cảnh báo bằng cách cài đặt và cấu hình auditd
và file cấu hình của Docker daemon.
Sau khi hoàn thành hướng dẫn này, việc chạy tập lệnh kiểm tra sẽ dẫn đến rất ít lỗi hoặc cảnh báo. Bạn cũng nên hiểu và có lý do chính đáng để bỏ qua những lỗi vẫn tồn tại.
Để biết thêm thông tin về các tùy chọn cấu hình bảo mật Docker, vui lòng tham khảo tài liệu Docker và xem các liên kết đến các phần phụ cụ thể của tài liệu, có trong suốt hướng dẫn này.
Các tin liên quan
Cách cung cấp và quản lý server Docker từ xa bằng Máy Docker trên Ubuntu 16.042018-05-21
Cách cung cấp và quản lý server Docker từ xa bằng Máy Docker trên CentOS 7
2018-05-21
Cách quản lý và giám sát các container Docker có khô trên Ubuntu 16.04
2018-04-25
Cách tạo image Docker và lưu trữ kho lưu trữ image Docker với GitLab
2018-02-12
3 Mẹo để Đặt tên container Docker
2018-01-04
3 Mẹo để Đặt tên container Docker
2018-01-04
Cách cài đặt Docker Compose trên Ubuntu 16.04
2017-12-21
Cách sử dụng Traefik làm Reverse Proxy cho Docker Containers trên Ubuntu 16.04
2017-09-08
Cách tập trung log Docker của bạn với Fluentd và ElasticSearch trên Ubuntu 16.04
2016-12-16
Cách làm việc với Docker Data Volumes trên Ubuntu 14.04
2016-11-17