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

BCS*_*BCS 21 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:])
Run Code Online (Sandbox Code Playgroud)

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


在这里自己动手:

kam*_*mae 24

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

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


Eri*_*ven 18

fakechroot,与fakeroot结合,将允许你这样做.他们会让所有正在运行的程序看起来像是以root身份运行在chroot中,但它们实际上会像你一样运行.

另见fakechroot的手册页.

  • 由于我偶然发现了这个线程,甚至多年后,我需要补充一点:永远不要使用 chroot 来保证安全。https://lwn.net/Articles/252794/ (3认同)
  • 我需要一个真正的chroot,因为我将编译和运行不受信任的代码,可能包括内联ASM. (2认同)

jth*_*ill 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;
}
Run Code Online (Sandbox Code Playgroud)

制作setuid root并由自定义组拥有,将您喜爱的用户添加到(并且没有"其他"访问权限).


Cor*_*son 8

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

$ chroot /tmp/
chroot: cannot change root directory to /tmp/: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

但是在运行setcap命令后:

sudo setcap cap_sys_chroot+ep /usr/sbin/chroot 
Run Code Online (Sandbox Code Playgroud)

它会让你进行chroot调用.

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