Linux Capabilities 简介

为了执行权限检查,Linux区分特权进程(其有效用户标识为0,即超级用户根)和非特权进程(其有效用户标识为非零)。特权进程绕过所有内核权限检查,而非特权进程根据进程凭据(通常是有效的UID、有效的GID和补充组列表)执行完全权限检查。

[En]

In order to perform permission checks, Linux distinguishes between privileged processes (whose valid user identity is 0, that is, superuser root) and unprivileged processes (whose valid user identity is non-zero). Privileged processes bypass all kernel permission checks, while non-privileged processes perform full permission checks based on process credentials (usually valid UID, valid GID, and supplementary group list).

以常用的 passwd 命令为例,修改用户密码需要具有 root 权限,而普通用户是没有这个权限的。但是实际上普通用户又可以修改自己的密码,这是怎么回事?在 Linux 的权限控制机制中,有一类比较特殊的权限设置,比如 SUID(Set User ID on execution),不了解 SUID 的同学请参考《Linux 特殊权限 SUID,SGID,SBIT》。因为程序文件 /bin/passwd 被设置了 SUID 标识,所以普通用户在执行 passwd 命令时,进程是以 passwd 的所有者,也就是 root 用户的身份运行,从而修改密码。

SUID 虽然可以解决问题,却带来了安全隐患。当运行设置了 SUID 的命令时,通常只是需要很小一部分的特权,但是 SUID 给了它 root 具有的全部权限。因此一旦 被设置了 SUID 的命令出现漏洞,就很容易被利用。也就是说 SUID 机制在增大了系统的安全攻击面。

Linux 引入了 capabilities 机制对 root 权限进行细粒度的控制,实现按需授权,从而减小系统的安全攻击面。本文将介绍 capabilites 机制的基本概念和用法。

描述:本文的演示环境是Ubuntu 18.04。

[En]

Description: the demo environment for this article is Ubuntu 18.04.

从内核 2.2 开始,Linux 将传统上与超级用户 root 关联的特权划分为不同的单元,称为 capabilites。Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个单元可以独立启用和禁用。如此一来,权限检查的过程就变成了:在执行特权操作时,如果进程的有效身份不是 root,就去检查是否具有该特权操作所对应的 capabilites,并以此决定是否可以进行该特权操作。比如要向进程发送信号(kill()),就得具有 capability CAP_KILL;如果设置系统时间,就得具有 capability CAP_SYS_TIME

getcap 命令和 setcap 命令分别用来查看和设置程序文件的 capabilities 属性。下面我们演示如何使用 capabilities 代替 ping 命令的 SUID。
因为 ping 命令在执行时需要访问网络,这就需要获得 root 权限,常规的做法是通过 SUID 实现的(和 passwd 命令相同):

红框中的 s 说明应用程序文件被设置了 SUID,这样普通用户就可以执行这些命令了。

移除 ping 命令文件上的 SUID 权限:

在移除 SUID 权限后,普通用户在执行 ping 命令时碰到了 “ping: socket: Operation not permitted” 错误。

为 ping 命令文件添加 capabilities
执行 ping 命令所需的 capabilities 为 cap_net_admin 和 cap_net_raw,通过 setcap 命令可以添加它们:

被赋予合适的 capabilities 后,ping 命令又可以正常工作了,相比 SUID 它只具有必要的特权,在最大程度上减小了系统的安全攻击面。

如果要删除刚刚添加的功能,请执行以下命令:

[En]

If you want to remove the capabilities you just added, execute the following command:

命令中的 ep 分别表示 Effective 和 Permitted 集合(接下来会介绍),+ 号表示把指定的 capabilities 添加到这些集合中,- 号表示从集合中移除(对于 Effective 来说是设置或者清除位)。

在上面的示例中,我们使用setCap命令修改了程序文件/bin/ping的功能。可执行文件的属性中有三个集合,用于保存三种类型的功能,它们是:

[En]

In the above example, we modified the capabilities of the program file / bin/ping with the setcap command. There are three collections in the properties of the executable file to hold the three types of capabilities, which are:

  • Permitted
  • Inheritable
  • Effective

当进程执行时,允许集合中的能力会自动添加到该进程的允许集合中。

[En]

When a process executes, the capabilites in the * Permitted collection * is automatically added to the process’s Permitted collection.

Inheritable 集合中的 capabilites 会与进程的 Inheritable 集合执行与操作,以确定进程在执行 execve 函数后哪些 capabilites 被继承。
Effective 只是一个 bit。如果设置为开启,那么在执行 execve 函数后,Permitted 集合中新增的 capabilities 会自动出现在进程的 Effective 集合中。

进程中有五种 capabilities 集合类型,分别是:

  • Permitted
  • Inheritable
  • Effective
  • Bounding
  • Ambient

相比文件的 capabilites,进程的 capabilities 多了两个集合,分别是 Bounding 和 Ambient。
/proc/[pid]/status 文件中包含了进程的五个 capabilities 集合的信息,我们可以通过下面的命名查看当前进程的 capabilities 信息:

但通过这种方式获得的信息无法读取,我们需要使用capsh命令将其转义为可读格式:

[En]

But the information obtained in this way cannot be read, and we need to escape it into a readable format using the capsh command:

将特权用户分为根用户和普通用户显然太粗暴了,这可能会导致安全问题。能力就是为了解决这个问题而产生的,它可以提供细粒度的权限集,从而有效地减少系统的安全攻击面。

[En]

It is obviously too crude to divide privileged users into root and ordinary users, which can lead to security problems. Capabilities is created to solve this problem, it can provide fine-grained privilege set, so as to effectively reduce the security attack surface of the system.

Original: https://www.cnblogs.com/sparkdev/p/11417781.html
Author: sparkdev
Title: Linux Capabilities 简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7237/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总