Apesar dele ter acesso de usar apenas o comando "scp" para enviar os arquivos de backup, isso também permite que ele use tal comando pega baixar arquivos do servidor, incluindo arquivos inocentes como "/etc/passwd" e por aí vai.
Devemos criar uma jaula para esse infeliz e não permitir que ele passe dos limites que lhe são necessários para executar o backup, garantindo assim a integridade do nosso sistema.
Para tal, vamos ter que fazer algumas chatices, mas essenciais, vamos começar alterando novamente o arquivo /usr/local/etc/rssh.conf e adicionar a seguinte linha:
chrootpath="/home/pequenogrilo"
Com isso estamos definindo um confinamento, uma jaula ao qual o usuário ficará preso. Em modos mais técnicos, pra quem já usou o comando "chroot", tenho certeza que já sabe o que vai acontecer, nós vamos definir um "mini-sistema" ao qual o usuário irá trabalhar. Esse comando permite transformar um diretório normal em um diretório raiz "/".
Para entender de maneira prática, comente a linha que foi adicionada agora pouco do chrootpath, reinicie o servidor sshd, e faça o seguinte:
# scp -P 2222 pequenogrilo@192.168.0.1:/etc/passwd password_do_serv
# cat password_do_serv
E você terá o "/etc/passwd" do servidor sem problemas, sabendo quais usuários ele possui, quais tem acesso root e tudo mais. Que chato não é?
Agora continuemos, descomente a linha do chrootpath do arquivo rssh.conf e deixe como descrevi agora pouco.
Depois crie um arquivo com o seguinte conteúdo e vamos executá-lo, ele é um shell script que fará uma configuração básica, copiando alguns arquivos essenciais para o diretório do pequenogrilo, para que possamos travá-lo. Dê o nome de gerar.sh:
#!/bin/bash
cd /home/pequenogrilo
mkdir -p usr/bin
cp /usr/bin/scp usr/bin
cp /usr/local/bin/rssh usr/bin
mkdir -p usr/libexec
mkdir -p usr/lib/misc
mkdir -p usr/libexec
mkdir -p usr/local/libexec
cp /usr/local/libexec/rssh_chroot_helper usr/lib/misc
cp /usr/libexec/sftp-server usr/lib/misc
cp /usr/local/libexec/rssh_chroot_helper usr/local/libexec
cp /usr/libexec/sftp-server usr/libexec
cd /home/pequenogrilo
mkdir -p lib/tls
cp /lib/libsafe.so.2 lib
cp /lib/tls/libresolv.so.2 lib/tls
cp /usr/lib/libcrypto.so.0 usr/lib
cp /lib/tls/libutil.so.1 lib/tls
cp /usr/lib/libz.so.1 usr/lib
cp /lib/tls/libnsl.so.1 usr/lib
cp /lib/tls/libcrypt.so.1 lib/tls
cp /lib/tls/libc.so.6 lib/tls
cp /lib/tls/libdl.so.2 lib/tls
cp /lib/ld-linux.so.2 lib
cp /lib/ld-linux.so.2 lib
cp /lib/libcrypt.so.1 lib
cp /lib/libnss_* lib
mkdir etc
cp /etc/passwd etc
cp /etc/ld.so* etc
mkdir dev
mknod -m 666 dev/null c 1 3
Caso não lembre, dê a permissão para execução no script que acabou de criar com o seguinte comando:
# chmod 700 gerar.sh
E execute o script:
# ./gerar.sh
Bem simples e nada engenhoso, é só pra você não ter o trabalho de mandar comando por comando. Esse arquivos são as dependências de alguns comandos que mandamos para o diretório do pequenogrilo, você pode visualizar essas dependências usando:
# ldd /usr/bin/scp
Mas teria que copiar também as dependências dos outros comandos, rssh e companhia, além de copiar o arquivo "/etc/passwd" e criar um dispositivo "/dev/null", então esse scriptzinho vai ajudá-lo e muito!
Então mais uma vez o pequeno grilo pergunta. Você falou tanto do "/etc/passwd" e agora você acabou de copiar ele pra dentro do diretório jaula? Sim! Mas vamos fazer o seguinte com ele, vamos remover todos os usuários, exceto o pequenogrilo, então o conteúdo passwd do diretório /home/pequenogrilo/etc deve ficar assim:
pequenogrilo:x:1001:104::/backup:/usr/local/bin/rssh
ATENÇÃO! Reparem que eu alterei o diretório de /home/pequenogrilo para apenas /backup, pois agora a raiz será o diretório do pequeno grilo e devemos até criar esse diretório.
Criemos então:
# cd /home/pequenogrilo
# mkdir backup
# chmod 700 backup
# chown pequenogrilo.pequenogrilo backup
Entenderam? Não!? Então vamos praticar. Primeiro reinicie o serviço sshd com o famoso comando:
# /etc/rc.d/rc.sshd restart
Agora tentem usar o scp novamente para baixar o passwd e vejam o seu conteúdo, que surpresa!
# scp -P 2222 pequenogrilo@192.168.0.1:/etc/passwd password_denovo
# cat password_denovo
Opa, mostrou apenas o usuário "pequenogrilo", justamente o arquivo que está no diretório jaula que criamos, assim ele ficará restrito apenas ao bendito.