生产环境安全加固
安全加固框架
Docker 生产环境安全加固是一个系统工程,涉及守护进程配置、容器运行时安全、镜像管理、网络安全和访问控制等多个层面。
1. 守护进程安全配置
daemon.json 安全配置
{
"userns-remap": "default",
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"seccomp-profile": "/etc/docker/seccomp.json",
"log-driver": "journald",
"log-opts": {
"tag": "{{.Name}}/{{.ID}}"
},
"icc": false,
"iptables": true,
"authorization-plugins": ["docker-opa"],
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server-cert.pem",
"tlskey": "/etc/docker/server-key.pem",
"hosts": ["tcp://192.168.1.100:2376", "unix:///var/run/docker.sock"]
}
关键配置说明
| 配置 | 说明 | 安全收益 |
|---|---|---|
| userns-remap | 用户命名空间映射 | 防止容器 root 获得宿主机 root |
| live-restore | 守护进程重启时运行中的容器不停止 | 可用性 |
| userland-proxy | 禁用用户态代理 | 减少攻击面 |
| no-new-privileges | 禁止容器内提权 | 防止 setuid 提权 |
| icc | 禁止容器间通信 | 网络隔离 |
| authorization-plugins | 授权插件 | 细粒度访问控制 |
2. 容器运行配置
安全的容器启动模板
docker run -d \
--read-only \
--user 1000:1000 \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--security-opt=no-new-privileges:true \
--security-opt=seccomp=default.json \
--security-opt=apparmor=docker-default \
--tmpfs /tmp:rw,nosuid,nodev,noexec,size=100M \
-v /var/log/myapp:/var/log:rw \
--restart=always \
--memory=256m \
--cpus=0.5 \
--pids-limit=100 \
nginx
Docker Compose 安全配置
services:
app:
image: myapp:${TAG}
user: "1000:1000"
read_only: true
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
security_opt:
- no-new-privileges:true
tmpfs:
- /tmp:size=100M
- /var/run:size=50M
volumes:
- app-logs:/var/log/app
restart: always
deploy:
resources:
limits:
cpus: "0.5"
memory: "256M"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 5s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
3. 网络层安全
网络隔离配置
services:
web:
image: nginx
networks:
- frontend
ports:
- "443:443"
depends_on:
- app
app:
image: myapp
networks:
- frontend
- backend
expose:
- "3000"
db:
image: postgres
networks:
- backend
# internal: true # 不访问外网
networks:
frontend:
driver: bridge
backend:
internal: true # 数据库不能访问外网
防火墙规则
# 限制 Docker 相关的 iptables 规则
iptables -A INPUT -i docker0 -j DROP
iptables -A FORWARD -i docker0 -o docker0 -j DROP
# 只允许特定容器访问
iptables -A FORWARD -s 172.17.0.0/16 -d 10.0.0.0/8 -j ACCEPT
4. 镜像安全策略
# 在 CI/CD 中自动扫描
trivy image --severity HIGH,CRITICAL --exit-code 1 myapp:$TAG
# 只允许使用签名镜像
export DOCKER_CONTENT_TRUST=1
# 定期更新基础镜像
docker pull node:18-alpine
docker pull nginx:alpine
# 清理旧镜像
docker image prune -a -f
5. 主机加固
# 1. 更新 Docker
sudo apt-get update && sudo apt-get upgrade docker-ce
# 2. 限制 Docker socket 访问
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
# 3. 审计 Docker 操作
sudo auditctl -w /var/lib/docker -p wa -k docker
sudo auditctl -w /etc/docker -p wa -k docker-config
sudo auditctl -w /var/run/docker.sock -p rwxa -k docker-socket
# 4. 限制资源
sudo systemctl set-property docker.service \
MemoryMax=4G \
CPUQuota=80%
6. 运行时安全监控
Falco 安装和配置
services:
falco:
image: falcosecurity/falco:latest
privileged: true
network_mode: host
pid: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc:/host/proc:ro
- /etc/falco:/etc/falco:ro
关键 Falco 规则
- rule: Container with Privileged Mode
condition: container.id != host and container.privileged = true
output: "Privileged container started (user=%user.name)"
priority: WARNING
- rule: Sensitive Mount Detected
condition: sensitive_mount and container.id != host
output: "Sensitive mount detected (mount=%mount.path)"
priority: CRITICAL
- rule: Unauthorized Process
condition: proc.name in (crypto_miner_list) and container.id != host
output: "Unauthorized process running in container"
priority: CRITICAL
7. 安全审计清单
每日检查
- [ ] 检查运行中的容器是否有特权模式
- [ ] 检查是否有新的高危 CVE
- [ ] 检查 Docker 守护进程日志中的异常
每周检查
- [ ] 更新基础镜像
- [ ] 扫描所有镜像的漏洞
- [ ] 审查 Docker 配置变更
每月检查
- [ ] 轮换 TLS 证书
- [ ] 审计容器访问日志
- [ ] 更新 Docker 版本
- [ ] 进行安全演练
8. 自动化安全检查
#!/bin/bash
# docker-security-check.sh
echo "=== Docker 安全检查 ==="
# 检查特权容器
echo "[*] 检查特权容器..."
docker ps -q | xargs -I {} docker inspect {} --format '{{.Name}} {{.HostConfig.Privileged}}'
# 检查 Docker socket 挂载
echo "[*] 检查 Docker socket 挂载..."
docker ps -q | xargs -I {} docker inspect {} --format '{{range .Mounts}}{{.Source}}{{end}}' | grep docker
# 检查非 root 用户
echo "[*] 检查非 root 运行..."
docker ps -q | xargs -I {} docker inspect {} --format '{{.Name}} {{.Config.User}}'
# 检查资源限制
echo "[*] 检查资源限制..."
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
安全架构全景
安全加固体系
┌─────────────────────────────────────────┐
│ 访问控制:RBAC、TLS、授权插件 │
├─────────────────────────────────────────┤
│ 运行时安全:非root、只读、Capabilities │
├─────────────────────────────────────────┤
│ 网络安全:隔离、加密、防火墙 │
├─────────────────────────────────────────┤
│ 镜像安全:扫描、签名、SBOM │
├─────────────────────────────────────────┤
│ 守护进程安全:配置加固、审计 │
├─────────────────────────────────────────┤
│ 主机安全:更新、监控、限制 │
└─────────────────────────────────────────┘
生产环境安全加固不是一次性任务,而是持续的过程。每个层次的安全措施相互补充,共同构建纵深防御体系。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容