Instalando e Configurando Servidor FTP com vsftpd no Linux

Fala pessoal, hoje venho ensinar como instalar e configurar um servidor FTP no Linux, mais precisamente no Ubuntu 12.04.

Dentre as muitas opções de programas que temos por ai, irei instalar o vsftpd, que parece ser muito seguro e é utilizado pela RedHat e OpenSuse além de outras empresas..

Entendendo o FTP

Por padrão o protocolo de transferência de arquivos utiliza duas portas para comunicação, a 21 para comandos e 20 para transferência dos dados.

Porém nem sempre a porta 20 é utilizada para transferência de dados, isso depende do modo que ele está configurado: ativou ou passivo.

Modo Ativo

No modo ativo, o cliente conecta-se através de uma porta randômica maior que 1023 (N > 1023) na porta 21 do servidor. Então o cliente começa ouvir na porta N + 1 e envia para o servidor essa porta, o servidor conecta-se de volta na porta especificada pelo cliente (N + 1) através da porta local 20.

Representação:

O problema com esse modo do FTP é que o servidor que começa uma conexão para transferência de dados, isso pode gerar problemas com o firewall do cliente pois está recebendo uma solicitação de fora e que geralmente é bloqueada.

Modo Passivo

Para resolver essa questão, foi desenvolvido o modo passivo (PASV). Nesse modo, o cliente abre duas portas randômicas maiores do que 1023 (N > 1023 e N+1). A primeira porta conecta-se com a porta 21 do servidor, mas invés de informar o servidor a porta para comunicação de dados, o cliente usará o comando PASV. Como resultado, o servidor vai abrir uma porta randômica (ou não, se configurarmos) P e então enviará essa porta P como resposta ao PASV para o cliente. Por fim, o cliente inicia o conexão através da porta N+1 na porta P do servidor para transferência de dados.

Representação:

Observe que no modo passivo não utilizamos a porta 20.

Essa foi uma breve abordagem sobre o funcionamento do FTP e dos modos ativo e passivo, recomendo esse excelente link caso você queira saber mais.

Instalação e Configuração

Agora que já temos uma base, vamos à instalação.

Primeiro, atualize a lista de pacotes e depois instale o vsftpd:

sudo apt-get update
sudo apt-get install vsftpd

Após a instalação, podemos testar acessando o servidor FTP localmente como anônimo (usuário sem senha), basta rodarmos o comando ftp localhost e digitarmos "anonymous" no usuário e deixar a senha vazia.

Veja que estamos recebendo a mensagem "Consider using PASV" porque estamos no modo ativo.

Com nosso servidor instalado e funcionando, vamos alterar algumas configurações no arquivo que se encontra geralmente em /etc/vsftpd.conf.

Vamos começar desabilitando acesso anônimo de nosso servidor. Abra o arquivo de configuração para editar e defina anonymous_enable=NO.

sudo vim /etc/vsftpd.conf

Se tentarmos acessar o servidor agora não conseguiremos pois estamos sem nenhuma forma de autenticação.

Toda vez que alterarmos o arquivo de configuração precisamos reiniciar o servidor FTP, use o comando sudo service vsftpd restart para isso.

Precisamos de usuário para acessar nosso servidor, vamos dizer ao vsftpd para permitir login com usuários locais (do sistema operacional). Abra o arquivo de configuração e descomente a linha local_enable=YES.

Uma boa prática é criar um grupo para usuários de FTP no Linux, assim facilita a administração de permissões para esses indivíduos. Execute o comando abaixo para criar um grupo chamado "ftpusers".

sudo groupadd ftpusers

Já temos o grupo, vamos criar um usuário chamado "ftpuser", adicionar ele no grupo "ftpusers" e definir uma senha:

useradd -g ftpusers ftpuser
passwd ftpuser

Se tentarmos acessar nosso servidor FTP agora, veremos que precisamos criar uma pasta com o mesmo nome do usuário dentro de /home. Vamos criar esse diretório do usuário, mudar o owner para "ftpuser" e o grupo para "ftpusers". Também precisamos remover o acesso de escrita desse diretório, pois o vsftpd não permite que a pasta do usuário (somente ela, os subdiretórios podem ter) tenha acesso de escrita:

cd /home
sudo mkdir ftpuser
sudo chown ftpuser:ftpusers ftpuser
sudo chmod a-w ftpuser

Após as operações acimas, devemos ter isso:

Como o diretório do usuário não tem acesso de escrita, iremos criar um diretório chamado public dentro de /home/ftpuser onde o usuário poderá armazenar seus arquivos e depois mudaremos o owner para o usuário e seu grupo (para que ele consiga ter acesso total)

sudo mkdir /home/ftpuser/public
sudo chown ftpuser:ftpusers /home/ftpuser/public

A partir de agora já conseguimos acessar o servidor FTP com o usuário criado, só que tem algo de errado ai, o usuário consegue acessar qualquer diretório do sistema a partir do diretório dele, basta executar cd / para acessar a raiz do Linux por exemplo..

Descomente a linha chroot_local_user=YES para enjaular o usuário apenas no diretório dele, assim ele só poderá acessar subdiretórios de sua pasta.

Até agora está tudo certo, porém ainda estamos utilizando o modo ativo, isso pode nos gerar problemas.. Vamos ativar o modo passivo, para isso precisamos definir pasv_enable=YES no arquivo de configuração.

Nesse servidor não foi necessário, mas em alguns pode ser necessário definir o ip do servidor FTP no qual o cliente deve fazer a solicitação, se for seu caso, basta definir pasv_address=XXX.XXX.XXX.XXX (troque XXX.XXX.XXX.XXX pelo ip do seu servidor FTP) no arquivo de configuração.

Pode-se também definir uma faixa de portas na qual o servidor FTP irá usar para transferir arquivos, basta definir pasv_min_port=9040 e pasv_max_port=9050 no arquivo de configuração, nesse caso estariamos liberando as portas 9040 até 9050 para transferência no modo passivo.

Se você desejar pode mudar onde será o diretório inicial do usuário FTP (o padrão é /home/nome_usuario), basta definir local_root=/var/$USER no arquivo de configuração, caso você utilize a variável $USER do sistema no caminho (como nesse exemplo), defina também a linha user_sub_token=$USER para o vsftpd entender como uma variável. No exemplo dado, ao acessarmos o servidor FTP com o usuário "ftpuser" o vsftpd estaria procurando o diretório /var/ftpuser.

Não esqueça que o diretório inicial deve ser do usuário e grupo desejados e a raiz não pode ter permissão de escrita.

Para finalizar, muitas vezes podemos precisar que o diretório inicial do servidor FTP aponte para um outro diretório que não seja um subdiretório (que esteja fora da home), a melhor forma para fazer isso seria montar o diretório desejado dentro da pasta inicial do usuário. Temos aqui um exemplo: sudo mount --bind /var/webapps/meu-blog /home/usuario_ftp/blog, assim cada vez que acessarmos o diretório "blog" do usuário estaremos na verdade acessando o "meu-blog" dentro de "var".

Por hoje é só, não esqueça de deixar sua opinião nos comentários.

Até mais.

Written on June 22, 2013

Share: