Docker có thực sự an toàn?
1. Docker là gì?
2. Các thành phần chính của Docker:
Docker Image là một read-only template giúp bạn tạo một container có thể chạy được trên nền tảng Docker. Template này giúp bạn dễ dàng hơn trong việc đóng gói ứng dụng và cấu hình sẵn môi trường cho server để có thể sử dụng hoặc là chia sẻ cho những người dùng Docker khác.
3. Tính độc lập của Docker
Linux Cgroups là một trong những tính năng được cung cấp bởi Linux giúp cho Docker có khả năng tự cô lập. Cgroups cho phép chúng ta nhóm những tiến tình liên quan lại với nhau và quản lý các nhóm tiến trình đó trong quá trình chúng sử dụng CPU, bộ nhớ hay là I/O. Cgroups có quyền kiểm soát việc phân bổ, quản lý và giám sát tài nguyên hệ thống, phân chia tài nguyên phần cứng cho các tác vụ và người dùng để tăng hiệu quả.
4. Docker có an toàn không?
Hầu hết các newbie developer đều cho rằng Docker tuyệt đối an toàn, họ có thể pull Docker image từ DockerHub và chạy nó mà không cần quan tâm rằng ai là người push image đó lên hoặc không quan tâm đến tính xác thực của image. Docker không bảo mật giống như máy ảo, bởi chúng ta không thể tương tác trực tiếp với kernel, không có quyền truy cập vào các file hệ thống như /sys và sys/fs,proc/*.
Docker Security: https://docs.docker.com/engine/security/
5. Tấn công bề mặt Docker container:
Nếu kẻ tấn công là người có thể khởi động container (có quyền truy cập tới Docker API) thì ngay lập tức hắn ta có quyền của một root để truy cập tới host.
Nếu kẻ tấn công có được quyền quản lý bên trong container thì bạn sẽ gặp rắc rối, bởi hắn ta có thể thực hiện các lệnh làm ảnh hưởng đến host kernel. Nhưng thật không may là rất nhiều Docker image cho phép chạy dưới quyền root mà bỏ qua việc sử dụng User trong Dockerfile. Đây là một vấn đề bảo mật không thuộc về phía Docker mà thuộc về phía người dùng.
Các lỗ hổng bảo mật trên container máy chủ được chia sẻ cùng với kernel host, nó có thể khiến kẻ tấn công phá vỡ container đẻ xâm nhập vào kernel của host.
Đôi khi cấu hình Container tệ cũng khiến bạn có được đặc quyền truy cập vào máy chủ bên dưới.
Nếu bạn có một Container mount với hệ thống tệp trên máy chủ, bạn có thể sửa đổi những thứ trong hệ thống tệp đó để nâng cấp đặc quyền.
6. Thoát khỏi container dùng docker.sock:
Docker.sock là socket duy nhất được xem như là xương sống của việc quản lý các container. Khi bạn dùng các lệnh docker để sử dụng docker client, docker client của bạn sẽ tương tác với docker.sock để quản lý container.
Các lệnh của Docker khi được chạy trên máy chủ, API sẽ gọi Docker daemon thông qua non-networked UNIX socket được đặt ở at/var/run/docker.sock. Socket file này là API chính trong việc điều khiển các Docker container hoạt động trên máy.
Tuy nhiên đa số các container và cả những hướng dẫn yêu cầu bạn hiển thị socket file như một Docker volume bên trong container (hoặc là trên cổng TCP ở một vài trường hợp).
Docker container để lộ ra /var/run/docker.sock dù là local hay remote đều có thể dẫn đến việc toàn bộ môi trường bị chiếm đoạt. Bởi truy cập bằng đường dẫn đó tương đương với quyền của một root.
Cùng xem ví dụ về cách một kẻ tấn công xâm nhập vào một container được mount với docker.sock. Đầu tiên chúng ta giả lập môi trường bằng cách tạo một container với docker.sock được mount với nó.
Tạo một alpine container tên là sock từ alpine image bằng lệnh sau:
Mở shell trên sock container:
Bây giờ chúng ta đã có một container đã được mount với docker socket, cùng xem làm sao có thể khai thác chúng.
Chúng ta cần cài đặt docker client bên trong container và tạo thêm một container bằng cách sử dụng container vừa tạo.
Container có thể tương tác với container lớp dưới thông qua Unix socket và -v/:/test:ro mount đường dẫn của root tới container, cuối cùng bật shell của container vừa tạo:
- Đi tới /test là mount point của địa chỉ root thuộc máy chủ, có nghĩa là bạn đã có quyền tương tác bên trong máy chủ.
Output của lệnh ls tại ./test
7. Khai thác đặc quyền từ Container:
Khi một container được chạy với cờ đặc quyền, nó hoàn toàn có khả năng xâm nhập xuống máy chủ. Một trong số đó có thể kể đến CAP_SYS_MODULE, kẻ tấn công truy cập vào container và có được đặc quyền, hắn ta hoàn toàn có thể cài đặt một kernel module trực tiếp vào kernel của máy chủ.
8. Thông tin về các lỗ hổng bảo mật
Ngày nay, docker đang được sử dụng rộng rãi và hầu hết các developer làm việc với docker đều nghĩ rằng nó an toàn.
10 image Docker hàng đầu với hơn 10 triệu lượt tải xuống, mỗi image chứa ít nhất 30 lỗ hổng.
Trong số 10 docker image miễn phí phổ biến, 50% có lỗ hổng bảo mật.
80% developer không kiểm tra docker image của họ trong quá trình phát triển.
50% developer hoàn toàn không quét Docker image để tìm các lỗ hổng.
20% Docker image có lỗ hổng bảo mật có thể được giải quyết bằng cách xây dựng lại.
9. Một số bước để bảo mật tốt hơn
Nên sử dụng các phần mềm để quét qua Docker image.
Một container chỉ nên chứa một phần mềm hoặc chương trình.
Trước khi pull image từ docker Hub, chúng ta nên đảm bảo độ tin cậy từ nhà xuất bản và kiểm tra tính xác thực của image.
Không sử dụng root để chạy image docker, hãy tạo user để chạy image docker.
Nên xây dựng lại dockerfile của bạn.
- Giám sát các Docker container của bạn trong quá trình phát triển bằng cách tự động quét các package và image của bạn.
Phần kết luận
Trong bài viết này, chúng ta đã tìm hiểu về các lỗ hổng của Docker và cách bảo vệ Docker container. Tóm lại, khi sử dụng Docker chúng ta nên quét image và container thường xuyên để giảm nguy cơ phát sinh các vấn đề về bảo mật.