第 2 章 SELinux Contexts
进程和文件使用 SELinux 上下文标记,其中含有其他信息,如 SELinux 用户、角色、类型以及可选的级别。运行 SELinux 时,所有这些信息都用于做出访问控制决策。在红帽企业 Linux 中,SELinux 提供了基于角色的访问控制(RBAC)、类型强制(TE)和可选的多级别安全(MLS)的组合。
以下是显示 SELinux 上下文的示例。SELinux 上下文在运行 SELinux 的 Linux 操作系统上用于进程、Linux 用户和文件。使用以下命令查看文件和目录的 SELinux 上下文:
~]$
ls -Z file1
-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
SELinux 上下文遵循 SELinux user:role:type:level 语法。这些字段如下:
- SELinux user
- SELinux 用户身份是策略已知的身份,它授权用于一组特定的角色,以及特定的 MLS/MCS 范围。每个 Linux 用户都使用 SELinux 策略映射到 SELinux 用户。这允许 Linux 用户继承对 SELinux 用户的限制。映射的 SELinux 用户身份在该会话中进程的 SELinux 上下文中使用,以定义它们可以进入哪些角色和级别。以 root 身份输入以下命令,查看 SELinux 和 Linux 用户帐户之间的映射列表(您需要安装 policycoreutils-python 软件包):
~]#
semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *输出可能因系统稍有不同:Login Name
列列出了 Linux 用户。SELinux User
列列出了 Linux 用户映射到的 SELinux 用户。对于进程,SELinux 用户限制可以访问哪些角色和级别。MLS/MCS Range
列,是多级别安全(MLS)和 Multi-Category Security (MCS)使用的级别。Service
列决定正确的 SELinux 上下文,其中 Linux 用户应该登录到系统。默认情况下,会使用星号(*
)字符,代表任何服务。
- role
- SELinux 的一部分是基于角色的访问控制(RBAC)安全模型。该角色是 RBAC 的一个属性。SELinux 用户获得角色的授权,并且域对角色进行了授权。该角色充当域和 SELinux 用户之间的中介。可以输入的角色决定了可以输入哪些域;最后,这控制可以访问哪些对象类型。这有助于降低对特权升级攻击的漏洞。
- type
- type 是 Type Enforcement 的属性。类型定义进程的域,以及文件的类型。SELinux 策略规则定义类型如何互相访问,无论是访问某一类型的域还是访问其他域的域。只有在存在允许访问的特定 SELinux 策略规则时才允许访问。
- level
- 级别是 MLS 和 MCS 的属性。MLS 范围是一组级别,如果级别不同,则编写为 低级级别,如果级别不同,则级别 较低 (
s0-s0
与s0
相同)。每个级别都是敏感度类别对,类别是可选的。如果有类别,则该级别被写为 敏感度:category-set。如果没有类别,它将被写为 敏感度。如果设置的类别是连续的序列,则可缩写它。例如,c0.c3
与c0,c1,c2,c3
相同。/etc/selinux/targeted/setrans.conf
文件将级别(s0:c0
)映射到人类可读的表单(即CompanyConfidential
)。在 Red Hat Enterprise Linux 中,目标策略强制执行 MCS 和 MCS,它只是一个敏感度s0
。Red Hat Enterprise Linux 中的 MCS 支持 1024 个不同的类别:c0
到c1023
.s0-s0:c0.c1023
是敏感度s0
,并授权所有类别。MLS 强制执行 Bell-La Padula Mandatory 访问模型,用于标记安全保护配置文件(LSPP)环境。要使用 MLS 限制,请安装 selinux-policy-mls 软件包,并将 MLS 配置为默认 SELinux 策略。Red Hat Enterprise Linux 附带的 MLS 策略省略了不属于评估配置一部分的许多程序域,因此桌面工作站上的 MLS 不可用(不支持 X Window 系统),但上游 SELinux Reference Policy 中的 MLS 策略可以被构建,其中包括所有程序域。有关 MLS 配置的更多信息,请参阅 第 4.13 节 “多级别安全(MLS)”。
2.1. 域转换
一个域中的进程通过执行具有新域
的入口点
类型的应用程序来转换到另一个域。入口点
权限在 SELinux 策略中使用,并控制哪些应用程序可用于进入域。以下示例演示了一个域转换:
过程 2.1. 域转换示例
- 用户想要更改其密码。为此,它们运行
passwd
实用程序。/usr/bin/passwd
可执行文件使用passwd_exec_t
类型标记:~]$
ls -Z /usr/bin/passwd -rwsr-xr-x root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwdpasswd
实用程序访问/etc/shadow
,它标有shadow_t
类型:~]$
ls -Z /etc/shadow -r--------. root root system_u:object_r:shadow_t:s0 /etc/shadow - SELinux 策略规则指出,在
passwd_t
域中运行的进程可以读取和写入标有shadow_t
类型的文件。shadow_t
类型仅应用于密码更改所需的文件。这包括/etc/gshadow
、/etc/shadow
及其备份文件。 - SELinux 策略规则指出
passwd_t
域将其入口点
权限设置为passwd_exec_t
类型。 - 当用户运行
passwd
实用程序时,用户的 shell 进程将转换到passwd_t
域。使用 SELinux 时,由于默认操作是拒绝的,并且存在允许(长于其他事情)在passwd_t
域中运行的应用程序访问通过shadow_t
类型标记的文件,因此允许passwd
应用访问/etc/shadow
并更新用户密码。
这个示例并不详尽,用作解释域转换的基本示例。虽然存在允许
passwd_t
域中运行的实际规则访问使用 shadow_t
文件类型标记的对象,但必须满足其他 SELinux 策略规则,然后才能过渡到新域。在本例中,Type Enforcement 可确保:
passwd_t
域只能通过执行标有passwd_exec_t
类型的应用程序输入;只能从授权的共享库(如lib_t
类型)执行;且无法执行任何其他应用。- 只有
passwd_t
等授权域才能写入标有shadow_t
类型的文件。即使其他进程以超级用户特权运行,这些进程也无法写入标有shadow_t
类型的文件,因为它们不在passwd_t
域中运行。 - 只有授权域才能转换到
passwd_t
域。例如,sendmail
_tpasswd_t
域。 - 在
passwd_t
域中运行的进程只能读取和写入授权类型,例如标有etc_t
或shadow_t
类型的文件。这样可防止passwd
应用程序在读取或写入任意文件中变得复杂。