Capabilities 安全
什么是 Linux Capabilities
Linux Capabilities 是将传统 UNIX 的 root 用户的超级权限拆分为一个个独立的”能力”。Docker 利用 capabilities 机制实现容器权限的精确控制,不再是非黑即白的 root/non-root 二元选择。
传统 root 的问题
传统 UNIX 中 root 拥有一切权限,但 Nginx 可能只需要绑定 80 端口的能力(CAP_NET_BIND_SERVICE),并不需要加载内核模块的能力(CAP_SYS_MODULE)。Capabilities 机制让权限分配更加精确。
Docker 的 Capabilities 管理
默认保留的 Capabilities
Docker 容器默认保留一组有用的 capabilities,同时删除危险的能力:
# 查看当前容器的 capabilities
docker run --rm alpine cat /proc/1/status | grep Cap
CapInh: 0000000000000000
CapPrm: 00000000a80425fb
CapEff: 00000000a80425fb
删除不需要的 Capabilities
# 最佳实践:先删除所有,再按需添加
docker run \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
nginx
添加需要的 Capabilities
# ICMP ping 需要
docker run --cap-add=NET_RAW alpine ping 8.8.8.8
# 绑定特权端口(<1024)
docker run --cap-add=NET_BIND_SERVICE nginx
# 跟踪 strace
docker run --cap-add=SYS_PTRACE alpine strace -p 1
常用 Capabilities 说明
| Capability | 功能 | 安全风险 |
|---|---|---|
| NET_BIND_SERVICE | 绑定 <1024 的端口 | 低风险 |
| NET_RAW | 原始 socket(ping) | 中风险 |
| CHOWN | 修改文件所有者 | 低风险 |
| SYS_ADMIN | 许多管理操作(挂载等) | 高风险 |
| SYS_PTRACE | 调试进程 | 中风险 |
| SYS_MODULE | 加载内核模块 | 高风险 |
Docker Compose 配置
services:
nginx:
image: nginx:alpine
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
- CHOWN
app:
image: myapp
cap_drop:
- ALL
# 普通应用通常不需要任何特权
–privileged 的风险
# ❌ 绝对不要在生产环境使用
docker run --privileged myapp
# 等价于:
docker run \
--cap-add=ALL \
--security-opt seccomp=unconfined \
--security-opt apparmor=unconfined \
myapp
最佳安全实践
最小权限原则
# Nginx - 只需要绑定端口和修改文件所有者
docker run -d --cap-drop=ALL --cap-add=NET_BIND_SERVICE,CHOWN nginx
# Redis - 只需要修改文件所有者
docker run -d --cap-drop=ALL --cap-add=CHOWN redis
# MySQL - 需要修改文件 + 绑定端口
docker run -d --cap-drop=ALL --cap-add=CHOWN,NET_BIND_SERVICE mysql
调试与验证
# 查看容器 cap
docker inspect nginx-container | jq '.[0].HostConfig.CapAdd'
# 容器内查看
docker exec nginx-container cat /proc/1/status | grep Cap
# capsh 命令
docker run --rm alpine capsh --print
常见错误
- 大量添加 cap 而不是精确指定
- 使用 –privileged 代替精细的 cap 管理
- 忽略 default cap 中已经包含的能力
Linux Capabilities 是控制容器安全的重要工具,正确使用可以大幅减少容器权限滥用的风险。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容