chroot com unionfs-fuse, não consigo acessar / dev / *

6

Eu criei uma jaula chroot em combinação com unionfs-fuse para que eu não precise instalar outro sistema dentro dela.

No entanto, as entradas / dev do sistema resultante não são legíveis. Isso está causando problemas nos programas que precisam de acesso a /dev/random , /dev/null e /dev/urandom .

Eu mesmo tentei resolver o problema fazendo um diretório que consiste em arquivos persistentes e fazendo equivalentes dos arquivos mencionados acima usando mknod como descrito aqui e, em seguida, criando um unionfs:

# unionfs-fuse -o cow /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/

E então,

# chroot chroot/

Mas, quando tento:

# head -c 10 /dev/random | hexdump -C

Eu recebo o erro:

head: cannot open '/dev/random' for reading: Permission denied

Como devo resolver este problema?

(não preciso de acesso a outros arquivos em /dev como /dev/sd* ou /dev/mem .)

    
por user2064000 15.12.2014 / 03:08

1 resposta

2

A explicação está na mount.fuse man page :

Filesystems are mounted with nodev,nosuid by default, which can only be overridden by a privileged user

Com a opção nodev , o kernel bane todo o acesso aos dispositivos no sistema de arquivos montado. Com a opção nosuid , o kernel ignora os atributos setuid e setgid. Ambas as opções são necessárias para a segurança quando um sistema de arquivos é montado por um usuário não-root: caso contrário, o usuário de montagem pode criar um shell raiz setuid ou dispositivos permitindo que ele acesse todos os discos ignorando o sistema de arquivos.

Você também desejará a opção allow_other se usuários não-root acessarem esse sistema de arquivos.

unionfs-fuse -o cow,dev,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/

Se você quiser restringir quais dispositivos estão visíveis no chroot, uma montagem de união não é a maneira de fazer isso. Em vez disso, deixe dev off e monte um sistema de arquivos separado contendo o /dev mínimo desejado. Você pode fazer isso um tmpfs:

unionfs-fuse -o cow,suid,allow_other /chroot/files=RW:/chroot/persistent/:/ /chroot/chroot/
mount -t tmpfs -o mode=755 chroot-dev /chroot/chroot/dev
cp -a /dev/null /dev/zero /dev/urandom /chroot/chroot/dev
mkdir /chroot/chroot/dev/pts
mount --bind /dev/pts /chroot/chroot/dev/pts

Em vez de um tmpfs, você pode montar um diretório contendo seus dispositivos prontos para serem ligados. Você precisará vincular-montar /dev/pts para obter pseudoterminals no chroot.

    
por 16.12.2014 / 03:29