代码之家  ›  专栏  ›  技术社区  ›  BCS

如何在chroot中运行命令而不是以root身份运行,并且没有sudo?

  •  21
  • BCS  · 技术社区  · 14 年前

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


    我自己滚 here :

    5 回复  |  直到 7 年前
        1
  •  25
  •   vy32    6 年前

    如果你调用 chroot 从根本上说 选项 --userspec=USER:GROUP

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

        2
  •  19
  •   Eric Warmenhoven    14 年前

    fakechroot fakeroot ,将允许您执行此操作。它们将使所有正在运行的程序看起来像是以root身份在chroot中运行,但实际上它们将以您的身份运行。

    fakechroot's man page .

        3
  •  9
  •   Corey Henderson    13 年前

    chroot 二元的。作为非根用户,通常会得到以下结果:

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

    但在你跑完 setcap 命令:

    sudo setcap cap_sys_chroot+ep /usr/sbin/chroot 
    

    它会让你做chroot调用。

    我不建议你对系统的 ,而是对自己的程序执行此操作并调用chroot。这样,您就可以更好地控制正在发生的事情,甚至可以在调用cap\u sys\u chroot特权之后放弃它,这样在程序中连续调用chroot就会失败。

        4
  •  9
  •   jthill    11 年前

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

        5
  •  2
  •   mike510a    8 年前

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

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

        6
  •  0
  •   Hi-Angel    3 年前

    这些天chrooting没有根权限是可能的 unshare 命令提供者 mount namespaces .

    普通取消共享

    假设你想进入 ~/Projects/my-backup 目录,并在其中运行 ~/Projects/my-backup/bin/bash 二元的。所以你跑:

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

    在这里:

    • -m mount --bind 新chroot内部 (请注意,外部世界看不到挂载,只有您的chroot才能看到挂载)
    • -r 使它看起来好像你是根里面的根
    • chroot …

    可能的陷阱:

    1. 确保环境变量设置正确。例如,当我从Archlinux进入一个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

    3. chown newuidmap newgidmap

    Buildah取消共享

    这比普通的有优势 取消共享 因为它负责 周恩来 命令开始工作。您只需确保已在中定义了范围 /etc/subuid /etc/subgid 为您的用户。

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