如果我是 root,我可以简单地创建一个虚拟用户/组,相应地设置文件权限并以该用户身份执行该过程。但是我不是,所以有没有办法在没有root的情况下实现这一目标?
在阅读了 Linux 命名空间之后,我的印象是,在许多其他功能中,它们是 chroot 的替代品。例如,在这篇文章中:
[名称空间] 的其他用途包括 [...] chroot() 式将进程隔离到单个目录层次结构的一部分。
但是,当我克隆 mount 命名空间时,例如使用以下命令,我仍然看到整个原始根树。
unshare --mount -- /bin/bash
Run Code Online (Sandbox Code Playgroud)
我知道我现在能够在不与原始命名空间共享的新命名空间中执行额外的挂载,因此这提供了隔离,但它仍然是同一个根,例如/etc
两个命名空间仍然相同。我还需要chroot
更改根目录还是有其他选择?
我期待这个问题会提供答案,但答案chroot
再次仅使用, 。
有一条现已删除的评论提到pivot_root
。由于这实际上是 的一部分linux/fs/namespace.c
,因此它实际上是名称空间实现的一部分。这表明仅使用unshare
和更改根目录mount
是不可能的,但命名空间提供了一个自己的——更聪明的—— chroot
. chroot
即使在阅读源代码之后(例如在安全性或更好的隔离的意义上),我仍然不明白这种方法的主要思想,这使得它与 根本不同。
这不是这个问题的重复。执行完答案中的所有命令后,我有单独的 /tmp/tmp.vyM9IwnKuY(或类似的),但根目录仍然相同!
我的 Linux 内核在构建时必须使用user_namespaces进行配置,但它们的使用在启动后受到限制并且必须显式启用。我应该使用哪个 sysctl?
(如果它被打开,这将允许运行像 一样的隔离命令unshare --user --map-root-user --mount-proc --pid --fork
,然后在chroot
没有 root身份的情况下执行——这是 Linux 备受期待的特性。)
我正在使用 unshare 来创建每个进程的挂载,它运行得非常好
unshare -m --map-root-user
Run Code Online (Sandbox Code Playgroud)
但是,在创建了我的绑定安装之后
mount --bind src dst
Run Code Online (Sandbox Code Playgroud)
我想将 UID 更改为我的原始用户,以便whoami
(和其他人)像echo $USER
这样响应我的用户名。
我已经尝试过Simulate chroot with unshare的答案
但是,在做su – user1
之后chroot /
,我得到
su: Authentication failure
(Ignored)
setgid: Invalid argument
Run Code Online (Sandbox Code Playgroud)
我已经在 Ubuntu 18.04 Beta、Debian stretch、openSUSE-Leap-42.3 上测试过这个。全部都是一样。我猜自从这个答案起作用以来,内核中发生了一些变化。
什么是可行且正确的方法来做到这一点(当然没有真正的根)?
为什么chroot(2)
非特权用户无法使用?
我不明白互联网上的现有答案。例如这个https://lists.freebsd.org/pipermail/freebsd-security/2003-April/000123.html。
将sudo
真正的工作,如果/etc/sudoers
和/etc
被所有者不是root?非特权用户不能只在 chroot 中创建 root 拥有的 setuid 二进制文件,是吗?
一个非特权用户究竟如何破坏 chroot 环境?
我只能想到这样的事情
ln /mnt/backup/XYZ/etc/sudoers $CHROOT/etc/sudoers
ln /usr/bin/sudo $CHROOT/usr/bin/sudo
Run Code Online (Sandbox Code Playgroud)
whereXYZ
表示一些备份实例,管理员真的搞砸了并允许我的用户做一些危险的事情。但这有点特别。chroot(2)
如果非特权用户可以使用它,是否还有更直接的利用方法?
目标是在主机 Linux 系统内的置换(重新定位)发行版(其 / 不得与全局 / 重合)中安装和运行程序。这些程序不适用于使用不同的 / 。
fakechroot 不是一个完整的解决方案,因为它使用库替换而不是在系统调用级别上进行操作(因此不适用于静态链接的二进制文件)。