在 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 并使用 登录johndoe
。agetty
它抱怨/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_r
sudo
su
答案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
这是迄今为止我能做的最好的事情,无需编写自定义策略模块。