SELinux 从 unconfined_r 转换到 user_r

SELinux 从 unconfined_r 转换到 user_r

在 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

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

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

# useradd -MN -Z user_u johndoe
# echo 'fubar' | passwd johndoe --stdin

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

$ id -Z
user_u:user_r:user_t:s0

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

这意味着 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

所以,那里也没有运气。

那么我该如何使用或(或其他任何内容)从unconfined_r角色转换为?user_rsudosu

答案1

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

/usr/bin/sandbox -X -t sandbox_web_t firefox

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
  • 必须允许将 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
  • Sudo 需要被告知应该使用哪种 SELinux 类型安全标识符以及指定的 user_r SELinux 角色安全标识符

    sudo -r 用户_r -t 用户_t id -Z

我相信我已经提到了所有注意事项,但我可能忽略了一些,我的示例可能有拼写错误。请参阅我提到的命令的手册页。

答案2

使用时美国职业足球大联盟,你的命令

sudo -u johndoe id -Z

意味着你正在通过你的角色类型您可以使用 sudo 命令

sudo -r user_r -u johndoe id -Z

此外,如果您尝试使用控制台或 ssh 登录,您也可以看到正确的角色和类型。

编辑:id -Z我也想给出一些说明。如果没有有效的转换,则无法更改上下文 ( )。您将收到类似以下错误

sudo: ... is not a valid context

要成为 root,首先你应该sudoers文件和staff_uselinux 用户。对于 sudo,我喜欢只添加myuser ALL=/bin/su使用sudo su -。在我sudo su -成为 root 之后,我执行newrole -r sysadm_r以获得系统管理员权限。这并不奇怪,因为 sudo 无法更改角色。同样,在退出前我执行newrole -r staff_r返回自己的角色。退出后我退出,否则 shell 会挂起(有效上下文错误)。

答案3

这很棘手。我通过黑客手段找到了一些办法。首先,将脚本写入文件中。然后,使用semanage fcontext添加标签规则。SELinux 会以某种方式使用此标签来应用限制。在我的示例中,我正在重现 postgres 上下文。

# semanage fcontext -a -s system_u -t postgresql_exec_t /absolute/path/to/my-script
# restorecon -v my-script

SELinux 知道一些转换。例如,systemd 在 init_t 中运行,标有 postgresql_exec_t 的文件在 postgresql 上下文中转换。因此,我编写了一个一次性 systemd 服务来重用该转换。

# /etc/systemd/system/multi-users.target.wants/my-script.service
[Unit]
Description=My Script
After=syslog.target
After=network.target

[Service]
Type=oneshot

User=postgres
Group=postgres

ExecStart=/usr/local/bin/cornac-selinux

然后运行systemctl

# systemctl start my-script.service
# journalctl -n 10 --no-pager
août 19 15:19:11 bernace-db0 cornac-selinux[14928]: + id                                                                                
août 19 15:19:11 bernace-db0 cornac-selinux[14928]: uid=26(postgres) gid=26(postgres) groupes=26(postgres) contexte=system_u:system_r:postgresql_t:s0                                                                                                                            

这是迄今为止我能做的最好的事情,无需编写自定义策略模块。

相关内容