22

我正在设置一个最小的 chroot 并希望避免其中包含 sudo 或 su 但仍以非 root 身份运行我的进程。这是一个小技巧,因为运行 chroot 需要 root。我可以编写一个程序来执行此操作,如下所示:

uid = LookupUser(args[username])  // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])

这是我最好的选择还是有一个标准工具可以为我做到这一点?


我在这里推出了自己的:

4

6 回答 6

26

如果chroot从 root 调用,该chroot选项--userspec=USER:GROUP将在非 root UID/GID 下运行命令。

顺便说一句,根据 git repository ,选项“--userspec”首先在 coreutils-7.5 中引入git://git.sv.gnu.org/coreutils

于 2011-07-19T12:43:24.367 回答
19

fakechrootfakeroot结合使用,将允许您执行此操作。它们将使所有正在运行的程序都像在以 root 身份在 chroot 中运行一样运行,但实际上它们会以您的身份运行。

另请参见fakechroot 的手册页

于 2010-09-17T20:25:30.203 回答
10

您可以利用 linux 功能使您的二进制文件能够调用 chroot() 而不是 root。例如,您可以对chroot二进制文件执行此操作。作为非root用户,通常你会得到这个:

$ chroot /tmp/
chroot: cannot change root directory to /tmp/: Operation not permitted

但是在你运行setcap命令之后:

sudo setcap cap_sys_chroot+ep /usr/sbin/chroot 

它会让你进行 chroot 调用。

我不建议您对系统执行此操作chroot,而是对您自己的程序执行此操作并调用 chroot。这样您就可以更好地控制正在发生的事情,甚至可以在调用 cap_sys_chroot 权限后删除它,因此在程序中对 chroot 的连续调用将失败。

于 2011-07-20T14:40:18.423 回答
9

自定义 chrooter 一点也不难写:

#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
const char newroot[]="/path/to/chroot";
int main(int c, char **v, char **e) {
    int rc; const char *m;
    if ( (m="chdir" ,rc=chdir(newroot)) == 0
      && (m="chroot",rc=chroot(newroot)) == 0
      && (m="setuid",rc=setuid(getuid())) == 0 )
            m="execve", execve(v[1],v+2,e);
    perror(m);
    return 1;
}

将该 setuid 设为 root 并由您将喜欢的用户添加到的自定义组拥有(并且没有“其他”访问权限)。

于 2013-05-12T01:41:28.797 回答
2

您可以使用 Linux 容器创建一个位于完全不同命名空间(IPC、文件系统甚至网络)中的 chroot 环境

甚至还有 LXD 能够管理基于镜像的容器的创建并将它们配置为作为非特权用户运行,这样如果不受信任的代码设法以某种方式逃离容器,它将只能以非特权用户的身份执行代码,并且不作为系统的根。

在您最喜欢的搜索引擎上搜索“Linux Containers”和“LXD”;)

于 2017-02-18T12:26:53.680 回答
1
于 2021-03-26T10:53:45.690 回答