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中,但它们实际上会像你一样运行.
自定义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并由自定义组拥有,将您喜爱的用户添加到(并且没有"其他"访问权限).
你可以利用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将会失败.