Как запустить команду в chroot тюрьме не как root и без sudo?
Я создаю минимальный chroot и хочу избежать использования sudo или su в нем, но все же запускаю мои процессы как non-root. Это немного хитрость, как root root root. Я мог бы написать программу, которая будет выглядеть так:
uid = LookupUser(args[username]) // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])
Это мой лучший выбор или есть стандартный инструмент, который делает это для меня?
Я перекатил свой здесь:
Ответы
Ответ 1
Если вы вызываете chroot
из root, опция chroot
вам поможет.
Команда chroot
имеет опцию --userspec=USER:GROUP
для запуска с использованием не-root UID/GID.
Кстати, опция "--userspec" сначала вводится в coreutils-7.5 в соответствии с репозиторием git git://git.sv.gnu.org/coreutils
.
Ответ 2
fakechroot, в сочетании с fakeroot, позволит вам это сделать. Они будут делать все программы, которые работают, как если бы они выполнялись в chroot как root, но они фактически будут работать как вы.
См. также справочная страница fakechroot.
Ответ 3
Вы можете использовать возможности 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
Пользовательский 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 и принадлежите к пользовательской группе, в которую вы добавите своего любимого пользователя (и никакого "другого" доступа).
Ответ 5
Вы можете использовать контейнеры Linux для создания среды chroot, которая находится в совершенно другом пространстве имен (IPC, fileytem и даже сети).
Существует даже LXD, который может управлять созданием контейнеров на основе изображений и настраивать их для запуска как непривилегированных пользователей, так что, если ненадежный код справится с каким-то образом избежать контейнера, он сможет выполнять только код как непривилегированный пользователь, а не как системный корень.
Поиск "Контейнеры Linux" и "LXD" в вашей любимой поисковой системе;)