Docker Container 安全加固實戰:5 步鎖死你個 Container 唔好俾人爆

# Docker Container 安全加固實戰:5 步鎖死你個 Container 唔好俾人爆 Docker 好多人用,但唔係個個識安全設定。作為 IT 人,成日見到同事一句 `docker run` 就隊個 container 出街,乜 security option 都冇落,root user 照行,俾人爆咗都唔知咩事。今日呢篇 Docker Container 安全教學,同你 step-...

Docker Container 安全加固實戰:5 步鎖死你個 Container 唔好俾人爆 - 文章重點速覽 infographic

Docker Container 安全加固實戰:5 步鎖死你個 Container 唔好俾人爆

Docker 好多人用,但唔係個個識安全設定。作為 IT 人,成日見到同事一句 `docker run` 就隊個 container 出街,乜 security option 都冇落,root user 照行,俾人爆咗都唔知咩事。今日呢篇 Docker Container 安全教學,同你 step-by-step 示範點樣鎖死個 container,由 network 到 filesystem 到 capabilities 全部封實。

Docker Container 安全第一式:絕對唔好用 root 跑 Container

好多人 Docker Container 用 root 跑,因為方便。但呢個係最大安全漏洞!root container 一旦被 escape,host 機即刻爆。用 `USER` directive 或者 `–user` flag 降權:

# 唔好咁做!
docker run -d nginx:latest

# 正確做法:指定 non-root user
docker run -d --user 1000:1000 nginx:latest

喺 Dockerfile 入面都要 set non-root user:

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

Docker Container 安全第二式:Read-Only Root Filesystem

Docker Container 好多時根本唔需要寫入 root filesystem。如果個 container 淨係 serve static content 或者行 API,set `–read-only` 係最穩陣:

docker run -d --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=64m \
  --tmpfs /var/run:rw,noexec,nosuid,size=64m \
  nginx:latest

`–tmpfs` 俾返必需寫入嘅目錄,但要限制 size 同權限。咁樣就算 attacker 成功入到 container,都冇辦法寫 malware 入 filesystem。

Docker Container 安全第三式:Capabilities 最小化

Linux capabilities 係 root privilege 嘅細分。Container 唔需要 `SYS_ADMIN` 或者 `NET_RAW`。Docker 預設已經 drop 咗部分,但你可以再 aggressive 啲:

docker run -d \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --cap-add=CHOWN \
  nginx:latest

先 drop 全部,再 add 返必需嘅,咁樣 Docker Container 就只得最基本嘅權限。

Docker Container 安全第四式:Resource Limits 防 DDoS

冇 set resource limit 嘅 Docker Container,一個 fork bomb 就可以食晒成部機嘅 CPU/memory。用 `–memory` 同 `–cpus`:

docker run -d \
  --memory="256m" \
  --memory-swap="512m" \
  --cpus="1.5" \
  --pids-limit=100 \
  nginx:latest

特別係 `–pids-limit`,防止 fork bomb 係必須 set 嘅 Docker Container 安全措施。

Docker Container 安全第五式:Network Segmentation + Image Scanning

Docker Compose 入面一定要定義 custom network,唔好全部隊去 default bridge:

version: "3.9"
services:
  frontend:
    image: nginx:latest
    networks:
      - frontend-net
  backend:
    image: my-api:latest
    networks:
      - frontend-net
      - backend-net
  database:
    image: postgres:16
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
    internal: true  # 唔俾出 internet

最後,每次 pull image 之前用 `docker scout` 或者 Trivy scan:

docker scout quickview nginx:latest
docker scout cves nginx:latest

# 或用 Trivy
trivy image nginx:latest

Docker Container 安全 Bonus:Seccomp + AppArmor

進階少少,用 custom seccomp profile 限制 system call:

docker run -d \
  --security-opt seccomp=/path/to/custom-profile.json \
  --security-opt apparmor=docker-nginx \
  nginx:latest

結語:Docker Container 安全唔係 option,係基本

🔗 參考資料:NVD NIST 漏洞資料庫

上面 5 招 Docker Container 安全設定,做齊咗之後你個 container 嘅 attack surface 會大幅縮小。IT 世界冇 100% 安全,但至少唔好做最易俾人爆嗰個。由今日開始,每次 `docker run` 之前問自己:我用咗 non-root 未?set 咗 read-only 未?drop 咗 capabilities 未?

Docker #Container安全 #DevSecOps #資安 #Linux

📌 延伸閱讀: