chroot: Alterando o Diretorio Raiz para Isolar um Ambiente

chroot: Alterando o Diretorio Raiz para Isolar um Ambiente

O Que Voce Vai Aprender

  • Como o chroot troca 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, /proc e /sys antes 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 chroot requer privilegios de root (CAP_SYS_CHROOT)
  • O comando chroot vem 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 ($SHELL ou /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/bash

Ambientes 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, /proc e /sys nele 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 (ps enxerga processos externos, e voce pode usar kill neles)
  • Rede (a mesma pilha de rede e compartilhada)
  • Usuarios e privilegios (root dentro do chroot e o root do host)
  • O kernel (compartilhado)

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

Proximas Leituras