今日同大家吹下水,講下 Docker Container Security 嘅實戰野。作為一個 IT 人,你可能日日都用 Docker,但係你個 container 真係安全咩?唔好諗住「我又唔係咩大公司,邊個會 hack 我」—— 呢個諗法本身就係最大嘅漏洞!
之前幫個客做 security audit,發現佢哋 production 環境啲 container 全部用 root 行、port 全開、image 係 random pull 返嚟嘅⋯⋯簡直係門戶大開。今日就同大家分享 8 招 Docker 容器安全加固嘅實戰技巧,由淺入深,即學即用。
👉 延伸閱讀:KSPM 實戰入門:Kubernetes 安全自動化完整指南 2026
—
## 第 1 招:唔好用 root 行 container!
呢個係最最基本但最多人中招嘅位。Default 嘅 Docker container 係用 root 身份行嘅,萬一有人 escape 咗 container,佢喺 host 機都係 root privilege!
解決方法好簡單,Dockerfile 入面加 USER:
“`dockerfile
FROM node:20-alpine
RUN addgroup -g 1001 -S appgroup && adduser -u 1001 -S appuser -G appgroup
USER appuser
WORKDIR /app
COPY –chown=appuser:appgroup . .
CMD [“node”, “server.js”]
“`
或者 docker-compose.yml:
“`yaml
services:
app:
image: myapp:latest
user: “1001:1001”
“`
記住:永遠唔好用 root 行 production container!
—
## 第 2 招:Read-only filesystem
除非你個 app 真係要寫 file,否則 set 個 filesystem 做 read-only:
“`bash
docker run –read-only –tmpfs /tmp:rw,noexec,nosuid,size=256M myapp:latest
“`
docker-compose 版本:
“`yaml
services:
app:
image: myapp:latest
read_only: true
tmpfs:
– /tmp:rw,noexec,nosuid,size=256M
“`
咁就算 attacker 成功入侵,都冇辦法 drop malware 或者改 config file。
—
## 第 3 招:Drop 晒所有 capabilities,只加必要嘅
Linux kernel 預設俾咗 container 一堆 capabilities,大部分你根本唔需要。最安全做法係 drop 晒佢,然後只加真正需要嗰啲:
“`bash
docker run –cap-drop=ALL –cap-add=NET_BIND_SERVICE myapp:latest
“`
docker-compose:
“`yaml
services:
app:
cap_drop:
– ALL
cap_add:
– NET_BIND_SERVICE
“`
大部份 web app 只需要 NET_BIND_SERVICE 去 bind port < 1024。如果你個 app 用 port 8080,連呢個都唔使加。 --- ## 第 4 招:用 non-root port(> 1024)
承上,如果唔使用 privileged port,直接令個 app listen 喺高端口:
“`javascript
// Node.js 例子
app.listen(8080, ‘0.0.0.0’);
“`
然後用 reverse proxy(nginx / traefik)做 port mapping。咁你連 NET_BIND_SERVICE 都唔使加,container 真係零 capabilities。
—
## 第 5 招:限資源!唔好俾 container 食晒成部機
冇 set resource limit 嘅 container 可以食晒你成部機嘅 CPU 同 RAM。一個失控嘅 process 就成部機 crash:
“`yaml
services:
app:
deploy:
resources:
limits:
cpus: ‘0.5’
memory: 512M
reservations:
cpus: ‘0.25’
memory: 256M
“`
或者直接用 docker run:
“`bash
docker run –cpus=”0.5″ –memory=”512m” –memory-swap=”512m” myapp:latest
“`
memory-swap 同 memory 一樣數值 = 禁用 swap。呢個好重要,因為 swap 會將 memory data 寫落 disk,有機會洩露 sensitive data。
—
## 第 6 招:Scan image vulnerability
唔好信任何 public image!就算係 official image 都可能有漏洞。用 Docker Scout 或者 Trivy 定期 scan:
“`bash
# 用 Trivy(免費開源)
trivy image myapp:latest
# 用 Docker Scout
docker scout quickview myapp:latest
docker scout cves myapp:latest
“`
可以整合落 CI/CD pipeline:
“`yaml
# GitHub Actions 例子
– name: Scan image
uses: aquasecurity/trivy-action@master
with:
image-ref: ‘myapp:${{ github.sha }}’
format: ‘sarif’
output: ‘trivy-results.sarif’
severity: ‘CRITICAL,HIGH’
“`
Critical 同 High severity 嘅漏洞要 fix 咗先 deploy,呢個係底線。
—
## 第 7 招:Network segmentation – internal network only
唔好將所有 container 曝露喺 public network。用 internal network 隔離:
“`yaml
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 呢個 network 唔可以出 internet!
services:
nginx:
networks:
– frontend
– backend
api:
networks:
– backend
db:
networks:
– backend
“`
`internal: true` 嘅 network 入面嘅 container 完全冇 internet access。Database、Redis、內部 API 全部放呢度。
—
## 第 8 招:Secrets management – 唔好 hardcode!
最後但唔係最唔重要:唔好將 API key、database password hardcode 喺 environment variables 或者 config file!用 Docker secrets:
“`bash
echo “MyDBSecurePass123!” | docker secret create db_password –
“`
docker-compose(Swarm mode):
“`yaml
services:
app:
secrets:
– db_password
secrets:
db_password:
external: true
“`
Secret 會以 tmpfs 形式 mount 喺 `/run/secrets/db_password`,唔會留喺 image layer、唔會出現喺 `docker inspect` output。
—
## 總結
Docker security 唔係咩高深學問,而係一連串嘅好習慣。以上 8 招,你可能已經做咗一半,但如果仲有漏嘅,今日開始補返。記住一句口訣:
**「唔好用 root、drop capabilities、限資源、scan 漏洞、isolate network、管好 secrets」**
搞掂呢幾樣,你個 container environment 已經比市面上 80% 嘅 setup 安全。下次有機會再同大家傾下 Kubernetes security,仲多野玩!
🔗 參考資料:Docker 官方安全文件
Take care,stay secure!🛡️
#IT教學 #Docker #技術分享 #安全 #Security



