Bài 12: Bảo mật trong Docker
12.1. Các vấn đề bảo mật phổ biến trong Docker
Docker mang lại nhiều lợi ích nhưng cũng tiềm ẩn các rủi ro bảo mật nếu không được cấu hình đúng cách. Một số vấn đề phổ biến:
Lỗ hổng trong Docker Image:
- Các image chứa phần mềm lỗi thời hoặc không được cập nhật có thể bị khai thác.
Lộ thông tin nhạy cảm:
- Thông tin nhạy cảm như mật khẩu hoặc khóa API có thể bị lưu trữ trong image hoặc Dockerfile.
Sử dụng quyền root:
- Mặc định, container chạy với quyền root, gây nguy cơ bảo mật nếu bị khai thác.
Kết nối mạng không an toàn:
- Container giao tiếp qua mạng không mã hóa có thể bị nghe lén.
12.2. Sử dụng Non-Root User trong Docker Container
Chạy container với quyền non-root giúp giảm nguy cơ container bị lợi dụng để tấn công hệ thống.
Cách thực hiện:
Tạo user trong Dockerfile:
FROM openjdk:11-jre-slim RUN useradd -ms /bin/bash appuser USER appuser COPY target/app.jar /app/app.jar WORKDIR /app CMD ["java", "-jar", "app.jar"]Kiểm tra user trong container:
docker exec -it <container_id> whoami
12.3. Quét Docker Image để tìm lỗ hổng bảo mật
Sử dụng các công cụ quét bảo mật để phát hiện lỗ hổng trong Docker Image.
Công cụ phổ biến:
Trivy:
Cài đặt:
brew install aquasecurity/trivy/trivyQuét image:
trivy image <image_name>
Snyk:
Đăng ký tài khoản tại Snyk.
Cài đặt:
npm install -g snykQuét image:
snyk container test <image_name>
Kết quả:
Các công cụ sẽ cung cấp danh sách lỗ hổng, mức độ nghiêm trọng và hướng dẫn sửa lỗi.
12.4. Bảo mật secrets với Docker Secrets hoặc HashiCorp Vault
Docker Secrets:
Docker Secrets là cách lưu trữ và quản lý thông tin nhạy cảm như mật khẩu, khóa API.
Tạo secret:
echo "my_password" | docker secret create db_password -Sử dụng secret trong Docker Compose:
version: '3.9' services: app: image: spring-boot-app secrets: - db_password secrets: db_password: external: true
HashiCorp Vault:
HashiCorp Vault cung cấp giải pháp quản lý secrets mạnh mẽ và an toàn.
Cài đặt Vault: Vault Installation Guide.
Cấu hình Vault trong ứng dụng Spring Boot: Thêm dependency:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vault-config</artifactId> </dependency>
12.5. Thực hành: Bảo mật ứng dụng Spring Boot trong Docker
Bước 1: Tạo Dockerfile với non-root user
FROM openjdk:11-jre-slim
RUN useradd -ms /bin/bash appuser
USER appuser
COPY target/app.jar /app/app.jar
WORKDIR /app
CMD ["java", "-jar", "app.jar"]
Bước 2: Quét bảo mật Docker Image
Build image:
docker build -t spring-boot-app .Quét image với Trivy:
trivy image spring-boot-app
Bước 3: Sử dụng Docker Secrets
Tạo secret:
echo "secure_password" | docker secret create db_password -Cập nhật
docker-compose.yml:version: '3.9' services: springboot-app: image: spring-boot-app secrets: - db_password secrets: db_password: external: true
Bước 4: Kiểm tra bảo mật mạng
Chạy container:
docker-compose upKiểm tra kết nối mạng an toàn (HTTPS).
Tóm tắt
Sử dụng non-root user để giảm nguy cơ bảo mật.
Quét Docker Image với Trivy hoặc Snyk để phát hiện lỗ hổng.
Bảo vệ thông tin nhạy cảm bằng Docker Secrets hoặc HashiCorp Vault.