Chuyển đến nội dung chính

Bài 13: Docker Security Best Practices

Bảo mật Docker daemon, rootless containers, user namespaces, seccomp profiles, AppArmor/SELinux, read-only filesystems, capability dropping, image signing với Docker Content Trust, CIS Docker Benchmark và compliance scanning.

🔒 DevSecOps — Bài 13 Bài 13: Docker Security Best Practices

Docker từ Cơ bản đến Nâng cao

Phần 4: Security, Monitoring và CI/CD

xdev.asia

1. Docker Security - Tổng quan

Bảo mật Docker bao gồm nhiều lớp: từ Docker daemon, container runtime, image, đến application. Mỗi lớp cần được bảo vệ riêng biệt.

┌─────────────────────────────────────────┐
│  Layer 5: Application Security          │
│  (Code, dependencies, secrets)          │
├─────────────────────────────────────────┤
│  Layer 4: Image Security                │
│  (Base images, scanning, signing)       │
├─────────────────────────────────────────┤
│  Layer 3: Container Runtime Security    │
│  (Namespaces, cgroups, capabilities)    │
├─────────────────────────────────────────┤
│  Layer 2: Docker Daemon Security        │
│  (TLS, authorization, rootless)         │
├─────────────────────────────────────────┤
│  Layer 1: Host OS Security              │
│  (Kernel, updates, hardening)           │
└─────────────────────────────────────────┘

2. Docker Daemon Security

2.1. Rootless Docker

Chạy Docker daemon mà không cần root privileges:

# Cài đặt rootless Docker
dockerd-rootless-setuptool.sh install

Cấu hình environment

export PATH=/home/user/bin:$PATH export DOCKER_HOST=unix:///run/user/1000/docker.sock

Verify

docker info | grep -i rootless

2.2. Docker Daemon TLS

// /etc/docker/daemon.json
{
  "tls": true,
  "tlsverify": true,
  "tlscacert": "/etc/docker/ca.pem",
  "tlscert": "/etc/docker/server-cert.pem",
  "tlskey": "/etc/docker/server-key.pem",
  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
}

3. Container Runtime Security

3.1. Non-root User

# Trong Dockerfile
FROM node:20-alpine
RUN addgroup -S app && adduser -S app -G app
WORKDIR /app
COPY --chown=app:app . .
RUN npm ci --only=production
USER app
CMD ["node", "server.js"]
# Verify container user
docker exec my-app whoami
docker exec my-app id

3.2. Read-only Filesystem

# Container với read-only filesystem
docker run -d \
    --read-only \
    --tmpfs /tmp:rw,noexec,nosuid,size=100m \
    --tmpfs /var/run:rw,noexec,nosuid \
    -v app-data:/data \
    myapp
# Docker Compose
services:
  api:
    image: myapp:latest
    read_only: true
    tmpfs:
      - /tmp
      - /var/run
    volumes:
      - app-data:/data

3.3. Linux Capabilities

# Drop tất cả capabilities và chỉ add cần thiết
docker run -d \
    --cap-drop ALL \
    --cap-add NET_BIND_SERVICE \
    myapp

Xem capabilities của container

docker exec my-app cat /proc/1/status | grep Cap

3.4. Security Options

# No new privileges
docker run -d --security-opt=no-new-privileges:true myapp

Seccomp profile

docker run -d --security-opt seccomp=./seccomp-profile.json myapp

AppArmor profile

docker run -d --security-opt apparmor=docker-default myapp

# Docker Compose
services:
  api:
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE

4. Image Security

4.1. Vulnerability Scanning

# Trivy scan
trivy image --severity HIGH,CRITICAL myapp:latest

Docker Scout

docker scout cves myapp:latest

Snyk

snyk container test myapp:latest

Tích hợp vào CI/CD

Fail build nếu có critical vulnerabilities

trivy image --exit-code 1 --severity CRITICAL myapp:latest

4.2. Docker Content Trust (Image Signing)

# Enable Docker Content Trust
export DOCKER_CONTENT_TRUST=1

Push signed image

docker push myregistry/myapp:1.0

Pull chỉ signed images

docker pull myregistry/myapp:1.0

Cosign (modern alternative)

cosign sign myregistry/myapp:1.0 cosign verify myregistry/myapp:1.0

4.3. Image Best Practices

  • Sử dụng minimal base images (Alpine, Distroless)

  • Pin image versions (không dùng latest)

  • Scan images định kỳ

  • Không cài đặt unnecessary packages

  • Không copy secrets vào image

5. Network Security

# Isolate containers bằng custom networks
docker network create --internal internal-net

Container trên internal network không thể access internet

docker run -d --network internal-net --name db postgres:16

Chỉ expose cần thiết

❌ Bad

docker run -p 5432:5432 postgres:16

✅ Good - chỉ bind localhost

docker run -p 127.0.0.1:5432:5432 postgres:16

6. CIS Docker Benchmark

CIS Docker Benchmark cung cấp checklist bảo mật cho Docker:

# Chạy Docker Bench Security
docker run --rm -it \
    --net host \
    --pid host \
    --userns host \
    --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /etc:/etc:ro \
    -v /var/lib:/var/lib:ro \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    docker/docker-bench-security

Các category kiểm tra:

  • Host Configuration

  • Docker Daemon Configuration

  • Docker Daemon Configuration Files

  • Container Images and Build Files

  • Container Runtime

  • Docker Security Operations

7. Production Security Checklist

  • ☐ Chạy containers với non-root user

  • ☐ Read-only filesystem khi có thể

  • ☐ Drop all capabilities, chỉ add cần thiết

  • ☐ No new privileges

  • ☐ Scan images cho vulnerabilities

  • ☐ Pin image versions

  • ☐ Sử dụng Docker Secrets cho sensitive data

  • ☐ Network isolation

  • ☐ Resource limits (CPU, memory)

  • ☐ Logging và monitoring

  • ☐ Regular security audits

8. Tổng kết

Trong bài này, bạn đã nắm được:

  • Docker security multi-layer approach

  • Rootless Docker và daemon security

  • Container hardening: non-root, read-only, capabilities

  • Image scanning và signing

  • Network isolation

  • CIS Docker Benchmark

  • Production security checklist

Bài tiếp theo sẽ hướng dẫn Docker Logging và Monitoring.