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_uSELinux 用户相同的 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