了解 Linux 系统编程的能力了解 Linux 系统编程的能力了解 Linux 系统编程的能力了解 Linux 系统编程的能力
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

了解 Linux 系统编程的能力

发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux 中的功能允许二进制文件无需 root 权限即可访问系统的某些部分。这是您需要了解的有关它们的所有信息。

功能允许在与当前进程不同的单独线程中评估一些重要的系统权限。这样,您无需以 root 身份运行程序即可访问系统的某些部分。

作为因需求而产生的解决方案,POSIX.1e的第25节就是关于这个问题的。随着 Linux 内核版本 2.6.26 的发布,该部分中定义的权限及其他权限的开发已经完成。以下是您需要了解的有关 Linux 内核功能的所有信息。

了解功能 API 逻辑

基于 Unix 的系统中的授权控制包含两个步骤:

  • 如果正在运行的应用程序的当前所有者(有效用户 ID,EUID)为零,则系统不会检查授权

  • 如果EUID值不为零,则系统按照相关应用程序的有效用户和组的授权执行控制过程

某些应用程序在运行时需要拥有更广泛的权限(SUID、SGIT 位)。作为最典型的示例,您可以想到 passwd 应用程序。这样,系统中的用户就可以更改其密码。但是,要写入保存加密密码的 /etc/shadow 文件,需要使用 root 用户权限(即用户 ID=0)。

为了解决这个问题,passwd 应用程序有一个 SUID 位。无论哪个用户运行此应用程序,活动所有者 (EUID) 始终是 root:

ls -l /usr/bin/passwd

# Output
-rwsr-xr-x. 1 root root 32552 Jul 23 2021 /usr/bin/passwd

在传统的 Unix 认证模型中运行 SUID 应用程序的能力似乎已经解决了这个问题。然而,具有 SUID 位的应用程序中的严重错误为在系统中具有完全权限的用户运行不需要的代码打开了大门。如果可能的话,理想的应用程序应该能够在不需要 root 用户权限的情况下运行。

问题并不仅仅因为 SUID 位而结束。当您想要在基于 Unix 的系统上侦听小于 1024 的特权 TCP 或 UDP 端口时,您还必须具有 root 用户权限。例如,为了能够侦听 Web 服务器的 TCP 80 端口,您必须以 root 用户身份运行应用程序。

多年来,人们已经了解到,使用完全授权的用户帐户运行为网络环境提供服务的软件是多么具有破坏性。作为临时解决方案,采用的是仅程序的某个较小部分以root身份侦听特权端口,然后将活动用户ID更改为其他用户以进行后续处理(例如权限受限的nobody用户) 。

该系统已使用多年,因其简单性而运行良好,并且仍然有效使用。然而,如今,除了上述系统之外,还可以通过 Linux 功能 API 获得一些特定于应用程序的附加功能,而无需 root 权限。

Linux 能力模型的解释!

您可以在 Linux 内核中找到最全面的功能 API 实现。现代 Linux 发行版也尝试在系统范围内尽可能地使用这种新模型。

例如,为了使 ping 应用程序正常工作,它必须能够打开 RAW 套接字,这些套接字通常仅供 root 用户使用。在旧的 Linux 发行版中,问题在于为应用程序提供 SUID 位,以便普通用户可以使用它。在这些版本中,当您从应用程序中删除 SUID 位并尝试以普通用户身份运行应用程序时,您会收到以下错误:

ping 8.8.8.8

# Output
ping: icmp open socket: Operation not permitted

而在现代 Linux 发行版上,ping 应用程序可能没有 SUID 位:

ls -l /bin/ping 

# Output
-rwxr-xr-x. 1 root root 95232 Jul 25 2021 /bin/ping

尽管如此,您可以作为普通用户成功运行该应用程序。实现这一点的机制是 ping 应用程序具有特殊功能CAP_NET_RAW。

您可以使用 getcap 命令了解应用程序的其他功能,如下所示:

sudo getcap /bin/ping

# Output
/bin/ping cap_net_raw=ep

如果 getcap 命令返回空响应,您可以使用以下命令手动设置该值:

sudo setcap cap_net_raw+ep /bin/ping

过程能力模型

在 Linux 实现中,每个进程的功能分为三个标题:

Capability

Statement

permitted

In this cluster, there is a list of allowed additional capabilities for the relevant process. Granting permission doesn't mean that it can be used actively at that time. It is possible to include the authorizations here in the effective capability set with an additional action.

effective

It shows the currently active capability list of the related process. With the auxiliary functions that regulate the skill system, it is possible to give up or regain a skill. In any case, however, this can only be done among those already authorized in the permitted group.

inheritable

When an application starts a new process, the newly started process displays the list of capabilities it will inherit from the allowed list.

任何时候运行进程的允许的、有效的和可继承的功能的列表在 CapPrm、CapEff 和 CapInh 行上显示为位掩码在文件 /proc//status 中。此外,CapBnd行包含能力边界控制操作中使用的位掩码。

例如,尝试从 /proc/self/status 文件中读取正在运行的 shell 应用程序的值:

cat /proc/self/status | grep Cap

# Output
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Linux 中的文件能力模型

文件能力系统的运行依赖于这些属性能够存储在虚拟文件系统(VFS)层的前提。与流程模型类似,文件功能分为三个标题:

1. 允许

当相应的可执行文件在此集群中运行时,系统会确定进程允许的功能。

2. 有效

与过程能力模型不同,该标头仅存储一位:活动或非活动。如果该位有效,则当运行该文件并创建进程时,该文件的允许列表中定义的功能将自动转移到相关进程的有效功能列表中。如果该位未激活,则不会将文件上允许的功能自动传输到正在运行的进程。

然而,如果相关应用程序的代码与能力系统集成,则可以通过系统调用来激活文件的允许集中的权限。此行为的主要目的是确保不包含能力系统特定代码的旧应用程序、软件代码级别的开发可以与能力系统一起使用,而无需更改任何源代码。

您可能认为编写得更好的应用程序只会在需要时使用功能。如果该位处于活动状态,则在应用程序启动时允许列表中的所有功能都会变为活动状态。

3. 可遗传

与流程模型中一样,相关文件运行并发生流程。如果此后另一个应用程序从该进程内运行,它将包含在新进程的允许列表中。总而言之,它表示要继承的能力列表。

Linux 系统中功能的作用

当您以普通用户身份运行某个进程时,您没有任何权限。因此,您只能访问系统允许普通用户访问的分区。其背后的主要原因是加强系统安全并实施此类措施。

允许所有用户访问所有资源可能会造成严重的安全漏洞。对于恶意利用系统的人来说,很容易利用系统漏洞。 Linux 的功能在此类问题上会派上用场。您可以使用内核支持的功能 API 轻松增强应用程序的安全性。

Linux 功能只是需要考虑的问题之一,需要考虑一些非常强大的方法,例如划分 root 用户的权限,为非特权用户分配各种权限,以及对 Linux 服务器的互联网服务中的开放端口采取各种预防措施。

©2015-2025 Norria support@norria.com