Como usar o comando chroot no Linux

O comando chroot pode mandá-lo para a prisão, manter seus ambientes de desenvolvimento ou teste isolados ou apenas melhorar a segurança do seu sistema. Mostramos a maneira mais fácil de usá-lo.

O que é um chroot?

Se você tentar medir a utilidade de um comando, deve levar em consideração a funcionalidade que ele oferece e sua facilidade de uso. Se for muito complicado para as pessoas usarem ou muito prolixo para fazer com que elas queiram tentar usá-lo, a funcionalidade pode muito bem ser zero. Se ninguém o usa, ele não fornece nenhuma funcionalidade.

Em discussões com usuários Linux – pessoalmente e em fóruns – parece que o comando chroot é considerado difícil de usar ou muito complicado e tedioso de configurar. Parece que esse utilitário incrível não é usado tanto quanto deveria.

Com o chroot você pode configurar e executar programas ou shells interativos como o Bash em um sistema de arquivos encapsulado que é impedido de interagir com seu sistema de arquivos regular. Tudo dentro do ambiente chroot é contido e contido. Nada no ambiente chroot pode ver além de seu próprio diretório raiz especial sem escalar para privilégios de root. Isso rendeu a esse tipo de ambiente o apelido de jaula chroot. O termo “prisão” não deve ser confundido com FreeBSD’s comando jail, que cria um ambiente chroot isso é mais seguro do que o ambiente chroot usual.

Mas, na verdade, há uma maneira muito direta de usar o chroot, que vamos examinar. Estamos usando comandos regulares do Linux que funcionarão em todas as distribuições. Algumas distribuições Linux têm ferramentas dedicadas para configurar ambientes chroot, como debootstrap para o Ubuntu, mas estamos sendo distro-agnósticos aqui.

Quando você deve usar um chroot?

Um ambiente chroot fornece funcionalidade semelhante à de uma máquina virtual, mas é uma solução mais leve. O sistema cativo não precisa de um hipervisor para ser instalado e configurado, como VirtualBox ou Virtual Machine Manager. Nem precisa ter um kernel instalado no sistema cativo. O sistema cativo compartilha seu kernel existente.

Em alguns sentidos, os ambientes chroot estão mais próximos de contêineres como LXC do que máquinas virtuais. Eles são leves, rápidos de implantar e a criação e ativação de um podem ser automatizadas. Como os contêineres, uma maneira conveniente de configurá-los é instalar apenas o suficiente do sistema operacional para realizar o que é necessário. A pergunta “o que é necessário” é respondida observando como você usará seu ambiente chroot.

  Como gerenciar Stashes Encfs no Linux

Alguns usos comuns são:

Desenvolvimento de software e verificação de produto. Os desenvolvedores escrevem o software e a equipe de verificação de produto (PV) o testa. Às vezes, problemas são encontrados pelo PV que não podem ser replicados no computador do desenvolvedor. O desenvolvedor tem todos os tipos de ferramentas e bibliotecas instaladas em seu computador de desenvolvimento que o usuário médio – e PV – não tem. Freqüentemente, um novo software que funciona para o desenvolvedor, mas não para outros, acaba usando um recurso no PC do desenvolvedor que não foi incluído na versão de teste do software. O chroot permite que os desenvolvedores tenham um ambiente simples em cativeiro em seu computador, no qual possam mergulhar o software antes de entregá-lo ao PV. O ambiente cativo pode ser configurado com as dependências mínimas que o software requer.

Reduzindo o risco de desenvolvimento. O desenvolvedor pode criar um ambiente de desenvolvimento dedicado para que nada do que aconteça possa atrapalhar seu PC real.

Executando software obsoleto. Às vezes, você só precisa ter uma versão antiga de algo em execução. Se o software antigo tiver requisitos que entrem em conflito ou sejam incompatíveis com a sua versão do Linux, você pode fazer o chroot de um ambiente para o software com problema.

Recuperação e atualizações do sistema de arquivos: Se uma instalação do Linux se tornar inoperante, você pode usar o chroot para montar o sistema de arquivos danificado em um ponto de montagem em um Live CD. Isso permite que você trabalhe no sistema danificado e tente consertá-lo como se ele estivesse montado normalmente em root /. Isso significa que os caminhos de arquivo esperados dentro do sistema danificado serão referenciados corretamente a partir do diretório raiz e não do ponto de montagem do Live CD. Uma técnica semelhante foi usada no artigo que descreve como migrar o sistema de arquivos Linux de ext2 ou ext3 para ext4.

Aplicativos de ringfencing. Executar um servidor FTP ou outro dispositivo conectado à Internet dentro de um ambiente chroot limita os danos que um invasor externo pode causar. Essa pode ser uma etapa valiosa para fortalecer a segurança do seu sistema.

Criando um ambiente chroot

Precisamos de um diretório para atuar como o diretório raiz do ambiente chroot. Para que tenhamos uma forma abreviada de nos referirmos a esse diretório, criaremos uma variável e armazenaremos o nome do diretório nela. Aqui, estamos configurando uma variável para armazenar um caminho para o diretório “testroot”. Não importa se esse diretório ainda não existe, vamos criá-lo em breve. Se o diretório existir, ele deve estar vazio.

chr=/home/dave/testroot

Se o diretório não existir, precisamos criá-lo. Podemos fazer isso com este comando. A opção -p (pais) garante que todos os diretórios pais ausentes sejam criados ao mesmo tempo:

mkdir -p $chr

Precisamos criar diretórios para conter as partes do sistema operacional que nosso ambiente chroot exigirá. Vamos configurar um ambiente Linux minimalista que usa o Bash como shell interativo. Também incluiremos os comandos touch, rm e ls. Isso nos permitirá usar todos os comandos internos do Bash e touch, rm e ls. Seremos capazes de criar, listar e remover arquivos e usar o Bash. E – neste exemplo simples – isso é tudo.

  4 melhores derivados do Arch Linux para experimentar

Liste os diretórios que você precisa criar no {} expansão da cinta.

mkdir -p $chr/{bin,lib,lib64}

Agora vamos mudar o diretório para o nosso novo diretório raiz.

cd $chr

Vamos copiar os binários que precisamos em nosso ambiente Linux minimalista de seu diretório regular “/ bin” para nosso diretório chroot “/ bin”. A opção -v (verbose) faz com que cp nos diga o que está fazendo enquanto executa cada ação de cópia.

cp -v /bin/{bash,touch,ls,rm} $chr

Os arquivos são copiados para nós:

Esses binários terão dependências. Precisamos descobrir o que são e copiar esses arquivos em nosso ambiente também, caso contrário, bash, touch, rm e ls não funcionarão. Precisamos fazer isso sucessivamente para cada um de nossos comandos escolhidos. Faremos o Bash primeiro. O comando ldd irá liste as dependências para nós.

ldd /bin/bash

As dependências são identificadas e listadas na janela do terminal:

Precisamos copiar esses arquivos em nosso novo ambiente. Escolher os detalhes dessa lista e copiá-los um de cada vez vai ser demorado e sujeito a erros.

Felizmente, podemos semi-automatizá-lo. Listaremos as dependências novamente e, desta vez, formaremos uma lista. Em seguida, percorreremos a lista copiando os arquivos.

Aqui, estamos usando o ldd para listar as dependências e alimentar os resultados por meio de um pipe no egrep. Usar egrep é o mesmo que usar grep com a opção -E (expressões regulares estendidas). A opção -o (apenas correspondência) restringe a saída às partes correspondentes das linhas. Estamos procurando por arquivos de biblioteca correspondentes que terminem em um número [0-9].

list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"

Podemos verificar o conteúdo da lista usando echo:

echo $list

Agora que temos a lista, podemos percorrê-la com o seguinte loop, copiando os arquivos um de cada vez. Estamos usando a variável i para percorrer a lista. Para cada membro da lista, copiamos o arquivo para nosso diretório raiz chroot, que é o valor mantido em $ chr.

A opção -v (verbose) faz com que cp anuncie cada cópia à medida que a executa. A opção –parents garante que quaisquer diretórios pais ausentes sejam criados no ambiente chroot.

for i in $list; do cp -v --parents "$i" "${chr}"; done

para i em $ list;  fazer cp -v --parents

E esta é a saída:

  Como jogar Psychonauts no Linux

Usaremos essa técnica para capturar as dependências de cada um dos outros comandos. E usaremos a técnica de loop para realizar a cópia real. A boa notícia é que só precisamos fazer uma pequena edição no comando que reúne as dependências.

Podemos recuperar o comando de nosso histórico de comandos pressionando a tecla de seta para cima algumas vezes e, em seguida, fazer a edição. O comando de cópia em loop não precisa ser alterado.

Aqui, usamos a tecla de seta para cima para encontrar o comando e a editamos para dizer toque em vez de bash.

list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"

Agora podemos repetir exatamente o mesmo comando de loop de antes:

for i in $list; do cp -v --parents "$i" "${chr}"; done

para i em $ list;  fazer cp -v --parents

E nossos arquivos são copiados para nós:

Agora podemos editar a linha de comando da lista para ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Novamente, usaremos o mesmo comando de loop. Não importa quais arquivos estão na lista. Ele analisa cegamente a lista, copiando os arquivos para nós.

for i in $list; do cp -v --parents "$i" "${chr}"; done

para i em $ list;  fazer cp -v --parents

E as dependências para ls são copiadas para nós:

Editamos a linha de comando da lista pela última vez, fazendo com que funcione para rm:

list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"

Usamos o comando de cópia em loop uma última vez:

for i in $list; do cp -v --parents "$i" "${chr}"; done

A última de nossas dependências é copiada em nosso ambiente chroot. Finalmente estamos prontos para usar o comando chroot. Este comando define a raiz do ambiente chroot e especifica qual aplicativo deve ser executado como o shell.

sudo chroot $chr /bin/bash

Nosso ambiente chroot agora está ativo. O prompt da janela do terminal mudou e o shell interativo está sendo tratado pelo shell bash em nosso ambiente.

Podemos experimentar os comandos que trouxemos para o ambiente.

ls
ls /home/dave/Documents

O comando ls funciona como esperamos quando o usamos no ambiente. Quando tentamos acessar um diretório fora do ambiente, o comando falha.

Podemos usar touch para criar um arquivo, ls para listá-lo e rm para removê-lo.

touch sample_file.txt
ls
rm sample_file.txt
ls

Claro, também podemos usar os comandos integrados que o shell Bash fornece. Se você digitar ajuda na linha de comando, o Bash os listará para você.

help

Use exit para sair do ambiente chroot:

exit

Se você deseja remover o ambiente chroot, pode simplesmente excluí-lo:

rm -r testroot/

Isso excluirá recursivamente os arquivos e diretórios no ambiente chroot.

Automatize para maior conveniência

Se você está pensando que os ambientes chroot podem ser úteis para você, mas eles são um pouco complicados de configurar, lembre-se de que você sempre pode tirar o esforço e o risco de tarefas repetitivas usando aliases, funções e scripts.