Docker 容器安全加固最佳实践
容器技术的广泛应用带来了新的安全挑战。相比传统虚拟机,容器共享内核,安全隔离性较弱,因此需要从多个维度对Docker容器进行安全加固。
一、镜像安全
使用官方或可信基础镜像
始终从官方镜像仓库或可信来源拉取基础镜像,避免使用来源不明的镜像:
# 推荐:使用官方最小化镜像 FROM nginx:alpine # Alpine基础镜像,体积小,攻击面小 FROM python:3.11-slim # slim版本比full版本小80%以上 FROM gcr.io/distroless/java # Distroless镜像,不含shell和包管理器
镜像漏洞扫描
# 使用Trivy扫描镜像漏洞 docker run --rm aquasec/trivy image myapp:latest # 集成到CI/CD流水线 trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:latest # 发现高危/严重漏洞时退出码为1,阻断流水线
二、以非root用户运行容器
# Dockerfile中创建专用用户
FROM node:18-alpine
RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -S appuser
WORKDIR /app
COPY --chown=appuser:appgroup . .
USER appuser # 切换到非root用户
CMD ["node", "server.js"]
# 运行时强制非root
docker run --user 1001:1001 myapp:latest
# docker-compose.yml
services:
app:
image: myapp:latest
user: "1001:1001"
三、限制容器能力(Capabilities)
# 丢弃所有能力,只保留必要的
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp:latest
# docker-compose.yml
services:
app:
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE # 绑定1024以下端口
四、只读文件系统
# 容器根文件系统只读,防止运行时被修改
docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp:latest
# docker-compose.yml
services:
app:
read_only: true
tmpfs:
- /tmp
- /var/run
五、资源限制防DoS
# 限制CPU和内存,防止容器消耗过多宿主机资源
docker run --cpus="1.0" --memory="512m" --memory-swap="512m" myapp:latest
# K8s中配置资源限制
resources:
limits:
cpu: "1"
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"
六、网络隔离
# 创建专用网络,只允许需要通信的容器互联 docker network create --driver bridge app-network docker run --network app-network myapp:latest docker run --network app-network mydb:latest # 不需要网络的容器完全隔离 docker run --network none batch-job:latest
七、Secrets管理
# 避免在镜像或环境变量中存放敏感信息
# 使用Docker Secrets(Swarm)或K8s Secrets
kubectl create secret generic db-secret --from-literal=password=my-db-password
# Pod中挂载Secret
volumes:
- name: db-secret
secret:
secretName: db-secret
volumeMounts:
- name: db-secret
mountPath: /etc/secrets
readOnly: true
八、安全扫描与合规检查
# Docker Bench Security(CIS基准检查) docker run --net host --pid host --userns host --cap-add audit_control -v /var/lib:/var/lib -v /var/run/docker.sock:/var/run/docker.sock docker/docker-bench-security
九、总结
Docker容器安全是纵深防御体系:使用可信最小化镜像→以非root用户运行→限制Linux Capabilities→只读文件系统→资源限制→网络隔离→Secrets安全管理。这七个层次的加固,可以显著降低容器被攻击的风险和被攻击后的危害范围。