github编辑

安全

容器安全是生产环境部署的核心考量。本章介绍 Docker 的安全机制和最佳实践。

容器安全的本质

核心问题:容器共享宿主机内核,隔离性弱于虚拟机。如何在便利性和安全性之间取得平衡?

虚拟机安全模型:                容器安全模型:
┌─────────────────┐            ┌─────────────────┐
│   Guest OS      │            │    容器进程      │
├─────────────────┤            │   (共享内核)     │
│   Hypervisor    │◄── 隔离边界└────────┬────────┘
├─────────────────┤                     │
│   Host OS       │            ┌────────┴────────┐
└─────────────────┘            │   Namespace     │◄── 隔离边界
                               │   Cgroups       │
完全隔离(性能损耗)            │   Capabilities  │
                               └─────────────────┘
                               进程隔离(轻量但需加固)

核心安全机制

1. 命名空间(Namespace)

提供进程、网络、文件系统等资源的隔离:

Namespace
隔离内容
安全作用

PID

进程

容器看不到其他进程

NET

网络

独立网络栈

MNT

文件系统

独立的根目录

USER

用户

容器 root ≠ 宿主机 root

IPC

进程通信

隔离共享内存

UTS

主机名

独立主机名

详见 命名空间 章节。

2. 控制组(Cgroups)

限制容器的资源使用,防止资源耗尽攻击:

3. 能力机制(Capabilities)

Linux 将 root 权限拆分为多个细粒度的能力。Docker 默认禁用危险能力:

能力
说明
默认状态

CAP_NET_ADMIN

网络管理

❌ 禁用

CAP_SYS_ADMIN

系统管理

❌ 禁用

CAP_SYS_PTRACE

进程追踪

❌ 禁用

CAP_CHOWN

更改文件所有者

✅ 启用

CAP_NET_BIND_SERVICE

绑定低端口

✅ 启用


镜像安全

使用可信镜像

漏洞扫描

扫描镜像中的已知安全漏洞:

镜像签名验证

使用 Docker Content Trust (DCT) 验证镜像来源:


运行时安全

1. 非 root 用户运行

笔者强调:这是最重要的安全实践之一。

或在运行时指定:

2. 只读文件系统

3. 禁用特权模式

4. 限制资源

5. 网络隔离


Dockerfile 安全实践

1. 使用精简基础镜像

2. 多阶段构建

3. 不存储敏感信息

4. 固定依赖版本


安全扫描清单

部署前检查:

检查项
命令/方法

漏洞扫描

docker scout cvestrivy

非 root 运行

检查 Dockerfile 中的 USER

资源限制

检查 -m, --cpus 参数

只读文件系统

检查 --read-only

无特权模式

确认没有 --privileged

最小能力

检查 --cap-drop=all

网络隔离

检查网络配置

敏感信息

确认无硬编码密码


高级安全方案

Seccomp 系统调用过滤

限制容器可以使用的系统调用:

AppArmor / SELinux

使用强制访问控制:

安全容器(gVisor / Kata)

需要更强隔离时:


本章小结

安全措施
重要程度
实现方式

非 root 运行

⭐⭐⭐

USER 指令

漏洞扫描

⭐⭐⭐

docker scout, trivy

资源限制

⭐⭐⭐

-m, --cpus

只读文件系统

⭐⭐

--read-only

最小能力

⭐⭐

--cap-drop=all

镜像签名

⭐⭐

Docker Content Trust

延伸阅读

最后更新于