Подтвердить что ты не робот

Как запустить команду в 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:])

Это мой лучший выбор или есть стандартный инструмент, который делает это для меня?


Я перекатил свой здесь:

4b9b3361

Ответ 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" в вашей любимой поисковой системе;)