6.3.10.4. Capabilities

6.3.10.4.1. 简介

Capabilities机制是在 Linux 2.2 之后引入的,用于将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。

这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。

Capabilities可以在进程执行时赋予,也可以直接从父进程继承。

6.3.10.4.2. 列表

  • 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

  • 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 计时器)

6.3.10.4.3. 线程的 capabilities

每一个线程都有5个capabilities集合,每一个集合使用64位掩码来表示。这5个capabilities集合分别是:

  • Permitted

  • Effective

  • Inheritable

  • Bounding

  • Ambient

每个集合中都包含零个或多个capabilities。这5个集合的具体含义如下:

6.3.10.4.3.1. Permitted

定义了线程能够使用的capabilities的上限。

6.3.10.4.3.2. Effective

内核检查Effective集合以判断线程是否可以进行特权操作时。

6.3.10.4.3.3. Inheritable

当执行exec()系统调用时,能够被新的可执行文件继承的capabilities。

6.3.10.4.3.4. Bounding

Bounding集合是Inheritable集合的超集,如果某个capability不在Bounding集合中,即使它在Permitted集合中,该线程也不能将该capability添加到它的Inheritable集合中。

Bounding集合的capabilities在执行fork()系统调用时会传递给子进程的Bounding集合,并且在执行execve系统调用后保持不变。

当线程运行时,不能向Bounding集合中添加capabilities。

一旦某个capability被从Bounding集合中删除,便不能再添加回来。

将某个capability从Bounding集合中删除后,如果之前Inherited集合包含该capability,将继续保留。但如果后续从Inheritable集合中删除了该capability,便不能再添加回来。

6.3.10.4.3.5. Ambient

Linux 4.3内核新增的capabilities集合,用于弥补Inheritable的不足。Ambient具有如下特性:

  • Permitted和Inheritable未设置的capabilities,Ambient也不能设置。

  • 当Permitted和Inheritable关闭某权限(比如 CAP_SYS_BOOT)后,Ambient也随之关闭对应权限。确保进程降低权限后子进程也会降低权限。

  • 非特权用户如果在Permitted集合中有一个capability,那么可以添加到Ambient集合中,这样它的子进程可以获取这个capability。