Linux capabilities
工作流程
在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
测试常见的Capabilities调用
CAP_AUDIT_CONTROL | 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则 |
CAP_AUDIT_READ | 允许通过 multicast netlink 套接字读取审计日志 |
CAP_AUDIT_WRITE | 将记录写入内核审计日志 |
CAP_BLOCK_SUSPEND |
使用可以阻止系统挂起的特性 |
CAP_CHOWN | 修改文件所有者的权限 |
CAP_DAC_OVERRIDE | 忽略文件的 DAC 访问限制 |
CAP_DAC_READ_SEARCH | 忽略文件读及目录搜索的 DAC 访问限制 |
CAP_FOWNER | 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制 |
CAP_FSETID | 允许设置文件的 setuid 位 |
CAP_IPC_LOCK | 允许锁定共享内存片段 |
CAP_IPC_OWNER | 忽略 IPC 所有权检查 |
CAP_KILL | 允许对不属于自己的进程发送信号 |
CAP_LEASE | 允许修改文件锁的 FL_LEASE 标志 |
CAP_LINUX_IMMUTABLE | 允许修改文件的 IMMUTABLE 和 APPEND 属性标志 |
CAP_MAC_ADMIN | 允许 MAC 配置或状态更改 |
CAP_MAC_OVERRIDE | 忽略文件的 DAC 访问限制 |
CAP_MKNOD | 允许使用 mknod() 系统调用 |
CAP_NET_ADMIN | 允许执行网络管理任务 |
CAP_NET_BIND_SERVICE | 允许绑定到小于 1024 的端口 |
CAP_NET_BROADCAST | 允许网络广播和多播访问 |
CAP_NET_RAW | 允许使用原始套接字 |
CAP_SETGID | 允许改变进程的 GID |
CAP_SETFCAP | 允许为文件设置任意的 capabilities |
CAP_SETPCAP | 参考 capabilities man page |
CAP_SETUID | 允许改变进程的 UID |
CAP_SYS_ADMIN | 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
CAP_SYS_BOOT | 允许重新启动系统 |
CAP_SYS_CHROOT | 允许使用 chroot() 系统调用 |
CAP_SYS_MODULE | 允许插入和删除内核模块 |
CAP_SYS_NICE | 允许提升优先级及设置其他进程的优先级 |
CAP_SYS_PACCT | 允许执行进程的 BSD 式审计 |
CAP_SYS_PTRACE | 允许跟踪任何进程 |
CAP_SYS_RAWIO | 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备 |
CAP_SYS_RESOURCE | 忽略资源限制 |
CAP_SYS_TIME | 允许改变系统时钟 |
CAP_SYS_TTY_CONFIG | 允许配置 TTY 设备 |
CAP_SYSLOG | 允许使用 syslog() 系统调用 |
CAP_WAKE_ALARM | 允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器) |
CAP_BPF | 控制着许多可以用bpf()系统调用进行的操作 |
CAP_CHECKPOINT_RESTORE | 允许没有系统管理员权限的进程来进行checkpoint和恢复 |
CAP_PERFMON | 可以执行性能监控、把BPF程序attach到tracecepoints上、以及其他类似的操作。 |
capsh --print
利用命令capsh --print可以查看目前bash进程所有的权限
其中
Current :表示当前 shell 进程的 Effective capabilities 和 Permitted capabilities
Bounding set : 表示 Bounding 集合中的 capabilities
grep Cap
通过命令
grep Cap /proc/$$/status
可以直接访问文件来获取我们目前的权限
之后通过
capsh --decode=0000001fffffffff
便可以查到对应的信息
libcap-ng
使用 filecap命令来管理文件的 capabilities。
利用filecap -a遍历整个系统的capabilities,可以再配合grep -v Unable过滤下结果
docker pull amouat/caps
docker run -it amouat/caps
可以使用这个镜像对Capability进行查询
利用命令
docker run -it --cap-drop ALL --user=nobody amouat/caps
可以对docker进行一些限制,docker运行后可以发现我们的Capability已经被清空了
当然我们也可以指定一些权限进行关闭
docker run -it --cap-drop CHOWN --user=nobody amouat/caps
这时可以发现 capsh --print后并没有cap_CHOWN的身影
我们还可以使用--cap-add这个参数来添加指定的Capability
docker run -it --cap-drop ALL --cap-add CHOWN --user=nobody amouat/caps
我们正常部署的时候可以使用--cap-drop ALL配合--cap-add加载一些需要的capabilities达到白名单效果。
【Linux Capabilities 入门教程:基础实战篇】https://icloudnative.io/posts/linux-capabilities-in-practice-1/
【Linux Capabilities 入门教程:概念篇】https://icloudnative.io/posts/linux-capabilities-why-they-exist-and-how-they-work/
【Linux Capabilities 入门教程:进阶实战篇】https://icloudnative.io/posts/linux-capabilities-in-practice-2/
地址|北京市海淀区奥北科技园20号楼5层
原文始发于微信公众号(大学生网络安全尖锋训练营):【学习园地】Capability与Docker
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论