SELinux 从 unconfined_r 过渡到 user_r

Arj*_*kar 5 linux sudo selinux access-control

在 Fedora 18 机器上,我作为普通用户在安装过程中创建了以下 SELinux 上下文:

$ sestatus
SELinux status:                 enabled
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Run Code Online (Sandbox Code Playgroud)

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Run Code Online (Sandbox Code Playgroud)

我想使用受限的 selinux 角色运行一个程序user_r,而不是当前的角色unconfined_r,因此我使用受限的 SELinux 用户创建一个新用户user_r

# useradd -MN -Z user_u johndoe
# echo 'fubar' | passwd johndoe --stdin
Run Code Online (Sandbox Code Playgroud)

现在,我打开一个新的 tty 并johndoe使用登录agetty。它抱怨/home/johndoe不存在,但本质上,它让我登录。SELinux 上下文:

$ id -Z
user_u:user_r:user_t:s0
Run Code Online (Sandbox Code Playgroud)

user_u:user_r:user_t是完美的,也是我想要的。但我想在已经作为unconfined_u而不是作为新登录运行的脚本中实现这一点。我尝试过sudo

如果我使用sudo -u,我会得到:

$ sudo -u johndoe id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Run Code Online (Sandbox Code Playgroud)

这意味着 SELinux 用户不会改变。

我也尝试过:

$ sudo -r user_r -u johndoe id -Z
sudo: unconfined_u:user_r:user_t:s0-s0:c0.c1023 is not a valid context
sudo: unable to execute /bin/id: Invalid argument
Run Code Online (Sandbox Code Playgroud)

所以,那里也没有运气。

那么我怎样才能使用or (或其他任何东西)从unconfined_r角色过渡到 ?user_rsudosu

dom*_*472 4

您是否尝试过policycoreutils-sandbox解决方案?这正是您想要的。例如,如果您想在 SELinux 受限环境中执行 Firefox(不幸的是,但有充分理由,“沙箱”仅在 Red Hat 发行版上受支持):

/usr/bin/sandbox -X -t sandbox_web_t firefox
Run Code Online (Sandbox Code Playgroud)

SELinux 与其他基于 LSM 的 MAC 系统的区别在于其灵活性和可定制性。

这可以让你做你想做的事,即使它没有意义。一个先决条件是您至少了解基本原理和概念。

这里需要注意以下几点:

  • 如果您希望安全上下文中的“unconfined_u:user_r”组合有效,则 unconfined_u SELinux 身份安全标识符必须与 user_r SELinux 角色安全标识符关联。

这可以通过以下方式完成:

semanage user -m -L s0 -r s0-s0:c0.c1023 -R "unconfined_r system_r user_r" -P user unconfined_u
Run Code Online (Sandbox Code Playgroud)
  • 必须允许将 unconfined_r SELinux 角色安全标识符手动(在本例中通过 sudo)更改为 user_r SELinux 角色安全标识符。

这可以通过创建一个简单的策略模块来完成:

cat > myuser.te <<EOF
module myuser 1.0;
require { role unconfined_r, user_r; }
allow unconfined_r user_r;
EOF

checkmodule -M -m myuser.te -o myuser.mod
semodule_package -o myuser.pp -m myuser.mod
sudo semodule -i myuser.pp
Run Code Online (Sandbox Code Playgroud)
  • 需要告知 Sudo 应该将哪种 SELinux 类型安全标识符与指定的 user_r SELinux 角色安全标识符一起使用

    sudo -r user_r -t user_t id -Z

我相信我触及了所有考虑因素,但我可能忽略了一些,并且我的示例可能有错字。请参阅我提到的命令的手册页。