Capabilities 安全

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
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容