Linux权限管理之Capabilities
对root 权限进行细粒度的控制
Linux capability详解
linux capabilities
在Linux内核2.2之前,为了检查进程权限,将进程区分为两类:特权进程(euid=0)和非特权进程。特权进程(通常为带有suid的程序)可以获取完整的root权限来对系统进行操作。
在linux内核2.2之后引入了capabilities机制,来对root权限进行更加细粒度的划分。如果进程不是特权进程,而且也没有root的有效id,系统就会去检查进程的capabilities,来确认该进程是否有执行特权操作的的权限。
可以通过man capabilities
来查看具体的capabilities。
capability 名称 | 描述 |
---|---|
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 | 覆盖 MAC(Mandatory Access Control) |
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 计时器) |
capabilities 机制
Linux capabilities 分为进程 capabilities 和文件 capabilities。对于进程来说,capabilities 是细分到线程的,即每个线程可以有自己的capabilities。对于文件来说,capabilities 保存在文件的扩展属性中。
linux的线程拥有的capabilities一共有五种。
Permitted
它是
Effective
和Inheritable
的超集。进程拥有的权限不会超过这个集合。如果一个进程在Permitted
集合中丢失一个能力,它无论如何不能再次获取该能力(除非特权用户再次赋予它)Inheritable
它是表明该进程可以通过
execve
继承给新进程的能力。包含在该集合中的 capabilities 并不会自动继承给新的可执行文件,即不会添加到新线程的Effective
集合中,它只会影响新线程的Permitted
集合。Effecitive
进程的有效能力集,Linux内核真正检查的能力集。
Bounding
它是
Inheritable
集合的超集,如果某个 capability 不在Bounding
集合中,即使它在Permitted
集合中,该线程也不能将该 capability 添加到它的Inheritable
集合中。Bounding 集合的 capabilities 在执行
fork()
系统调用时会传递给子进程的 Bounding 集合,并且在执行execve
系统调用后保持不变。当线程运行时,不能向
Bounding
集合中添加 capabilities。一旦某个 capability 被从
Bounding
集合中删除,便不能再添加回来。将某个 capability 从 Bounding 集合中删除后,如果之前
Inherited
集合包含该 capability,将继续保留。但如果后续从Inheritable
集合中删除了该 capability,便不能再添加回来。
Ambient
在Linux内核4.3后增加,用来弥补
Inheritable
的不足。它可以用prctl
来直接修改。Ambient
具有如下特性:Permitted
和Inheritable
未设置的 capabilities,Ambient
也不能设置。当
Permitted
和Inheritable
关闭某权限后,Ambient
也随之关闭对应权限。这样就确保了降低权限后子进程也会降低权限。非特权用户如果在
Permitted
集合中有一个 capability,那么可以添加到Ambient
集合中,这样它的子进程便可以在Ambient
、Permitted
和Effective
集合中获取这个 capability。
文件的capabilities有三种。
Permitted
这个集合中包含的 capabilities,在文件被执行时,会与线程的 Bounding 集合计算交集,然后添加到线程的
Permitted
集合中。Inheritable
这个集合与线程的
Inheritable
集合的交集,会被添加到执行完execve()
后的线程的Permitted
集合中。Effective
这不是一个集合,仅仅是一个标志位。如果设置开启,那么在执行完
execve()
后,线程Permitted
集合中的 capabilities 会自动添加到它的Effective
集合中。对于一些旧的可执行文件,由于其不会调用 capabilities 相关函数设置自身的Effective
集合,所以可以将可执行文件的 Effective bit 开启,从而可以将Permitted
集合中的 capabilities 自动添加到Effective
集合中。
capabilities继承
通过execve
,后capabilities有如下关系来进行继承
其中P
表示当前线程,P'
表示被执行的线程,F
表示可执行文件。
如果是
root
执行的execve
,或者可执行文件带有suid
,或者可执行文件拥有全部的能力集,则Ambient
被置空,否则继承原始进程的Ambient
如果是
root
执行的execve
,或者可执行文件带有suid
,则文件的Inheritable
和Permitted
的能力集被全部置位为1,且Effective
被置为1。所以此时新线程的Inheritable
和Effective
的能力集计算可简化为:
查看/修改capabilities
命令行方式
线程的capabilities可以直接查看
status
文件。然后可以通过
capsh
命令来解码拥有的权限文件的capabilities可以通过
setcap
和getcap
来设置和查询libcap.so
ubuntu下可以直接通过如下命令安装
通过如下接口可以对进程和文件的capability进行查询和设置。
例子:
提权
设置了capability也并不是万事大吉了。虽然被丢掉了大部分的能力,但是只要还有某些高危的能力,被丢掉的能力还是可以被添加回来。
capability 名称 | 描述 |
---|---|
CAP_CHOWN | 修改文件所有者的权限 |
CAP_DAC_OVERRIDE | 忽略文件的 DAC 访问限制 |
CAP_DAC_READ_SEARCH | 忽略文件读及目录搜索的 DAC 访问限制 |
CAP_FOWNER | 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制 |
CAP_FSETID | 允许设置文件的 setuid 位 |
CAP_MAC_ADMIN | 允许 MAC 配置或状态更改 |
CAP_MAC_OVERRIDE | 覆盖 MAC(Mandatory Access Control) |
CAP_MKNOD | 允许使用 mknod() 系统调用 |
CAP_SETGID | 允许改变进程的 GID |
CAP_SETFCAP | 允许为文件设置任意的 capabilities |
CAP_SETPCAP | |
CAP_SETUID | 允许改变进程的 UID |
CAP_SYS_ADMIN | 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
CAP_SYS_MODULE | 允许插入和删除内核模块 |
CAP_SYS_PTRACE | 允许跟踪任何进程 |
CAP_SYS_RAWIO | 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备 |
最后更新于