做像美团淘宝平台网站多少钱/苹果要做搜索引擎
为了对 root 权限进行更细粒度的控制,实现按需授权,Linux 引入了另一种机制叫capabilities。Capabilities 机制是在 Linux 内核 2.2 之后引入的,原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
线程(进程)的 capabilities ,每一个线程,具有 5 个 capabilities 集合,每一个集合使用64位掩码来表示,显示为16进制格式。这 5 个 capabilities 集合分别是:
-
Permitted
-
Effective
-
Inheritable
-
Bounding
-
Ambient
文件的 capabilities 包含了 3 个集合: -
Permitted
-
Inheritable
-
Effective
通过如下接口可以对进程和文件的capability进行查询和设置。
cap_t cap_get_proc(void);cap_t cap_get_pid(pid_t pid);int cap_set_proc(cap_t cap_p);cap_t cap_get_file(const char *path_p);int cap_set_file(const char *path_p, cap_t cap_p);cap_t cap_get_fd(int fd);int cap_set_fd(int fd, cap_t caps);
demo
int main(int argc, char **argv)
{cap_t caps = cap_init();cap_value_t caps[4] ={ CAP_NET_RAW, CAP_NET_BIND_SERVICE , CAP_CHOWN,CAP_SETPCAP } ;unsigned num_caps = 4;cap_set_flag(caps, CAP_EFFECTIVE, num_caps, caps, CAP_SET);cap_set_flag(caps, CAP_INHERITABLE, num_caps, caps, CAP_SET);cap_set_flag(caps, CAP_PERMITTED, num_caps, caps, CAP_SET);cap_set_proc(caps);cap_free(caps);long i = 0;caps = cap_get_proc();printf("The process has capabilities %s\n",cap_to_text(caps, &i));cap_free(caps);return 0;
}
参考链接
Linux capability机制
Linux中的SetUid和capability权能机制
Linux Capability机制原理