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 ambossoftwares.

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.