chroot jail que pode acessar o sistema de arquivos

5

O chroot jails parece ser simplesmente um mundo diferente, sem interação com o sistema de arquivos real. Assim, todo o ambiente tem que ser replicado dentro do chroot, o que significaria fazer uma instalação completa de um sistema dentro dele.

No entanto, existe alguma maneira de fazer o chroot jail ter acesso de leitura ao sistema de arquivos principal? Além disso, eu também gostaria de ter a capacidade do chroot preferir seus próprios arquivos. Por exemplo, se /usr/bin/wget existir dentro dela, então isso deve ser preferido em relação ao /usr/bin/wget do sistema.

(Eu estou realmente procurando por algo que se comporta como Sandboxie .)

O acima é viável?

    
por user2064000 03.07.2014 / 19:19

2 respostas

7

Você pode vincular diretórios de montagem em sua raiz chroot com:

mount -o bind /x/y /chroot/x/y

(consulte man mount , seção "As montagens de bind"). Qualquer acesso a /chroot/x/y a partir de agora funciona exatamente como um acesso a /x/y : mesmas listagens de arquivos, mesmos conteúdos, mesmos inodes.

Note, no entanto, que isto coloca todo o diretório como está: um processo dentro do chroot que pode gravar no diretório será capaz de gravar no diretório "real" do lado de fora. Se você quer fazer a montagem dentro do chroot read-only, você precisa remontar explicitamente somente leitura após a ligação:

mount -o remount,ro /chroot/x/y

O original / x / y permanecerá como leitura-gravação, mas a cópia agora será somente leitura.

Para preferir cópias internas de arquivos , ou para permitir a gravação em alguns arquivos ou diretórios existentes sem afetar os originais, você pode usar um sistema de arquivos de união . Eles permitem que você sobreponha várias árvores de diretórios umas nas outras, especificando para onde as gravações vão e a ordem em que as leituras são resolvidas. Sistemas de arquivos comuns de união para Linux incluem aufs , Unionfs e unionfs-fuse . Os dois primeiros são módulos do kernel, enquanto o último usa o FUSE para executar um sistema de arquivos no espaço do usuário. Os módulos do kernel são geralmente mais rápidos, mas a versão do FUSE pode ser mais fácil de configurar, embora você possa evitar o uso de ferramentas externas de espaço do usuário do seu chroot. Você pode preparar os sistemas de arquivos do sindicato que quiser e, em seguida, fazer chroot neles.

Em cada caso, a abordagem básica é a mesma, algo como:

unionfs-fuse -o cow /jail/bin:/other/bin:/bin /chroot/bin

Isso cria uma montagem de união em /chroot/bin , que fornece os arquivos de /jail/bin priority, se existirem, depois tenta /other/bin/ e, de outro modo, mostra os arquivos em /bin . -o cow faz copy-on-write: tentativas de gravar, digamos, /chroot/bin/foo copia /bin/foo para /jail/bin/foo e salva as modificações lá. Se você não quiser esse comportamento, deixe a opção de fora. Os outros sistemas de arquivos têm configurações ligeiramente diferentes, mas o princípio é o mesmo.

Seja qual for o modo de configuração, você pode:

chroot /chroot

e faça tudo funcionar do jeito que você queria.

    
por 04.07.2014 / 01:09
2

mount -o bind deve fazê-lo para diretórios completos.

mount -o bind /bin /chroot/bin e chroot /chroot

Acabaria com uma cópia dos seus sistemas / bin dentro do chroot.

Para que sua cópia do bash supersede / chroot / bin / bash trate da mesma maneira que fazemos hoje, coloque-a em / chroot / usr / local / bin e configure PATH de acordo.

    
por 03.07.2014 / 22:03