Arquivos históricos do BR-Linux.org apresenta:

Habilitando acesso remoto a seu servidor com segurança

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.



Autor: Jair Valmor Basso Júnior (jair@sega-brasil.com.br)

Postado por brain em agosto 13, 2003 11:49 AM

Comentários para "Habilitando acesso remoto a seu servidor com segurança"

» Postado por: Cristiano em agosto 13, 2003 05:13 PM, 200.232.158:

 

» Postado por: Rafael Goulart em agosto 14, 2003 08:37 AM, 200.217.64.:

 

» Postado por: Jair em agosto 25, 2003 12:02 PM, 200.215.183:

 

» Postado por: Edgard em agosto 30, 2003 12:30 AM, 200.214.83.:

 

» Postado por: Alessandro em maio 11, 2004 08:06 PM, 200.173.108:

 

» Postado por: online poker em agosto 15, 2004 05:17 PM, 210.177.253:

 

Antes de comentar...

- Preserve a qualidade desta discussão
- Leia os Termos de Uso.
- Este formulário deve ser usado para comentários sobre a notícia. Se você tem dúvidas ou precisa de ajuda, use o Fórum.
- Mantenha o foco nos argumentos e no assunto
- Não faça ataques pessoais.
- Pense 5 vezes antes de entrar em discussões inúteis, como "qual é a melhor distribuição/ambiente gráfico/linguagem de programação/etc.", mesmo se alguém já tiver provocado - um erro não justifica o outro
- Não seja um e-mala ;-)


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.