O Jair Valmor Basso Júnior (jair@sega-brasil.com.br) mandou um artigo sobre o uso do chroot para garantir que usuários não possam sair do seu diretório pessoal ao acessar servidores usando ftp, telnet ou ssh. Veja abaixo as dicas dele:
Habilitando acesso remoto a seu servidor com segurança
por Jair Valmor Basso Júnior (jair@sega-brasil.com.br)
Diversas vezes precisamos permitir que usuários externos tenham acesso remoto
a servidores, seja para atualizar sites, scripts ou testar aplicações.
O acesso mais frequente é via FTP, mas há diversas situações onde há a
necessidade de se habilitar acesso a shell, via ssh ou telnet.
Mas como fazer para manter o usuário somente em seu diretório, não permitindo
que ele possa sair vasculhando arquivos do sistema?
Vamos imaginar o seguinte cenário:
Manézinho administra o contéudo do site zyx.com.br, e além de acesso via
FTP, necessita de acesso ao shell do sistema operacional, para que possa
trabalhar mais facilmente com os scripts do site.
Inicialmente vamos configurar o acesso FTP, que é bem mais simples :)
Existem dois servidores FTP já bastante conhecidos no mundo Open Source:
-ProFTPD
-Wu-FTPD
Vou demonstrar como "prender" o usuário a seu diretório utilizando ambos
softwares.
1) ProFTPD (http://www.proftpd.org/)
Instalar o ProFTPD é bem simples:
a) Baixamos o código fonte do site
b) descompactamos: tar yxvf proftpd-1.2.7.tar.bz2
(pra quem não sabe, a opção "y" no tar do Slackware serve para descompactar
arquivos .bz2, no RedHat a opção é "j").
c) Compilamos: ./configure --prefix=/usr/local/proftpd && make
d) Se a compilação ocorrer sem problemas, executamos um: make install
Agora vamos alterar o arquivo /usr/local/proftpd/etc/proftpd.conf
Adicionamos a seguinte linha logo no começo do arquivo, após a
diretiva "DefaultServer":
DefaultRoot ~ !ftpnormal
Agora salve o arquivo e reinicie o serviço. Essa linha irá fazer com que
todos os usuários que *não* pertencem ao grupo "ftpnormal", só possam
acessar os arquivos dentro do seu diretório HOME. Os usuários que estão
no grupo "ftpnormal" ainda poderão acessar todo o filesystem. Caso você
queira que todos os usuários fiquem presos em seus diretórios HOME sem
exceção, apenas remova o "!ftpnormal".
É claro que se você já tiver o ProFTPD instalado em seu servidor, não
há necessidade de reinstalá-lo, apenas procure o arquivo de configuração
(que com certeza estará em outro diretório), modifique-o e reinicie
o serviço.
Utilizando WU-FTPD
------------------
O WU-FTPD é um servidor FTP muito usado no mundo Unix. Pra prender o usuário
em seu diretório HOME, o procedimento é o seguinte:
a) Baixamos o código fonte do site (testei com a versão 2.6.2);
b) Compilamos: ./configure && make
c) Se a compilação ocorrer sem problemas, instalamos: make install
Deve-se agora configurar o wu-ftpd para que seja chamado pelo inetd ou
xinetd, dependendo de sua configuração. Essa operação deixarei para o leitor
efetuar.
Para que o chroot funciona perfeitamente, precisamos criar os diretórios
"bin, lib, etc" dentro do HOME do usuário, e para lá copiar pelo menos os
arquivos "/bin/ls" (e suas bibliotecas correspondentes). Deve-se também
criar os arquivos "/etc/passwd" e "/etc/group" com as entradas para o
usuário em questão e o usuário "root".
Agora editemos o arquivo "/etc/ftpaccess" e adicionamos a linha:
guestgroup chumbrega
A linha acima indica que todos os usuários pertencentes ao grupo "chumbrega"
ficarão presos aos seus respectivos diretorios HOME.
Agora é só alterar o arquivo "/etc/group", adicionar um novo grupo chamado
"chumbrega" e acrescentar os usuaríos desejados nele.
Simples, não?
--------------------------------
Acesso remoto com shell.
Se o seu usuário precisa de acesso com shell (via telnet, ssh, etc), é
preciso inicialmente levantar quais as necessidades do usuário em termos
de software e etc.
Dinâmico versus Estático
O usuário mané precisa ter acesso via ssh a seus scripts, para que possa
fazer manutenção diretamente no servidor.
Vamos assumir que os arquivos que o usuário tem permissão de escrita estejam
localizados no diretório: /data/users/mane
Inicialmente vamos alterar alguns campos do usuário mane no arquivo /etc/passwd,
antes estava assim:
mane:x:1011:100:,,,:/home/mane:/bin/false
Agora fica assim:
mane:x:1011:100:,,,:/data/users/mane:/usr/local/bin/presilha
Note que mudamos o campo home e o campo shell. Configuramos o $HOME do
usuário para ser o local onde estão os arquivos que ele possui permissão
de escrita. O campo shell alteramos para um programa que vamos criar logo
abaixo.
Agora dentro do /data/users/mane, precisamos criar a estrutura de diretórios
e arquivos a qual o usuário poderá acessar e utilizar.
Nessa situação-exemplo, nosso usuário poderá apenas editar arquivos usando
o editor "vi", e efetuar algumas operações básicas como copiar, mover, criar,
remover arquivos e diretórios.
Vamos criar a estrutura de diretórios:
cd /data/users/mane
mkdir -p bin etc dev lib usr/lib usr/bin
Precisamos copiar os programas que os usuários poderá executar. Para facilitar
este tutorial, vou seguir o caminho de deixar os programas dinâmicamente
linkados com as bibliotecas, mesmo que isso consuma mais espaço em disco (
você pode optar por dinâmico ou estático, a escolha é sua).
Copiando o "ls" por exemplo:
ldd /bin/ls
librt.so.1 => /lib/librt.so.1 (0x40020000)
libc.so.6 => /lib/libc.so.6 (0x40032000)
libpthread.so.0 => /lib/libpthread.so.0 (0x40143000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
cp /bin/ls bin
cp /lib/librt.so.1 lib
cp /lib/libc.so.6 lib
cp /lib/ld-linux.so.2 lib
E agora copiamos o "vi"
ldd /usr/bin/vi
libncurses.so.5 => /lib/libncurses.so.5 (0x40020000)
libgpm.so.1 => /usr/lib/libgpm.so.1 (0x40060000)
libc.so.6 => /lib/libc.so.6 (0x40066000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
cp /usr/bin/vi usr/bin
cp /lib/libncurses.so.5 lib
cp /usr/lib/libgpm.so.1 usr/lib
As libs libc.so.6 e ld-linux.so.2 já existem, pois são dependências do "ls",
que já copiamos para o bin.
Você vai ter que fazer isso com cada programa que o usuário tiver acesso:
mkdir, rm, cat, more, less, e assim vai...
Não esqueça de copiar também o bash, e de criar um link dele pro sh:
ln -s bash sh
Isso é importante, ou seu usuário não conseguirá se logar.
Uma outra coisa importante, é copiar a biblioteca "/lib/libnss_compat.so.2",
pois sem ela, não irão aparecer os nomes dos usuários nas permissões dos
arquivos, e sim os uid e gid. Procure por essa lib na sua distribuição, ela
pode possuír um nome ligeiramente diferente.
Dentro do etc só precisamos de dois arquivos: passwd e group, com o seguinte
conteúdo:
passwd:
mane:x:1011:100:,,,:/:/usr/local/bin/presilha
root:x:0:0::/root:/bin/bash
group:
root:x:0:root
users:x:100:mane
O programa "presilha.c"
É um programa simples, feito em linguagem "C", a listagem segue abaixo:
//------------- Corte aqui --------------//
#include
#include
#include
int main(void) {
int u_uid;
struct passwd *pwd;
u_uid = getuid();
pwd = getpwuid(u_uid);
chroot(pwd->pw_dir);
setuid(u_uid);
system("/bin/bash");
}
//------------- Corte aqui -------------//
Esse programa nada mais faz do que pegar o UID e HOME do usuário
e efetuar o chroot.
Para compilá-lo: gcc presilha.c -o presilha
É importante setar o bit de setuid, pois somente root pode executar
a função "chroot": chmod 4555 presilha
Agora o copiamos para /usr/local/bin:
cp presilha /usr/local/bin
Agora faça um teste se logando no servidor com o usuário mane.
» Postado por: Cristiano em agosto 13, 2003 05:13 PM, 200.232.158:
Legal!
Isso é uma tremenda mão na roda.
» Postado por: Rafael Goulart em agosto 14, 2003 08:37 AM, 200.217.64.:
Jair, não sei se você sabe, mas é uma tremenda dificuldade achar alguma implementação de CHROOT para SSH. Sua solução é muito simples.
O SSH possui inúmeras vantagens sobre o TELNET (bom, nem precisa falar), mas também sobre o FTP. Mas, para agir como o serviço de upload de sites, por exemplo, é necessário o CHROOT.No FTP é fácil, mas no SSH.
Parabéns...
» Postado por: Jair em agosto 25, 2003 12:02 PM, 200.215.183:
Parece que o script usado para adicionar o tutorial "engoliu" os includes do presilha.c :)
Aqui vão eles, apenas alterem o início do programa.
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
» Postado por: Edgard em agosto 30, 2003 12:30 AM, 200.214.83.:
Cara, esta dica me tirou do sufoco! Tava tentando resolver o problema na rede com a internet e consegui com o coyote.
» Postado por: Alessandro em maio 11, 2004 08:06 PM, 200.173.108:
Blz... amigos...
Seguinte...alguém sabe aí como emular o servidor LINUX Hed HET 9.0 de uma estação ver o ambiente gráfico... como se fosse o startx ????
Muito Obrigado!!!
» Postado por: online poker em agosto 15, 2004 05:17 PM, 210.177.253:
1150 Get your online poker fix at http://www.onlinepoker-dot.com
O Arquivo Histórico do BR-Linux.org mantém no ar (sem alteração, exceto quanto à formatação) notícias, artigos e outros textos publicados originalmente no site na segunda metade da década de 1990 e na primeira década do século XXI, que contam parte considerável a história do Linux e do Open Source no Brasil. Exceto quando indicado em contrário, a autoria dos textos é de Augusto Campos, e os termos de uso podem ser consultados na capa do BR-Linux.org. Considerando seu caráter histórico, é provável que boa parte dos links estejam quebrados, e que as informações deste texto estejam desatualizadas.