6.8. 在 MLS 中将系统管理与安全管理分离

默认情况下,sysadm_r 角色具有 secadm_r 角色的权限,这意味着具有 sysadm_r 角色的用户可以管理安全策略。如果需要对安全授权进行更多控制,您可以通过将 Linux 用户分配给 secadm_r 角色并在 SELinux 策略中禁用 sysadm_secadm 模块将系统管理与安全管理分开。

先决条件

  • SELinux 策略被设置为 mls
  • SELinux 模式设置为 enforcing
  • 已安装 policycoreutils-python-utils 软件包。
  • 分配给 secadm_r 角色的 Linux 用户:

    • 该用户被分配给 staff_u SELinux 用户
    • 定义了此用户的密码。
    警告

    确保您可以以用户 身份登录,这将分配给 secadm 角色。如果不能,您可以防止以后修改系统的 SELinux 策略。

步骤

  1. 为用户在 /etc/sudoers.d 目录中创建一个新的 sudoers 文件:

    # visudo -f /etc/sudoers.d/<sec_adm_user>

    为保持 sudoers 文件的组织,请 <sec_adm_user> 替换为将分配给 secadm 角色的 Linux 用户。

  2. /etc/sudoers.d/<sec_adm_user> 文件中添加以下内容:

    <sec_adm_user> ALL=(ALL) TYPE=secadm_t ROLE=secadm_r ALL

    此行授权所有主机上的 <secadmuser> 用户执行所有命令,并默认将用户映射到 secadm SELinux 类型和角色。

  3. <sec_adm_user> 用户身份登录:

    注意

    为确保 SELinux 上下文(由 SELinux 用户、角色和类型组成),使用 ssh、控制台或 xdm 登陆。susudo 等其他方法无法更改整个 SELinux 上下文。

  4. 验证用户的安全上下文:

    $ id
    uid=1000(<sec_adm_user>) gid=1000(<sec_adm_user>) groups=1000(<sec_adm_user>) context=staff_u:staff_r:staff_t:s0-s15:c0.c1023
  5. 为 root 用户运行交互式 shell:

    $ sudo -i
    [sudo] password for <sec_adm_user>:
  6. 验证当前用户的安全上下文:

    # id
    uid=0(root) gid=0(root) groups=0(root) context=staff_u:secadm_r:secadm_t:s0-s15:c0.c1023
  7. 从策略中禁用 sysadm_secadm 模块:

    # semodule -d sysadm_secadm
    重要

    使用 semodule -d 命令,而不是使用 semodule -r 命令删除系统策略模块。semodule -r 命令从您的系统存储中删除模块,这意味着无法重新安装 selinux-policy-mls 软件包。

验证

  1. 作为分配给 secadm 角色的用户,并在 root 用户的交互式 shell 中验证您可以访问安全策略数据:

    # seinfo -xt secadm_t
    
    Types: 1
       type secadm_t, can_relabelto_shadow_passwords, (...) userdomain;
  2. 从 root shell 注销:

    # logout
  3. 登出 <sec_adm_user> 用户:

    $ logout
    Connection to localhost closed.
  4. 显示当前安全上下文:

    # id
    uid=0(root) gid=0(root) groups=0(root) context=root:sysadm_r:sysadm_t:s0-s15:c0.c1023
  5. 尝试启用 sysadm_secadm 模块。该命令应该失败:

    # semodule -e sysadm_secadm
    SELinux:  Could not load policy file /etc/selinux/mls/policy/policy.31:  Permission denied
    /sbin/load_policy:  Can't load policy:  Permission denied
    libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory).
    SELinux:  Could not load policy file /etc/selinux/mls/policy/policy.31:  Permission denied
    /sbin/load_policy:  Can't load policy:  Permission denied
    libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory).
    semodule:  Failed!
  6. 尝试显示有关 sysadm_t SELinux 类型的详情。该命令应该失败:

    # seinfo -xt sysadm_t
    [Errno 13] Permission denied: '/sys/fs/selinux/policy'