温馨提示×

SELinux如何管理用户权限

小樊
33
2025-12-26 01:20:45
栏目: 智能运维

SELinux 用户权限管理

核心模型与关键概念

  • SELinux 通过给每个 Linux 用户映射一个 SELinux 用户(以 _u 结尾),并由该 SELinux 用户所关联的 角色(以 _r 结尾) 决定可进入的 域(以 _t 结尾),从而施加访问控制。登录后用户的 SELinux 用户身份不可更改,但角色与域可在策略允许的范围内转换。进程的安全上下文形如:user_u:user_r:user_t。系统内置常见 SELinux 用户包括:unconfined_u、guest_u、xguest_u、user_u、staff_u、sysadm_u、system_u;其中 system_u 专用于系统进程与对象,禁止分配给 Linux 用户。未受限用户仍受 可执行/可写内存检查MCS/MLS 约束。

查看与映射管理

  • 查看当前 Linux 用户到 SELinux 用户的映射:
    • 命令:semanage login -l(需要 root)
    • 示例输出:
      Login Name   SELinux User   MLS/MCS Range     Service
      __default__  unconfined_u   s0-s0:c0.c1023    *
      root         unconfined_u   s0-s0:c0.c1023    *
      
    • 含义:未显式映射的 Linux 用户默认走 default → unconfined_u
  • 查看可用的 SELinux 用户及其默认角色/范围:
    • 命令:semanage user -l
  • 将 Linux 用户映射到指定的 SELinux 用户(示例将 alice 映射为 staff_u):
    • 命令:semanage login -a -s staff_u alice
  • 验证登录后的 SELinux 身份:
    • 命令:id -Z(应见形如:staff_u:staff_r:staff_t:…)
  • 注意:登录会话建立后,SELinux 用户身份不会改变;如需调整,需重新登录或按策略定义的转换流程进行。

角色与权限控制

  • SELinux 的权限最终由“类型强制(TE)”决定,角色是连接用户与域的桥梁。常用角色与典型能力如下(不同发行版/策略细节可能略有差异):
角色 典型域 关键能力/限制
unconfined_r unconfined_t 几乎不受限;仍受 execmem/writable memory 与 MCS/MLS 检查
guest_r guest_t 不能访问网络;可在 /tmp/home 执行
xguest_r xguest_t 可登录 X;仅允许浏览器网络访问;可在 /tmp/home 执行
user_r user_t 常规非特权用户;可在 /tmp/home 执行
staff_r staff_t 类似 user_r,且可通过 sudo 执行管理命令(角色切换但 SELinux 用户不变)
sysadm_r sysadm_t 系统管理域;需显式授权与策略支持
  • 重要限制与布尔开关:
    • guest_t、xguest_t、user_t 默认仅能运行策略允许的 setuid 程序(如 passwd);这些域默认不能运行 su/sudo,因此不能借此提权为 root。
    • 默认情况下,staff_t、user_t、guest_t、xguest_t 可在其 $HOME/tmp 执行程序;可通过布尔值收紧,例如将 guest_exec_contentxguest_exec_content 设为 off,阻止在可写目录执行。
    • xguest_r 的网络通常限制为浏览器访问;相关布尔如 xguest_connect_network 可开关其网络能力。
    • 列出与查看布尔值:semanage boolean -l(需 root)。

常见管理操作与示例

  • 将普通用户改为受限用户(示例:把 bob 映射为 user_u):
    • 映射:semanage login -a -s user_u bob
    • 验证:id -Z(应见 user_u:user_r:user_t:…)
  • 允许受限用户通过 sudo 执行管理命令(以 staff_u 为例):
    • /etc/sudoers/etc/sudoers.d/ 中为相应用户配置允许的规则;当 staff_t 使用 sudo 时,策略可使其切换到 sysadm_r 并执行 sysadm_t 域的管理命令(是否允许、如何切换由策略与 sudoers 共同决定)。
  • 收紧“在可写目录执行”的风险(示例:禁止 xguest 在可写目录执行):
    • 关闭布尔:setsebool -P xguest_exec_content off
    • 说明:关闭后,xguest 将无法在其有写权限的目录中执行程序,降低被恶意代码利用的风险。
  • 排查访问被拒问题:
    • 查看 SELinux 状态与布尔:sestatus -v -b
    • 检查用户/角色/域映射:semanage login -lsemanage user -l
    • 观察 AVC 拒绝日志(使用 ausearch -m avc -ts recentjournalctl -xe),必要时临时切换为 permissive 模式进行验证(生产环境谨慎)。

0