0

Cách viết Dockerfile an toàn hơn

Nhiều Dockerfile mình review có lỗi bảo mật cơ bản. Đây là checklist mình dùng.

1. Không chạy root

# Bad
FROM node:20-alpine
COPY . .
CMD ["node", "app.js"]
# Container chạy bằng root!

# Good
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup . .
USER appuser
CMD ["node", "app.js"]

Nếu app bị hack, attacker chỉ có quyền appuser, không phải root.

2. Pin exact versions

# Bad: image có thể thay đổi bất cứ lúc nào
FROM python:3
FROM node:latest

# Good: pin version
FROM python:3.12.4-slim-bookworm
FROM node:20.15.1-alpine3.20

latest hôm nay có thể khác latest ngày mai → build không reproducible.

3. Dùng slim/alpine base

# Big: ~900MB, nhiều packages không cần
FROM ubuntu:22.04

# Smaller: ~150MB
FROM python:3.12-slim

# Smallest: ~50MB
FROM python:3.12-alpine

Ít packages = ít attack surface = ít CVEs.

4. Multi-stage build

# Build stage: có compiler, build tools
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o server

# Runtime stage: chỉ có binary
FROM alpine:3.20
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/server /server
USER nobody
CMD ["/server"]

Build tools không vào production image.

5. Không copy secrets

# Bad: secrets baked vào image layer
COPY .env .
ENV API_KEY=secret123

# Good: pass at runtime
# docker run --env-file .env myapp

Ai pull image đều thấy secrets trong layers:

docker history myapp --no-trunc

6. COPY cụ thể, không COPY .

# Bad: copy everything kể cả .git, .env, node_modules
COPY . .

# Good: copy chỉ những gì cần
COPY package*.json ./
RUN npm ci --production
COPY src/ ./src/
COPY public/ ./public/

Kết hợp với .dockerignore:

.git
.env*
node_modules
tests
*.md
docker-compose*.yml

7. Health check

HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
    CMD curl -f http://localhost:3000/health || exit 1
    ```
    
    Orchestrator (Docker Swarm, K8s) dùng healthcheck để restart container khi app hang.
    
    ## 8. Scan for vulnerabilities
    
    ```bash
    # Docker Scout
    docker scout cves myapp:latest
    
    # Trivy
    trivy image myapp:latest
    
    # Snyk
    snyk container test myapp:latest
    ```
    
    Chạy scan trong CI/CD, block deploy nếu có critical CVE.
    
    ## Checklist
    
    - [ ] Không chạy root
    - [ ] Pin exact image version
    - [ ] Dùng slim/alpine base
    - [ ] Multi-stage build
    - [ ] .dockerignore đầy đủ
    - [ ] Không có secrets trong image
    - [ ] HEALTHCHECK
    - [ ] Scan CVE trong CI/CD
    
    ---
    
    Dockerfile của bạn check được mấy điểm? Có tip bảo mật nào khác không?

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí