sexta-feira, 20 de novembro de 2009

Instalando e Configurando um Servidor FTP com o VSFTPD



Seguindo a Série de Artigos para serem utilizados em sala de aula, desta vez apresentaremos o Servidor FTP - File Transfer Protocol.
FTP significa File Transfer Protocol (Protocolo de Transferência de Arquivos), e é uma forma bastante rápida e versátil de transferir arquivos (também conhecidos como ficheiros), sendo uma das mais usadas na internet.

Pode referir-se tanto ao protocolo quanto ao programa que implementa este protocolo (Servidor FTP, neste caso, tradicionalmente aparece em letras minúsculas, por influência do programa de transferência de arquivos do Unix).

A transferência de dados em redes de computadores envolve normalmente transferência de arquivos e acesso a sistemas de arquivos remotos (com a mesma interface usada nos arquivos locais). O FTP (RFC 959) é baseado no TCP, mas é anterior à pilha de protocolos TCP/IP, sendo posteriormente adaptado para o TCP/IP. É o padrão da pilha TCP/IP para transferir arquivos, é um protocolo genérico independente de hardware e do sistema operacional e transfere arquivos por livre arbítrio, tendo em conta restrições de acesso e propriedades dos mesmos.
Fonte: http://pt.wikipedia.org/wiki/File_Transfer_Protocol

Para instalarmos um servidor FTP poderíamos utilzar várias soluções do mundo Linux como o Proftpd. Mas escolhemos para este tutorial o VSFTP - Very Secure FTP que tem em seu site oficial http://freshmeat.net/projects/vsftpd/

Arquivo de configuração:
/etc/vsftpd.conf

Daemon:
/etc/init.d/vsftpd

Porta TCP/IP envolvidas:
20 e 21 tcp/udp

Instalação:
#apt-get install vsftpd

Pronto. Já neste ponto, você já tem um servidor FTP com acesso anônimo liberado. Vamos testar?

Iniciando o servidor:
#/etc/init.d/vsftpd restart

a) Utilizando a linha de comando:
# ftp localhost Connected to localhost.
220 (vsFTPd 2.0.7)

Name (localhost:root): anonymous

Password: qualquersenha

Porém o acesso anônimo é de somente leitura.
Se você desejar disponibilizar algum arquivo pra que usuários anônimos da sua rede ou da Internet baixem a partir deste servidor que você acabou de montar, coloque no seguinte caminho:
/home/ftp

Este é o diretório local no seu HD que os usuários anônimos caem quando logam no seu servidor.

b) Utilizando o browser
Você pode fazer o teste utilizando o Firefox, Konquerror, Opera, Chomium ou IE. Basta na barra de endereços digitar:
ftp://localhost (caso você esteja na mesma máquina que está o servidor)
ftp://10.0.0.1 (supondo que este é o IP do servidor FTP que você está montando).

c) Utilizando um Cliente FTP
Para fazer testes de FTP, não use Browsers. Use clientes de FTP. No Linux eu utilizo dois: Filezilla e o GFTP
Eu prefiro o Filezilla. Caso você use Debian, Ubuntu ou derivados, basta instalar com o comando:
apt-get install filezilla

Um teste de acesso utilizando o Filezilla.
Se você utiliza Windows, você também pode utilizar o Filezilla.

Para fazer um acesso autenticado, ou liberar gravação do usuário anônimo, é necessário alterar algumas linhas do /etc/vsftpd.conf. Vamos conhecer melhor este arquivo.

As opções do /etc/vsftpd.conf

Habilita o protocolo IPv6
listen_ipv6=YES

Libera/Nega acesso Anônimo
anonymous_enable=YES

Permite que usuários do servidor façam o login no servidor FTP
local_enable=YES

Permite que os usuários tenham acesso de gravação no servidor de FTP (Menos o anônimo)
write_enable=YES

Permite que o usuário anonimo faça upload para o servidor de FTP
anon_upload_enable=YES
Obs: Para esta opção funcionar a linha write_enable=YES deve estar ativada.

# Permite que o usuário Anônimo crie diretorios
anon_mkdir_write_enable=YES

Proibindo usuários de Logar no Servidor FTP
Configure as seguintes linhas:
userlist_deny=YES
userlist_file=/etc/vsftpd.denied_users
Crie o arquivo /etc/vsftpd.denied_users e escreva um por linha os usuários que não podem logar no servidor.

Autorizando somente alguns usuários a logarem no servidor:
Configure as seguintes linhas:
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd.allowed_users
Crie o arquivo /etc/vsftpd.allowed_users e escreva um por linha quem pode logar no servidor.

Enjaulando Usuários
Para impedir que os usuários autenticados saiam do seu diretório home e possam navegar pelo HD do servidor, ative a opção abaixo:
chroot_local_user=YES
Obs: Esta técnica é chamada de Enjaular usuários

Para "enjaular" somente alguns usuários:
Configure as seguintes linhas
chroot_local_user=NO
chroot_list_enable=YES
Crie o seguinte arquivo: /etc/vsftpd.chroot_list e escreva o nome dos usuários que você deseja enjaular um por linha

Para "enjaular" todos e deixar alguns livres:
Configure as seguintes linhas:
chroot_local_user=YES
chroot_list_enable=YES
Crie o seguinte arquivo: /etc/vsftpd.chroot_list e escreva o nome dos usuários que você deseja que não seja enjaulado um por linha.

Possibilitando que o usuário Anônimo faça Upload.
Obs: Se você ativar esta opção e for logar com no servidor com o usuário anonymous, você irá receber a seguinte mensagem:
500 OOPS: vsftpd: refusing to run with writable anonymous root

Isto contradiz toda a história de permissionamento do Linux, mas é isto mesmo. Para você permitir que o Anonymous faça login e consiga fazer uploads para o servidor de FTP, é necessário que o diretório /home/ftp não pertença ao usuário ftp e ainda mais, não pode ter permissão de gravação. Você deverá criar um subdiretório dentro do diretório /home/ftp e ai sim, você libera a gravação deste subiretório. Então para evitar este erro faça o seguinte:

Passe o diretório /home/ftp para o root
# chown root:root /home/ftp

Tire as permissões de gravação deste diretório
# chmod 555 /home/ftp

Crie um subdiretório que contenha permissão para gravação
# mkdir /home/ftp/upload

Altere as permissões deste subdiretório
# chmod 777 /home/ftp/upload

Faça o teste: Logue como anonimo utilizando o filezilla e faça uploads de arquivos.

Referências:
http://ubuntuforums.org/showthread.php?t=518293

27 comentários:

  1. Dailson...
    Cara muito obrigado, pdria existir mais pessoas como você na internet!
    Isso é um dom! Muito obrigado pela ajuda!
    Muito bem feito o seu blog!
    Daniel Espateco

    ResponderExcluir
  2. Obrigado. Ajudou a boa explicação feita sobre o servifor de ftp. Fica configurado á primeira. Abraço.

    ResponderExcluir
  3. Poderia me dar uma ajuda, fiz todo esse processo mais ainda não consigo conectar pelo filezilla.
    Aparece essa msg:

    Estado: Conexão estabelecida, esperando mensagem de boas-vindas...
    Resposta: 220 (vsFTPd 2.2.2)
    Comando: USER uftp
    Resposta: 530 Permission denied.
    Erro: Não foi possível conectar ao servidor

    ResponderExcluir
  4. Como você está tentando conectar? Usuário e senha?

    ResponderExcluir
  5. Este comentário foi removido pelo autor.

    ResponderExcluir
  6. Sim, com usuário e senha.
    E como anonimo o acesso é normal.

    ResponderExcluir
  7. Para que funcione com usuários normais, é necessário fazer esta configuração:

    Permite que usuários do servidor façam o login no servidor FTP
    local_enable=YES

    ResponderExcluir
    Respostas
    1. Dailson, esse parâmetro já esta configurado e mesmo assim não consigo conectar.

      Excluir
  8. Caro Dailson, meus parabéns e obrigado pelo seu excelente tutorial!

    Se puder me responder por favor: Configurei o acesso para uma pasta específica dentro do diretório /home/usuario/ftp do usuário no servidor. Quando conecto via FTP com o Filezilla, o sistema mostra toda a árvore de diretórios e inclusive permite que esse usuário navegue nas pastas. Procurei no manual do VSFTPD, mas não consigo encontrar algum parâmetro que simplesmente oculte as pastas acima daquela que defini como login padrão.

    Conectei também utilizando uma máquina com Windows 7 pelo Windows Explore e ele conecta direto na pasta e não permite visualizar as que estão acima daquela que é a padrão.

    Existe alguma solução para resolver esse problema?

    Agradeço desde já se puder responder.

    Obrigado.

    Fábio

    ResponderExcluir
  9. Olá Fábio,

    Obrigado pelos elogios.
    A resposta de todas as suas perguntas está no próprio tutorial. Veja a sessão ENJAULANDO USUÁRIOS.
    Lá tem tudo que você precisa para "enjaular" os usuários no diretório de login.

    Um abraço,

    Dailson Fernandes

    ResponderExcluir
  10. Bom dia ...

    Toda vez que tento logar no servidor ftp via conexao externa recebo essa mensagem :
    USER msnet
    331 Please specify the password.
    PASS xxxx
    500 OOPS:

    E realize a configuração do vsftpd.conf igual ao seu tutorial.
    poderia mi mi ta uma luz.

    ResponderExcluir
    Respostas
    1. Oi Sá,

      Acontece isso via conexão interna?

      Excluir
    2. Bom Dia ....

      A mesma coisa na rede interna e conexão externa

      Blz

      Excluir
    3. Você tem como mandar o vsftpd.conf pra mim??? contato@dailson.com.br
      Outra pergunta,

      Você consegue logar com este usuário normalmente?

      Excluir
  11. Parabens! Obrigado por ajudar a comunidade!

    ResponderExcluir
  12. Olá Dailson,

    Estou precisando configurar um FTP onde o usuário admin possa gravar arquivos em uma pasta restrita e o usuário client possa apenas fazer o download destes arquivos.
    É possível fazer essa configuração?

    Parabéns pelo trabalho!
    Abraços

    ResponderExcluir
    Respostas
    1. Opa Claudio e Ever.

      Pode sim.
      Coloque o usuário que você quer que tenha acesso total como dono da pasta.
      # chown novodono /pasta
      Depois coloque o outro usuário como integrante de um grupo que você quer que apenas tenha acesso de leitura a pasta.
      # chgrp -a grupo /pasta
      Depois dê as devidas permissões nesta pasta:
      # chmod 750 /pasta

      Outra maneira é usar o sistema de ACLs do Linux.
      Tenho uma aula falando sobre isto no seguinte link:
      http://dailson.blogspot.com.br/2013/04/aula-12-gerenciamento-de-permissoes-no.html

      Excluir
  13. Dailson, minha pergunta é mais ou menos parecida com a anterior.
    Preciso criar uma pasta onde o usuário A possa ler e escrever e o usuário B somente ler.
    Obrigado.

    ResponderExcluir
    Respostas
    1. Opa Claudio e Ever.

      Pode sim.
      Coloque o usuário que você quer que tenha acesso total como dono da pasta.
      # chown novodono /pasta
      Depois coloque o outro usuário como integrante de um grupo que você quer que apenas tenha acesso de leitura a pasta.
      # chgrp -a grupo /pasta
      Depois dê as devidas permissões nesta pasta:
      # chmod 750 /pasta

      Outra maneira é usar o sistema de ACLs do Linux.
      Tenho uma aula falando sobre isto no seguinte link:
      http://dailson.blogspot.com.br/2013/04/aula-12-gerenciamento-de-permissoes-no.html

      Excluir
  14. Eu não consigo fazer conexão externo no meu ftp, como faço essa liberação no linux??

    ResponderExcluir
  15. Dailson Bom Dia, muito bom seu tutorial.
    Apenas uma pergunta, fiz a instalação e estou permitindo que o Usuário anonymous connect ao FTP, faça upload e download. Diretório esta DEFAULT no Centos /var/ftp/pub. Este diretório esta com permissão de leitura e escrita para todos usuários.

    Ocorre que quando conecto com usuário anonymous, consigo fazer upload (put file) normal, mais quando vou fazer o download (get file) não consigo pois retorna uma mensagem de erro '550 failed to open file'. Quando listo o arquivo que fiz o upload (ls -lh) o mesmo esta com permissão apenas rw (leitura e escrita) para o Usuário ftp e grupo ftp. Se alterar a permissão direto no arquivo consigo fazer o download.

    Como consigo fazer o download sem precisar ficar mudando a permissão direto no arquivo que esta dentro de /pub. Processo esta sendo feito através de outro linux pelo ftp-client. diretiva local_umask esta comentado.

    Obrigado abraços.

    ResponderExcluir
    Respostas
    1. Opa Wender.
      Vou tentar simular teu ambiente aqui e vou tentar lhe ajudar caso você ainda não tenha resolvido. Pois nunca peguei esta bronca não.

      Excluir
  16. Bom dia Danilson
    Tudo bem?

    Já possuo um ftp em funcionamento, porém gostaria de saber se é possível o seguinte:

    usuário W administra seu próprio ftp (le, escreve) em sua pasta de ftp e na hora de disponibilizar o conteúdo os usuários só podem ler/baixar.
    Existe essa possibilidade ou devo deixar o anônimo com acesso?

    Tentei fazer por diversas vezes, mas acho que estou fazendo algo errado no acesso do conteúdo.
    Ou teria a possibilidade de dois usuários terem acesso a mesma pasta do ftp mas apenas um ser administrador e o outro apenas ler?

    Tentei isso mas não consegui!

    Obrigado pela atenção

    ResponderExcluir
    Respostas
    1. Opa Douglas,

      Tudo certo!

      Coloque o usuário W como dono da pasta.
      Coloque todos os outros usuários em um grupo.
      Coloque este grupo como dono da pasta e de acesso somente de leitura e execucao 750.
      Faça os testes e me reporte pra ver se funcionou.

      Excluir
  17. Eu estou usando o modo passivo com as portas 9050-9059. No browser e em algum cliente FTP qualquer o meu FTP funciona normalmente, mas se eu for acessar ele via terminal dá conexão negada após o login, o que será? :/

    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> ls
    227 Entering Passive Mode (192,168,254,32,35,97).
    ftp: connect: Conexão recusada

    ResponderExcluir