39.Linux/Unix 系统编程手册(下) -- 能力
Linux 能力模型,它将传统的 all-or-nothing UNIX 权限模型划分成一个个能单独启用或者禁用的能力。
使用能力允许程序在执行一些特权操作的同时防止它们执行其他未经允许的操作.
1.能力基本原理
Linux 能力模型优化了对这个问题的处理方式,即在内核中执行安全性检测时不再使用单个权限(即有效用户ID为0),
超级用户权限被划分为了不同的单元,这个单元称为能力。每个特权操作与一个特定的能力相关联,进程只有在拥有相应
的能力的时候(这个时候不管用户ID是什么)才能执行相应的操作。
2.进程能力
内核会为每个进程维护3个能力集:
1.许可的
这些是一个进程可能使用的能力。许可的集合是能够被添加到有效的和可继承的集合中的受限超集。如果一个进程从其许可
集中删除了一个能力,那么将永远也无法再重新获得该能力(除非它执行了一个再次授予该能力的程序)。
2.有效的
内核会使用这些能力来对进程执行权限进行检测。只有进程在其许可集中维护着一个能力,那么进程才能通过从有效集中删除这个
能力来临时禁用该能力,之后再将该能力还原到这个集合中。
3.可继承的
当这个进程执行一个程序时可以将这些权限带入许可集中。
通过Linux特有的 /proc/PID/status 文件中的 CapInh,CapPrm和CapEff 这3个字段能够查看任意进程的3个能力集的十六进制表示。
fork() 创建的子进程会继承父进程的能力集副本。
实际上,能力是一个线程级的特性,进程中的每个线程的能力都可以单独的进行调整。在 /proc/PID/task/TID/status 文件中可以查看一个
多线程进程中某个具体线程的能力,/proc/PID/status 文件显示了主线程的能力。
进程的许可集定义了进程能够使用的能力。进程的有效能力集定义了进程当前使用的能力---即内核会使用这组能力来检查进程是否拥有足够的权限
执行某个特定的操作。
3.文件能力
如果一个文件拥有相关的能力集,那么这些集合会被用来确定赋给执行这个文件的进程的能力。
1.许可的
在 exec() 调用中可以将这组能力添加到进程的许可集中,不管进程的能力是什么
2.有效的
这个只有一位。如果被启用了,那么在 exec() 调用中,进程的新许可集中启用的能力再进程的新有效集中也会被启用。如果文件的有效位被禁用
了,那么在 exec() 执行之后,进程的新有效集在一开始是空的。
3.可继承的
这个集合将与进程的可继承集取掩码来确定在执行 exec() 之后进程的许可集中启用的能力集。
文件许可能力集为可执行文件向进程赋予能力提供了一种机制,它指定了 exec() 调用中被赋予进程的许可能力集的一组能力。
4.在 exec() 中转变进程能力
在 exec() 执行期间,内核会根据进程的当前能力以及被执行的文件的能力集来设置进程的新能力。
5.能力边界集
能力边界集是一种用于限制进程在 exec() 调用中能够获取的能力的安全机制。
capset();
capget();