如何在chroot jail中运行命令而不是root和没有sudo?

时间:2010-09-17 16:06:36

标签: linux system chroot

我正在设置一个最小的chroot,并希望避免使用sudo或su,但仍然以非root身份运行我的进程。这是运行chroot requiers root的一个技巧。我可以编写一个程序,它看起来像这样:

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

这是我最好的选择,还是有一个标准工具可以帮助我?


我推出了自己的here

6 个答案:

答案 0 :(得分:24)

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

顺便说一下,根据git存储库git://git.sv.gnu.org/coreutils首先在coreutils-7.5中引入了'--userspec'选项。

答案 1 :(得分:17)

fakechrootfakeroot结合使用,可以让您这样做。他们会让正在运行的所有程序看起来像是以root身份运行在chroot中,但它们实际上会像你一样运行。

另见fakechroot's man page

答案 2 :(得分: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并由自定义组拥有,将您喜爱的用户添加到(并且没有“其他”访问权限。)

答案 3 :(得分:8)

你可以利用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将会失败。

答案 4 :(得分:2)

您可以使用Linux Containers创建一个完全不同的命名空间(IPC,filesytem甚至网络)的chroot环境

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

搜索Linux容器&#39;和&#39; LXD&#39;在你最喜欢的搜索引擎上;)

答案 5 :(得分:0)

现在可以使用 mount namespaces 提供的 unshare 命令在没有 root 权限的情况下进行 chroot。

Plain Unshare

假设您要 chroot 到 ~/Projects/my-backup 目录,并在其中运行 ~/Projects/my-backup/bin/bash 二进制文件。所以你运行:

$ unshare -mr chroot ~/Projects/my-backup/ /bin/bash

这里:

  • -m 表示您可以在新的 chroot 中使用 mount --bind (注意,外部世界无法看到挂载,只有您的 chroot 才能看到)
  • -r 让它看起来好像你是 chroot 中的 root
  • chroot … 是常用的 chroot 命令。

可能的陷阱:

  1. 确保您已正确设置环境变量。例如,在从 Archlinux chroot 到 Ubuntu 时,我收到了 bash: ls: command not found 之类的错误。结果,我的 $PATH 不包含 /bin/ (在 Archlinux 上它是 /usr/bin/ 的符号链接),所以我不得不运行:

    PATH=$PATH:/bin/ unshare -mr chroot ~/Projects/my-backup/ /bin/bash
    
  2. 请注意,/proc/dev 文件系统不会被填充,因此运行需要它们的二进制文件将失败。有一个 --mount-proc 选项,但非 root 用户似乎无法访问它。

  3. chown 将无法工作,除非您使用 newuidmapnewgidmap 命令进行一些复杂的设置。

Buildah Unshare

与普通的 unshare 相比,这具有优势,因为它负责 chown 命令开始工作所需的设置。您只需确保已为用户定义了 /etc/subuid/etc/subgid 中的范围。

你运行它:

$ buildah unshare chroot ~/Projects/my-backup/ /bin/bash