3.3. 受限制和未限制的用户
每个 Linux 用户都使用 SELinux 策略映射到 SELinux 用户。这可允许 Linux 用户继承对 SELinux 用户的限制。此 Linux 用户映射可以通过以 root 身份运行 semanage login -l 命令来查看:
~]#
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 *
在 Red Hat Enterprise Linux 中,Linux 用户默认映射到 SELinux
__default__
登录,该登录映射到 SELinux unconfined_u
用户。下面一行定义了默认映射:
__default__ unconfined_u s0-s0:c0.c1023
下面的步骤演示了如何在系统中添加新 Linux 用户,以及如何将该用户映射到 SELinux
unconfined_u
用户。它假设 root 用户运行没有限制,这与 Red Hat Enterprise Linux 中的默认设置相同:
过程 3.4. 将新的 Linux 用户映射到 SELinux unconfined_u
用户
- 以 root 用户身份,输入以下命令来创建名为
newuser
的新 Linux 用户:~]#
useradd newuser - 要为 Linux
newuser
用户分配密码。以 root 用户身份输入以下命令:~]#
passwd newuser Changing password for user newuser. New UNIX password: Enter a password Retype new UNIX password: Enter the same password again passwd: all authentication tokens updated successfully. - 从当前会话中注销,然后以 Linux
newuser
用户身份登录。当您登录时,pam_selinux PAM 模块会自动将 Linux 用户映射到 SELinux 用户(本例中为unconfined_u
),并设置生成的 SELinux 上下文。然后,将使用此上下文启动 Linux 用户的 shell。输入以下命令查看 Linux 用户的上下文:[newuser@localhost ~]$
id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023注意如果您不再需要系统中的newuser
用户,请注销 Linuxnewuser
的会话,使用您的帐户登录,并以 root 用户身份运行 userdel -r newuser 命令。它将删除newuser
及其主目录。
受限制和不受限制的 Linux 用户会受到可执行和可写入的内存检查,也受到 MCS 或 MLS 的限制。
要列出可用的 SELinux 用户,请输入以下命令:
~]$
seinfo -u
Users: 8
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
请注意,seinfo 命令由 setools-console 软件包提供,该软件包默认不会安装。
如果一个未限制的 Linux 用户执行一个应用程序,这个应用程序被 SELinux 策略定义为可以从
unconfined_t
域转换到其自身限制域的应用程序,则未限制的 Linux 用户仍会受到那个受限制域的限制。这样做的安全优点是,即使 Linux 用户的运行没有限制,但应用程序仍受限制。因此,对应用程序中漏洞的利用会被策略限制。
同样,我们可以将这些检查应用到受限制的用户。每个受限制的 Linux 用户都受到一个受限的用户域的限制。SELinux 策略还可定义从受限制的用户域转换到自己受限制的目标域转换。在这种情况下,受限制的 Linux 用户会受到那个目标受限域的限制。重点是,根据用户的角色,把特定的权限与受限制的用户相关联。在下表中,您可以看到 Red Hat Enterprise Linux 中 Linux 用户的基本受限制域示例:
用户 | 角色 | 域 | X 窗口系统 | su 或 sudo | 在主目录和 /tmp 中执行(默认) | 网络 |
---|---|---|---|---|---|---|
sysadm_u | sysadm_r | sysadm_t | 是 | su 和 sudo | 是 | 是 |
staff_u | staff_r | staff_t | 是 | 仅 sudo | 是 | 是 |
user_u | user_r | user_t | 是 | 否 | 是 | 是 |
guest_u | guest_r | guest_t | 否 | 否 | 是 | 否 |
xguest_u | xguest_r | xguest_t | 是 | 否 | 是 | 仅 Firefox |
user_t
、guest_t
和xguest_t
域中的 Linux 用户只能在 SELinux 策略允许的情况下运行设置的用户 ID(setuid)应用程序(例如passwd
)。这些用户无法运行 su 和 sudo setuid 应用程序,因此无法使用这些应用程序成为 root 用户。sysadm_t
、staff_t
、user_t
和xguest_t
域中的 Linux 用户可以使用 X Window 系统和终端登录。- 默认情况下,
staff_t
、user_t
、guest_t
和xguest_t
域中的 Linux 用户可以在其主目录和/tmp
中执行应用程序。要防止他们在他们有写入访问权限的目录中执行应用程序(继承用户权限),请将guest_exec_content
和xguest_exec_content
布尔值设置为off
。这有助于防止有缺陷或恶意的应用程序修改用户的文件。有关允许和阻止用户在主目录和/tmp
中执行应用程序的信息,请参阅 第 6.6 节 “用户执行应用程序的布尔值”。 xguest_t
域中唯一网络访问 Linux 用户是 Firefox 连接到网页。
请注意,
system_u
是系统进程和对象的特殊用户身份。它绝对不能和 Linux 用户关联。另外,unconfined_u
和 root
是没有限制的用户。因此,它们没有包括在上述 SELinux 用户功能表中。
除了已提到的 SELinux 用户外,还有特殊的角色可以映射到这些用户。这些角色决定了 SELinux 允许这些用户可以做什么:
dbadm_r
只能管理与 Apache HTTP 服务器相关的 SELinux 类型。如需更多信息,请参阅 第 13.2 节 “类型”。dbadm_r
只能管理与 MariaDB 数据库和 PostgreSQL 数据库管理系统相关的 SELinux 类型。如需更多信息,请参阅 第 20.2 节 “类型” 和 第 21.2 节 “类型”。logadm_r
只能管理与syslog
和auditlog
进程相关的 SELinux 类型。secadm_r
只能管理 SELinux。auditadm_r
只能管理与audit
子系统相关的进程。
要列出所有可用的角色,请输入以下命令:
~]$
seinfo -r
如前所述,seinfo 命令由 setools-console 软件包提供,该软件包默认不会安装。
3.3.1. sudo 转换和 SELinux 角色
在某些情况下,受限制的用户需要执行需要 root 特权的管理任务。为此,此类受限制的用户必须使用 sudo 命令获得 受限的管理员 SELinux 角色。sudo 命令用于向可信用户授予管理访问权限。当用户在管理命令之前带有 sudo 时,系统会提示他们输入 自己的密码。然后,当它们经过身份验证并假定允许 命令时,将像 root 用户一样执行管理命令。
如 表 3.1 “SELinux 用户功能” 所示,默认只允许
staff_u
和 sysadm_u
SELinux 受限制的用户使用 sudo。当此类用户使用 sudo 执行命令时,可以根据 /etc/sudoers 配置文件中指定的规则或在 /etc/ sudoers
.d/
目录中的相应文件中(如果此类文件存在)更改其角色。
有关 sudo 的更多信息,请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 获取特权 部分。
过程 3.5. 配置 sudo 转换
此流程演示了如何设置 sudo,以将新创建的 SELinux_user_u 受限用户从 default_role_r 转换为 administrator_r 管理员角色。
注意
要为已存在的 SELinux 用户配置受限管理员角色,请跳过前两个步骤。
- 创建一个新的 SELinux 用户,并为这个用户指定默认 SELinux 角色和一个补充的受限管理员角色:
~]#
semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" SELinux_user_u - 设置默认的 SElinux 策略上下文文件。例如,要使用与
staff_u
SELinux 用户相同的 SELinux 规则,请复制staff_u
上下文文件:~]#
cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u - 将新创建的 SELinux 用户映射到现有 Linux 用户:
semanage login -a -s SELinux_user_u -rs0:c0.c1023 linux_user
- 在
/etc/sudoers.d/
目录中创建一个名为您的 Linux 用户的新配置文件,并将以下字符串添加到其中:~]#
echo "linux_user ALL=(ALL) TYPE=administrator_t ROLE=administrator_r /bin/bash " > /etc/sudoers.d/linux_user - 使用
restorecon
实用程序重新标记 linux_user 主目录:~]#
restorecon -FR -v /home/linux_user - 以新创建的 Linux 用户身份登录到该系统,检查用户是否标记了默认的 SELinux 角色:
~]$
id -Z SELinux_user_u:default_role_r:SELinux_user_t:s0:c0.c1023 - 运行 sudo,将用户的 SELinux 上下文更改为
/etc/sudoers.d/linux_user
中指定的补充 SELinux 角色。与 sudo 一起使用的-i
选项会导致执行交互式 shell:~]$
sudo -i~]#
id -Z SELinux_user_u:administrator_r:administrator_t:s0:c0.c1023
要更好地了解占位符,如 default_role_r 或 administrator_r,请参阅以下示例。
例 3.1. 配置 sudo 转换
这个示例创建了一个新的 SELinux 用户 restricted
_u
,默认分配了角色 staff_r
,并且配置了 sudo,将 restricted _u
角色从 staff_r
改为 webadm_r
。
- 在
sysadm_r
或unconfined_r
角色中以 root 用户身份输入所有以下命令。~]#
semanage user -a -r s0-s0:c0.c1023 -R "staff_r webadm_r" confined_u~]#
cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/confined_u~]#
semanage login -a -s confined_u -rs0:c0.c1023 linux_user~]#
restorecon -FR -v /home/linux_user~]#
echo "linux_user ALL=(ALL) ROLE=webadm_r TYPE=webadm_t /bin/bash " > /etc/sudoers.d/linux_user - 以新创建的 Linux 用户身份登录到该系统,检查用户是否标记了默认的 SELinux 角色:
~]$
id -Z confined_u:staff_r:staff_t:s0:c0.c1023~]$
sudo -i~]#
id -Z confined_u:webadm_r:webadm_t:s0:c0.c1023