使用 chroot 在已安装的文件系统上 chmod 4750 (但 chmod 750 可以工作)

使用 chroot 在已安装的文件系统上 chmod 4750 (但 chmod 750 可以工作)

我正在关注gentoo安装指南。但我坚持在更新世界集部分原因是我无法使用 emerge 安装 dbus。它无法更改其二进制文件的 SUID 权限,日志输出如下:

chmod 4750 /var/tmp/portage/sys-apps/dbus-1.10.18/image//usr/libexec/dbus-daemon-launch-helper;
...
chmod: changing permissions of '/var/tmp/portage/sys-apps/dbus-1.10.18/image//usr/libexec/dbus-daemon-launch-helper': Permission denied

例如:

我以 root 用户身份挂载文件系统:

mount /dev/sdb3 /mnt/gentoo

之后我 chroot 到它(也是 root 用户):

chroot /mnt/gentoo /bin/bash
source /etc/profile

并创建一个文件并尝试更改其权限

touch /hello
chmood 4750 /hello

没有说“权限被拒绝”。

然而,chmod 4750 /mnt/gentoo/hello从外部来看,文件系统工作正常。

为什么许可被拒绝?我也尝试过安装,-o suid但似乎也不起作用。

那么如何chmod 4750在不同的文件系统上工作呢?

更新: 当我在我的 linux mint 上做同样的事情时,它就可以工作了。从 gentoo livecd 失败。

答案1

您使用的 Gentoo livecd 可能正在引导强化的内核。如果是这样,您就会遇到强化内核施加的限制,这些限制会缩短从chroot环境内访问和修改内容的时间。我想到了 Setuid、GRUB 和 EFI。四位数表示法中的第一个数字 4chmod 4750指的是设置 setuid 位。该错误消息报告尝试被拒绝,因为它具有安全隐患。在三位数表示法中chmod 750设置这些权限是有效的,因为不涉及 setuid。

这个答案归功于 toralf、Hu 和 gengreen 在一次密切相关的讨论中的回答在 gentoo 论坛上

那么按照以下步骤您可能会发现有用:

  1. 检查当前运行的内核是否是“hardenend”,通常uname -r会返回一个字符串4.8.17-hardened-r2或类似的内容。

    # uname -r
    4.8.17-hardened-r2
    
  2. 检查你的内核配置是否允许 sysctl 本地配置,执行# zgrep GRKERNSEC_SYSCTL /proc/config.gz- 这样的结果就可以了:

    CONFIG_GRKERNSEC_SYSCTL=y
    CONFIG_GRKERNSEC_SYSCTL_ON=y
    
  3. 请务必在实际 chroot 环境之外执行此操作以及下一步。添加几行/etc/sysctl.conf- 考虑到您可能处于临时 chroot 环境中,无论如何这似乎没问题,如果不将这些添加到/etc/sysctl.d/local.conf

    kernel.grsecurity.chroot_deny_chmod = 0 
    kernel.grsecurity.chroot_caps = 0 
    kernel.grsecurity.chroot_deny_mount = 0 
    
  4. 最后一步,你运行# sysctl -p这些更改;它将重复步骤 3 中配置中设置的任何规则:

    # sysctl -p
    net.ipv4.ip_forward = 0
    kernel.grsecurity.chroot_deny_chmod = 0
    kernel.grsecurity.chroot_caps = 0
    kernel.grsecurity.chroot_deny_mount = 0
    

然后,再次跳入 chroot 环境(screen -x如果您像我一样,则通过)并发现emerge需要使用 SUID 更改权限可以正常工作。

(顺便说一句,由于补丁可用性有限,Gentoo 停止提供这些内容,请参阅LWN.net 上的文章。因此,那些配备 GUI 的现场环境需要谨慎使用,而且从来都不是一刀切的。)

答案2

听起来好像mount正在采用主机环境(livecd)的不可写状态。mount使用以下内容显式指定读/写:

mount -o rw /dev/sdb3 /mnt/gentoo

一定要先做到umount这一点。

相关内容