Docker 容器隔离关键技术:Capabilities
在 Docker 中,Capabilities 是一种权限管理技术,它将 Linux 系统中传统的超级用户(root
)权限拆分为多个独立的小权限(目前为 38 项)。这使得我们可以为容器按需分配权限,而不是直接授予完全的 root 权限。
什么是 Capabilities?
Capabilities 就像一组钥匙,每把钥匙对应某种权限。例如:
- 一把钥匙允许你绑定网络端口(
CAP_NET_BIND_SERVICE
)。 - 另一把钥匙允许你修改文件系统(
CAP_SYS_ADMIN
)。
通过分配具体的钥匙,你可以让容器只完成特定任务,而不会获取过多的权限。
完整的 Capabilities 列表及作用
以下是 Linux 内核最新版本(5.x)的 38 项 Capabilities,包含每项的作用、引入版本和 Docker 容器中默认是否启用(14 项默认启用的权限已标注)。
名称 | 作用 | 引入版本 | Docker 默认启用 (14 项) |
---|---|---|---|
CAP_AUDIT_CONTROL | 管理审计子系统(启用或禁用审计规则)。 | Linux 2.6.11 | ❌ |
CAP_AUDIT_READ | 读取审计日志,用于系统审计工具。 | Linux 3.16 | ❌ |
CAP_AUDIT_WRITE | 写入审计日志(通常用于记录系统事件)。 | Linux 2.6.11 | ✅ |
CAP_BLOCK_SUSPEND | 阻止系统挂起,确保设备不会进入休眠状态。 | Linux 3.5 | ❌ |
CAP_BPF | 加载和操作 eBPF 程序,允许用户空间与内核交互。 | Linux 5.8 | ❌ |
CAP_CHECKPOINT_RESTORE | 执行进程的检查点和恢复操作(如迁移进程状态)。 | Linux 5.9 | ❌ |
CAP_CHOWN | 修改文件或目录的所有权。 | Linux 2.2 | ✅ |
CAP_DAC_OVERRIDE | 绕过文件的权限检查,允许访问受限制的文件。 | Linux 2.2 | ✅ |
CAP_DAC_READ_SEARCH | 绕过目录的只读或搜索权限限制,允许读取特定文件内容。 | Linux 2.2 | ✅ |
CAP_FOWNER | 忽略对文件的只读属性,允许修改文件属性。 | Linux 2.2 | ✅ |
CAP_FSETID | 修改文件的 set-user-ID 或 set-group-ID 标志。 | Linux 2.2 | ✅ |
CAP_IPC_LOCK | 锁定共享内存片段,防止被交换到磁盘。 | Linux 2.2 | ✅ |
CAP_IPC_OWNER | 绕过进程间通信 (IPC) 的权限检查,允许直接访问共享资源。 | Linux 2.2 | ✅ |
CAP_KILL | 向其他进程发送信号,例如 SIGKILL 。 | Linux 2.2 | ✅ |
CAP_LEASE | 修改文件租约属性。 | Linux 2.4 | ✅ |
CAP_LINUX_IMMUTABLE | 修改或删除文件的不可变属性(如 chattr +i 标志)。 | Linux 2.2 | ❌ |
CAP_MAC_ADMIN | 管理强制访问控制 (MAC) 配置,如 SELinux 策略修改。 | Linux 2.6.25 | ❌ |
CAP_MAC_OVERRIDE | 绕过强制访问控制规则,允许访问受限文件或资源。 | Linux 2.6.25 | ❌ |
CAP_MKNOD | 创建特殊文件(如设备文件)。 | Linux 2.2 | ✅ |
CAP_NET_ADMIN | 管理网络配置(如修改路由表、设置网络接口)。 | Linux 2.2 | ❌ |
CAP_NET_BIND_SERVICE | 绑定低号端口(如 80 和 443)。 | Linux 2.2 | ✅ |
CAP_NET_BROADCAST | 使用网络广播和多播数据包。 | Linux 2.2 | ❌ |
CAP_NET_RAW | 使用原始套接字,允许发送或接收低级网络数据。 | Linux 2.2 | ✅ |
CAP_PERFMON | 使用性能监控工具(如 perf,收集内核性能数据)。 | Linux 5.8 | ❌ |
CAP_SETFCAP | 设置文件的功能标志(文件级的 Capabilities)。 | Linux 2.6.24 | ✅ |
CAP_SETGID | 更改进程的 GID(组 ID),包括设置 GID 权限。 | Linux 2.2 | ✅ |
CAP_SETPCAP | 调整进程的 Capabilities 设置,允许进程自身修改权限。 | Linux 2.2 | ✅ |
CAP_SETUID | 更改进程的 UID(用户 ID),包括设置 UID 权限。 | Linux 2.2 | ✅ |
CAP_SYS_ADMIN | 广泛的系统管理权限(如挂载文件系统、修改网络配置),几乎等同于 root 权限。 | Linux 2.2 | ❌ |
CAP_SYS_BOOT | 允许重新启动系统。 | Linux 2.2 | ❌ |
CAP_SYS_CHROOT | 使用 chroot() 系统调用,更改进程的根目录。 | Linux 2.2 | ✅ |
CAP_SYS_MODULE | 加载和卸载内核模块。 | Linux 2.2 | ❌ |
CAP_SYS_NICE | 调整进程优先级,例如设置实时调度策略。 | Linux 2.2 | ✅ |
CAP_SYS_PACCT | 启用或禁用进程审计(Process Accounting)。 | Linux 2.2 | ❌ |
CAP_SYS_PTRACE | 追踪其他进程,例如通过调试器(如 GDB)进行跟踪或注入代码。 | Linux 2.2 | ❌ |
CAP_SYS_RAWIO | 执行直接内存访问或原始设备访问操作。 | Linux 2.2 | ❌ |
CAP_SYS_RESOURCE | 修改系统资源限制(如调整 ulimit 配置)。 | Linux 2.2 | ✅ |
CAP_SYS_TIME | 修改系统时间或时钟。 | Linux 2.2 | ❌ |
CAP_SYS_TTY_CONFIG | 修改 TTY 设备的配置,例如设置串行端口属性。 | Linux 2.2 | ❌ |
Docker 默认启用的 Capabilities
Docker 容器默认启用了 14 项 Capabilities:
CAP_AUDIT_WRITE
CAP_CHOWN
CAP_DAC_OVERRIDE
CAP_DAC_READ_SEARCH
CAP_FOWNER
CAP_FSETID
CAP_IPC_LOCK
CAP_IPC_OWNER
CAP_KILL
CAP_LEASE
CAP_MKNOD
CAP_NET_BIND_SERVICE
CAP_NET_RAW
CAP_SETUID
其他 Capabilities 默认被禁用,必须通过 --cap-add
显式启用。
在 Docker 中如何使用 Capabilities?
1. 添加特定权限
如果容器需要额外权限(如管理网络接口),可以通过 --cap-add
启用:
docker run --cap-add=CAP_NET_ADMIN -it ubuntu
2. 移除默认权限
为了更高的安全性,可以通过 --cap-drop
移除某些默认权限:
docker run --cap-drop=CAP_NET_RAW -it ubuntu
3. 移除所有权限
在高安全场景下,可以移除所有权限,仅保留必要权限:
docker run --cap-drop=ALL --cap-add=CAP_NET_BIND_SERVICE -it ubuntu
为什么 Capabilities 对容器安全重要?
- 按需授权:避免授予容器过多权限,降低被攻击后的风险。
- **最小
权限原则**:容器只能执行特定任务,提升隔离性。
3. 灵活配置:可以根据需要动态调整权限,满足任务需求。
总结
Capabilities 是 Docker 容器隔离的重要技术之一。它将传统 root 权限细化为 38 项小权限,既能满足功能需求,又能最大限度地降低安全风险。