# 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。
 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐