Docker 安全加固指南
# Docker 安全加固指南
容器不是保险箱,不加固照样被黑。
## 1. 使用非root用户
```dockerfile
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
```
```bash
docker run -d -u 1000:1000 myapp
```
容器内root如果逃逸就是宿主机root,最危险的安全问题。
## 2. 只读文件系统
```bash
docker run -d --read-only myapp
# 需要写临时文件
docker run -d --read-only --tmpfs /tmp myapp
docker run -d --read-only --tmpfs /run myapp
```
## 3. 删掉不必要的权限
```bash
# 丢弃所有Linux能力,只加需要的
docker run -d \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
myapp
```
默认Docker给容器一堆能力,大部分用不到。
常用能力:
- `NET_BIND_SERVICE`:绑定1024以下端口
- `CHOWN`:改文件属主
- `SETUID/SETGID`:切换用户
- `SYS_PTRACE`:调试(开发用)
## 4. 禁止特权模式
```bash
# ❌ 千万别这么干
docker run --privileged myapp
# ✅ 按需添加能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp
```
privileged等于把宿主机所有设备都给了容器。
## 5. 资源限制
```bash
docker run -d \
-m 512m \
--memory-swap=512m \
--cpus="1.0" \
--pids-limit 100 \
myapp
```
防止一个容器吃光资源影响其他容器。
## 6. 网络隔离
```yaml
services:
frontend:
networks:
- public
backend:
networks:
- public
- private
db:
networks:
- private
networks:
public:
private:
internal: true # 不能访问外网
```
数据库不暴露到公共网络。
## 7. 镜像安全扫描
```bash
# docker scout(Docker官方)
docker scout cves myapp:1.0
docker scout recommendations myapp:1.0
# Trivy(开源)
trivy image myapp:1.0
# 在CI里扫描
trivy image --exit-code 1 --severity CRITICAL myapp:1.0
```
## 8. 镜像签名
```bash
# Docker Content Trust
export DOCKER_CONTENT_TRUST=1
docker push myapp:1.0 # 自动签名
docker pull myapp:1.0 # 验证签名
```
## 9. 用户命名空间
```json
// /etc/docker/daemon.json
{
"userns-remap": "default"
}
```
容器内root映射到宿主机一个普通用户,即使逃逸也没root权限。
## 10. 安全相关Dockerfile实践
```dockerfile
# 固定版本
FROM node:18.19.0-alpine3.19
# 不装多余包
RUN apk add --no-cache curl
# 不存敏感信息
# ❌ ENV DB_PASSWORD=xxx
# ✅ 运行时通过Secret或环境变量注入
# COPY时指定owner
COPY --chown=appuser:appgroup . /app
# 健康检查
HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1
```
## 11. 审计日志
```json
// /etc/docker/daemon.json
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
```
保留日志用于审计追溯。
## 12. 宿主机安全
```bash
# 关掉不必要的Docker API
# 不要把Docker socket暴露给容器
# ❌ docker run -v /var/run/docker.sock:/var/run/docker.sock ...
# 限制Docker API访问
# /etc/docker/daemon.json
{
"hosts": ["unix:///var/run/docker.sock"] # 只监听本地socket
}
```
## 安全检查清单
- [ ] 容器不以root运行
- [ ] 只读文件系统或最小写入
- [ ] 丢弃不必要的Linux能力
- [ ] 设置资源限制
- [ ] 网络隔离,数据库不暴露
- [ ] 镜像定期扫描漏洞
- [ ] 不挂载Docker socket
- [ ] 镜像固定版本号
- [ ] 敏感信息用Secret不用环境变量
- [ ] 启用日志审计
---
Docker安全没有银弹,就是一层一层加防护。最关键的两条:别用root、别用privileged。
更多推荐




所有评论(0)