Как запустить команду в chroot-тюрьме не как root и без sudo? - PullRequest
21 голосов
/ 17 сентября 2010

Я устанавливаю минимальный 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:])

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


Я свернул свой здесь :

Ответы [ 5 ]

24 голосов
/ 19 июля 2011

Если вы вызываете chroot от пользователя root, опция chroot --userspec=USER:GROUP будет запускать команду под UID / GID без полномочий root.

Кстати, опция '--userspec' впервые введена в coreutils-7.5 в соответствии с репозиторием git git://git.sv.gnu.org/coreutils.

17 голосов
/ 18 сентября 2010

fakechroot в сочетании с fakeroot позволит вам сделать это. Они заставят все работающие программы работать так, как если бы они запускались в chroot как root, но на самом деле они будут работать как вы.

См. Также Справочная страница fakechroot .

9 голосов
/ 12 мая 2013

Пользовательский 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 и принадлежащим пользовательской группе, к которой вы добавляете своего привилегированного пользователя (и не имеете «другого» доступа).

8 голосов
/ 20 июля 2011

Вы можете использовать возможности 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 в вашей программе не будут выполнены.

2 голосов
/ 18 февраля 2017

Вы можете использовать Linux Containers для создания среды chroot, которая находится в совершенно другом пространстве имен (IPC, файловая система и даже сеть)

Существует даже LXD, который может управлять созданием на основе изображенийконтейнеры и настройте их так, чтобы они выполнялись как непривилегированные пользователи, так что если ненадежному коду удастся каким-либо образом покинуть контейнер, он сможет выполнять код только как непривилегированный пользователь, а не как корень системы.

Поиск 'Linux Containers' и 'LXD' в вашей любимой поисковой системе;)

...