Linux权限管理之Capabilities
对root 权限进行细粒度的控制
最后更新于
对root 权限进行细粒度的控制
最后更新于
弥敦道人 2020-06-21 17:23:49 3216 收藏 5分类专栏: linux 文章标签: linux版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_39219503/article/details/106888174版权 linux 专栏收录该内容1 篇文章 0 订阅订阅专栏
在Linux内核2.2之前,为了检查进程权限,将进程区分为两类:特权进程(euid=0)和非特权进程。特权进程(通常为带有suid的程序)可以获取完整的root权限来对系统进行操作。
在linux内核2.2之后引入了capabilities机制,来对root权限进行更加细粒度的划分。如果进程不是特权进程,而且也没有root的有效id,系统就会去检查进程的capabilities,来确认该进程是否有执行特权操作的的权限。
可以通过man 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
覆盖 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 计时器)
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
集合中。
通过execve
,后capabilities有如下关系来进行继承
其中P
表示当前线程,P'
表示被执行的线程,F
表示可执行文件。
如果是root
执行的execve
,或者可执行文件带有suid
,或者可执行文件拥有全部的能力集,则Ambient
被置空,否则继承原始进程的Ambient
如果是root
执行的execve
,或者可执行文件带有suid
,则文件的Inheritable
和Permitted
的能力集被全部置位为1,且Effective
被置为1。所以此时新线程的Inheritable
和Effective
的能力集计算可简化为:
命令行方式
线程的capabilities可以直接查看status
文件。
然后可以通过capsh
命令来解码拥有的权限
文件的capabilities可以通过setcap
和getcap
来设置和查询
libcap.so
ubuntu下可以直接通过如下命令安装
通过如下接口可以对进程和文件的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 及原始块设备
参考
参考