chroot: Alterando o Diretorio Raiz para Isolar um Ambiente
O Que Voce Vai Aprender
- Como o
chroottroca o diretorio raiz que um processo enxerga - Como diagnosticar "o comando nao executa dentro do chroot" como um problema de bibliotecas compartilhadas
- Um fluxo de trabalho confiavel de recuperacao de sistema a partir de USB live ou modo de resgate
- Por que o chroot nao e um limite de seguranca e o que usar no lugar
Resumo Rapido
- O chroot apenas altera a visao do sistema de arquivos. Ele nao isola processos nem rede.
- O binario do comando e suas bibliotecas compartilhadas devem existir dentro da nova raiz.
- Para recuperacao, faca bind-mount de
/dev,/proce/sysantes do chroot. - Para isolamento real, use containers (namespaces), nao chroot.
Pre-requisitos
- SO: Familia Ubuntu / Debian (comandos sao identicos em sistemas da familia RHEL)
- Executar
chrootrequer privilegios de root (CAP_SYS_CHROOT) - O comando
chrootvem com o coreutils (nenhuma instalacao extra necessaria)
O Que e chroot?
Conclusao: O chroot altera o diretorio raiz aparente (
/) de um processo e seus filhos para um diretorio que voce especifica, de modo que esse processo nao consiga mais acessar arquivos fora da nova raiz.
Normalmente, todo processo resolve caminhos a partir da raiz do sistema /. Quando voce executa chroot /mnt/newroot, tudo abaixo desse ponto se torna o novo / para o processo afetado.
$ sudo chroot /mnt/newroot
A partir desse momento, o /etc/passwd do shell chrooted na verdade aponta para /mnt/newroot/etc/passwd. Qualquer coisa fora da nova raiz (o /home real do host, por exemplo) nao pode mais ser referenciada como caminho. E por isso que o chroot e descrito como "isolar um ambiente."
Um ambiente chrooted e convencionalmente chamado de chroot jail -- o processo esta "preso" e nao consegue ver a arvore de arquivos fora da sua nova raiz.
Por Que Usar chroot?
Conclusao: Os tres usos principais sao recuperacao de sistema, ambientes limpos de build/teste e confinamento de servico. Use-o quando quiser executar um comando contra um sistema de arquivos independente do que esta em execucao.
Casos de uso tipicos:
| Caso de uso | Exemplo |
|---|---|
| Recuperacao de sistema | Iniciar com USB live, chroot no SO que nao inicia, reinstalar grub ou redefinir uma senha |
| Ambiente limpo | Compilar um pacote dentro de uma raiz minima pristina criada com debootstrap |
| Confinamento | Restringir usuarios SFTP publicos ao seu diretorio home (sshd ChrootDirectory) |
| Validacao | Executar o userland de outra distro sobre o kernel existente |
O chroot nao troca o kernel. Mesmo que a nova raiz contenha bibliotecas e binarios diferentes, o kernel em execucao continua sendo o do host.
Como Executar chroot?
Conclusao: A sintaxe e
chroot NOVARAIZ [COMANDO]. Omita o comando e ele inicia o shell do usuario ($SHELLou/bin/sh) interativamente. Privilegios de root sao necessarios.
Sintaxe basica:
$ sudo chroot NOVARAIZ [COMANDO [ARG...]]
Sem um comando:
# Iniciar um shell interativo dentro da nova raiz $ sudo chroot /mnt/newroot
Com um comando explicito:
# Executar /bin/ls dentro da nova raiz e sair $ sudo chroot /mnt/newroot /bin/ls -l /
O caminho que voce fornece para COMANDO e absoluto relativo a nova raiz. chroot /mnt/newroot /bin/bash executa /mnt/newroot/bin/bash, nao o caminho do host.
O Que um Ambiente chroot Precisa?
Conclusao: Alem do binario do comando em si, as bibliotecas compartilhadas (arquivos
.so) das quais ele depende devem existir dentro da nova raiz. Caso contrario, ele falha com "No such file or directory."
Essa e a armadilha classica. Executar chroot /mnt/newroot /bin/bash falha se /mnt/newroot/bin/bash estiver ausente -- e mesmo quando o binario esta presente, as bibliotecas compartilhadas que o bash referencia tambem devem estar dentro da nova raiz.
Encontre as dependencias com ldd:
$ ldd /bin/bash
linux-vdso.so.1 (0x00007fff...)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f...)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f...)
/lib64/ld-linux-x86-64.so.2 (0x00007f...)
Copie cada .so para o mesmo caminho dentro da nova raiz e o bash funcionara. Um jail minimo construido manualmente:
$ NEWROOT=/mnt/jail
$ sudo mkdir -p $NEWROOT/{bin,lib,lib64}
$ sudo cp /bin/bash $NEWROOT/bin/
# Copie os arquivos .so reportados pelo ldd nos diretorios correspondentes
$ sudo cp /lib/x86_64-linux-gnu/{libtinfo.so.6,libc.so.6} $NEWROOT/lib/
$ sudo cp /lib64/ld-linux-x86-64.so.2 $NEWROOT/lib64/
$ sudo chroot $NEWROOT /bin/bashAmbientes chroot do mundo real sao construidos com debootstrap (Debian/Ubuntu) ou dnf --installroot (familia RHEL), que montam um userland completo com dependencias em um unico passo. Trate a copia manual acima como uma forma de entender o mecanismo.
Recuperando um Sistema com chroot
Conclusao: Para reparar um SO que nao inicializa, monte o disco, faca bind-mount de
/dev,/proce/sysnele e depois faca chroot. Isso permite operar o SO instalado quase como se tivesse inicializado normalmente.
Passos para entrar no SO instalado a partir de um USB live ou modo de resgate, assumindo que /dev/sda1 e a particao raiz:
# 1. Monte a particao raiz do alvo $ sudo mount /dev/sda1 /mnt # 2. Disponibilize os sistemas de arquivos virtuais via bind mounts $ sudo mount --bind /dev /mnt/dev $ sudo mount --bind /proc /mnt/proc $ sudo mount --bind /sys /mnt/sys # 3. Faca chroot no SO instalado $ sudo chroot /mnt # 4. Agora opere normalmente (ex: reinstalar o GRUB) # grub-install /dev/sda && update-grub
Sem /dev, /proc e /sys, comandos que leem informacoes do kernel ou dispositivos -- como grub-install ou operacoes de pacotes -- falharao. Esses bind mounts sao efetivamente obrigatorios para um chroot de recuperacao.
Quando terminar, saia do chroot antes de desmontar. Inverter a ordem resulta em target is busy.
# Saia do chroot primeiro # exit $ sudo umount /mnt/sys /mnt/proc /mnt/dev $ sudo umount /mnt
Alguns casos tambem precisam de /dev/pts (pseudo-terminais) ou /run. O arch-chroot (fornecido pelo Arch Linux mas utilizavel em outros sistemas) e um wrapper conveniente que configura esses bind mounts para voce.
O chroot e um Limite de Seguranca?
Conclusao: Nao. O chroot apenas altera a visao do sistema de arquivos; um processo com privilegios de root pode escapar dele usando tecnicas bem conhecidas. Use containers baseados em namespaces para isolamento real.
Tratar o chroot como sandbox e perigoso. Um processo executando como root dentro de um chroot pode escapar (um "chroot escape") com truques classicos como um chroot duplo. Isso e uma limitacao de design, nao um bug.
O que o chroot nao isola:
- A tabela de processos (
psenxerga processos externos, e voce pode usarkillneles) - Rede (a mesma pilha de rede e compartilhada)
- Usuarios e privilegios (root dentro do chroot e o root do host)
- O kernel (compartilhado)
Nao use chroot para isolar codigo nao confiavel ou separar inquilinos. Para isolamento genuino, use namespaces + cgroups (containers) ou maquinas virtuais. Remover o root do chroot para um usuario sem privilegios (capsh --drop, etc.) mitiga o risco mas ainda nao e um limite completo.
Para confinar de forma segura usuarios sem privilegios, opcoes praticas incluem o ChrootDirectory do sshd (confinamento somente SFTP) e configuracoes de servico do systemd como RootDirectory= combinado com PrivateDevices=.
Erros Comuns e Solucoes
Conclusao: A maioria das falhas se resume a bibliotecas compartilhadas ausentes, bind mounts ausentes ou privilegios insuficientes. Leia a mensagem de erro para distingui-las.
chroot: failed to run command '/bin/bash': No such file or directory
Se o binario do bash existe mas voce ainda ve este erro, as bibliotecas compartilhadas (incluindo o loader) estao ausentes dentro da nova raiz em quase todos os casos. Combine a saida do ldd /bin/bash na nova raiz (veja a secao de dependencias).
$ ldd /bin/bash # Execute no host para listar os arquivos .so necessarios
chroot: cannot change root directory to '/mnt': Operation not permitted
Voce nao tem privilegios de root -- adicione sudo. O mesmo erro aparece quando CAP_SYS_CHROOT foi removido, como dentro de um container.
Muitos "command not found" apos chroot
Ou o PATH nao corresponde ao layout da nova raiz, ou os comandos necessarios nao estao instalados. Uma raiz minima pode nao conter nem mesmo ls. Monte um userland completo com debootstrap ou similar.
umount reporta target is busy
Voce esta tentando desmontar antes de sair do shell chroot. Faca exit do chroot primeiro, depois desmonte na ordem /sys, /proc, /dev, /mnt.
Copie e cole: template seguro de chroot para recuperacao
# Entrar sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt # Apos o trabalho, saia do chroot e depois: sudo umount /mnt/sys /mnt/proc /mnt/dev sudo umount /mnt