sexta-feira, 12 de agosto de 2011

FTP Seguro com Proftpd + SSL tutorial rápido e prático (Parte1)

INTRODUÇÃO

O ftp é um dos serviços mais antigos e utilizados na internet para troca de arquivos entre servidores e clientes. Devido ao fato de ter sido projetado inicialmente apenas como uma maneira fácil de disponibilizar os arquivos online, não utilizava a transferência segura criada mais tarde com o nome de FTPS (não confundir com SFTP que utiliza o protocolo ssh). O FTPS nada mais é que um FTP que utiliza a transferência de arquivos entre o cliente e servidor de forma criptografada dificultando e impedindo a coleta de dados como senha e nome de usuários com programas sniffers. Apesar de o FTP sem transferência segura ser muito utilizado, as vezes torna-se necessário a implantação do FTPs em empresas que precisam de sigilos entre as informações e dados trocados via ftp.

Neste tutorial estaremos abordando uma forma simples de utilizar o servidor Proftpd tanto como um ftp normal ou implementando a transferência segura através de chaves SSL.


O QUE FOI UTILIZADO

Para esse tutorial foram utilizados o Ubuntu Server 11.04 rodando o servidor Proftpd e para os clientes o Filezilla e o Ftp-ssh (este ultimo é um cliente ftp seguro por linha de comando para Linux). Apesar de ter sido utilizado o Ubuntu Server nesse tutorial, o servidor Proftpd pode ser utilizado praticamente em qualquer distribuição Linux, sendo que na maioria das vezes ele já vem pré instalado na distribuição.


INSTALANDO E CONFIGURANDO O SERVIDOR PROFTPD

Para instalar o Proftpd como root execute o comando:

#apt-get install proftpd

Nas perguntas feitas pelo configurador mantenha as respostas padrões.

Renomei o arquivo /etc/proftpd/proftpd.conf para /etc/proftpd/proftpd.conf.backup

#mv /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.backup


Cria um novo arquivo proftpd.conf:

#mcedit /etc/proftpd/proftpd.conf

Digite o seguinte conteúdo no arquivo criado:


#Carrega módulos adicionais do proftpd
LoadModule mod_ctrls_admin.c
LoadModule mod_tls.c
LoadModule mod_radius.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_file.c
LoadModule mod_quotatab_radius.c
LoadModule mod_wrap.c
LoadModule mod_rewrite.c
LoadModule mod_load.c
LoadModule mod_ban.c
LoadModule mod_wrap2.c
LoadModule mod_wrap2_file.c
LoadModule mod_dynmasq.c
LoadModule mod_vroot.c
LoadModule mod_exec.c
LoadModule mod_shaper.c
LoadModule mod_ratio.c
LoadModule mod_site_misc.c
#LoadModule mod_sftp.c
#LoadModule mod_sftp_pam.c
LoadModule mod_facl.c
LoadModule mod_unique_id.c
LoadModule mod_ifsession.c

#Configuracao principal do servidor
ServerType standalone
DefaultServer on
Umask 022
ServerName "
ITN SERVER FTP"
ServerIdent on "Bem vindo ao ITN Server FTP"
ServerAdmin itn@localhost
IdentLookups off
UseReverseDNS off
Port 21
PassivePorts 60000 62000
DefaultRoot ~
TimesGMT off
MaxInstances 30
MaxLoginAttempts 3
TimeoutLogin 300
TimeoutNoTransfer 120
TimeoutIdle 120
DisplayLogin welcome.msg
DisplayChdir .message
User nobody
Group nobody
DirFakeUser off nobody
DirFakeGroup off nobody
DefaultTransferMode binary
AllowForeignAddress off
AllowRetrieveRestart on
AllowStoreRestart on
DeleteAbortedStores off
TransferRate RETR 220
TransferRate STOR 250
TransferRate STOU 250
TransferRate APPE 250
SystemLog /var/log/secure
RequireValidShell off

#Para utilizacao de certificados SSL/TLS
#<IfModule mod_tls.c>
#TLSEngine on
#TLSRequired on
#TLSVerifyClient off
#TLSProtocol SSLv23
#TLSLog /var/log/proftpd_tls.log
#TLSRSACertificateFile /etc/proftpd/certs/server.crt
#TLSRSACertificateKeyfile /etc/proftpd/certs/server.key.insecure
#TLSRenegotiate required off
#</IfModule>


<IfModule mod_ratio.c>

Ratios off

SaveRatios off

RatioFile "/restricted/proftpd_ratios"

RatioTempFile "/restricted/proftpd_ratios_temp"

CwdRatioMsg "Please upload first!"

FileRatioErrMsg "FileRatio limit exceeded, upload something first..."

ByteRatioErrMsg "ByteRatio limit exceeded, upload something first..."

LeechRatioMsg "Your ratio is unlimited."

</IfModule>

#Apenas se o usuario for acessar seu home via ftp
<Limit LOGIN>
#AllowUser usuarioComHome1
#AllowUser usuarioComHome2
#AllowUser usuarioComHome3
DenyALL

</Limit>

<Anonymous /ftp/anonimo>
User anonymous
Group ftp
AnonRequirePassword off
MaxClients 10 "The server is full, hosting %m users"
DisplayLogin welcome.msg
DisplayChdir .msg
UserRatio anonymous 0 0 0 0
<Limit LOGIN>
Allow from All
Deny from all
</Limit>
AllowOverwrite off
<Limit LIST NLST
RETR PWD XPWD SIZE STAT CWD XCWD CDUP XCUP>
AllowAll
</Limit>
<Limit STOR STOU APPE RNFR RNTO DELE MKD XMKD SITE_MKDIR RMD XRMD SITE_RMDIR SITE SITE_CHMOD SITE_CHGRP MTDM>
DenyAll
</Limit>
</Anonymous>

<Anonymous /ftp/suporte>
User suporte
Group ftp
AnonRequirePassword on
MaxClients 10 "The server is full, hosting %m users"
DisplayLogin welcome.msg
DisplayChdir .msg
UserRatio suporte 0 0 0 0
<Limit LOGIN>
Allow from All
Deny from all
</Limit>
AllowOverwrite off
<Limit LIST NLST RETR PWD XPWD SIZE STAT CWD XCWD CDUP XCUP>
AllowAll
</Limit>
<Limit STOR STOU APPE RNFR RNTO DELE MKD XMKD SITE_MKDIR RMD XRMD SITE_RMDIR SITE SITE_CHMOD SITE_CHGRP MTDM>
DenyAll
</Limit>
</Anonymous>


<Anonymous /ftp>

User itn2

Group
ftp
AnonRequirePassword on

MaxClients 10 "The server is full, hosting %m users"

DisplayLogin welcome.msg

DisplayChdir .msg

UserRatio itn 0 0 0 0

<Limit LOGIN>

Allow from All

Deny from all

</Limit>

AllowOverwrite on

<Limit LIST NLST STOR STOU APPE RETR RNFR RNTO DELE MKD XMKD SITE_MKDIR RMD XRMD SITE_RMDIR SITE SITE_CHMOD SITE_CHGRP MTDM PWD XPWD SIZE STAT CWD XCWD CDUP XCUP>

AllowAll

</Limit>

<Limit NOTHING>

DenyAll

</Limit>

</Anonymous>


Calma a configuração não é tão complicada quanto possa parecer de início :D.

Vejamos as linhas principais:

ServerType standalone

Modo como o servidor irá se comportar (standalone ou inetd). Segundo Morimoto (2010) O standalone é mais seguro e mais rápido, enquanto o inetd faz com que ele fique ativo apenas quando acessado, economizando cerca de 400 KB de memória RAM (que fazem pouca diferença hoje em dia).

MaxInstances 30
Diz respeito ao número de conexões simultâneas que serão aceitas pelo servidor.

ServerName "ITN SERVER FTP"
Nome do servidor FTP que será apresentado aos clientes ao se conectarem.


ServerAdmin itn@localhost
Email do administrador do sistema.

Port 21
Porta que será utilizada para escuta das conexões (padrão do FTP é 21).

PassivePorts 60000 62000
Configuração das portas utilizadas pelo ftp passivo (devem estar abertas no firewall).

DefaultRoot ~
Opção importante de segurança que restringe os usuários ao acesso ao seu próprio home.

ServerIdent on "Bem vindo ao ITN Server FTP"
Configuração da mensagem que será mostrada aos clientes ao se conectarem.


User nobody

Group nobody

Com essas duas linhas definimos que as instâncias do servidor Proftpd serão executar com privilégios restritos impedindo um comprometimento do sistema caso seja detectada uma falha grave.

#LoadModule mod_sftp_pam.c
#LoadModule mod_sftp.c
Carrega módulos necessários para ativar o SFTP.

#Para utilizacao de certificados SSL/TLS
#< IfModule mod_tls.c >
#TLSEngine on
#TLSRequired on
#TLSVerifyClient off
#TLSProtocol SSLv23
#TLSLog /var/log/proftpd_tls.log
#TLSRSACertificateFile /etc/proftpd/certs/server.crt
#TLSRSACertificateKeyfile /etc/proftpd/certs/server.key.insecure
#TLSRenegotiate required off
#< /IfModule >

Essas linhas serão utilizadas quando configuramos o FTP para transferência segura. Para um FTP normal mantenha essas linhas comentadas.

#Apenas se o usuario for acessar seu home via ftp
< Limit LOGIN >
#AllowUser usuarioComHome1
#AllowUser usuarioComHome2
#AllowUser usuarioComHome3
DenyALL

< /Limit >

Caso você queira que um usuário possa acessar sua pasta home via FTP inclua aqui AllowUser “nomeDoUsuario” nesta tag.

Na tag:

< Anonymous /ftp/anonimo >

Definimos as pastas efetivamente compartilhadas pelo ftp e dentro delas quem tem permissão de acessar ou não as pastas bem como o que pode ser feito ou não dentro da pasta. No exemplo de configuração a pasta /ftp/anonimo pode ser acessado por login anônimos (mas apenas para downloads). Isso é definido pelas linhas:
User anonymous

Group ftp

AnonRequirePassword off

A principal diferença da tag:
< Anonymous /ftp/anonimo >

Para as tags:
< Anonymous /ftp/suporte >
< Anonymous /ftp >

é que nessas duas últimas é necessário que o usuário entre com a senha para autenticação no servidor. Isso é definido pela opção:
AnonRequirePassword on

Com a linha abaixo definimos os comandos que o usuário anônimo pode executar. Entre eles o download de arquivos:
< Limit LIST NLST RETR PWD XPWD SIZE STAT CWD XCWD CDUP XCUP >
AllowAll
< /Limit >


Já com a linha abaixo definimos os comandos que o usuário anônimo pode não pode executar. Entre apagar arquivos, criar pastas, e executar uploads:
< Limit STOR STOU APPE RNFR RNTO DELE MKD XMKD SITE_MKDIR RMD XRMD SITE_RMDIR SITE SITE_CHMOD SITE_CHGRP MTDM >
DenyAll
< /Limit >

Veja ao final desse artigo uma lista de alguns dos comandos FTP utilizados nesse artigo.

De maneira resumida com esse exemplo de arquivo de configuração, o usuário anonymous pode apenas executar download da pasta /ftp/anonimo. O usuário suporte pode executar download da pasta /ftp/suporte. Já o usuário itn2 tem permissão completa (upload, downloads, renomear ou remover arquivos, etc), seria como um administrador do ftp, que pode acessar a raiz /ftp e fazer as modificações necessárias.


CRIANDO AS PASTAS, GRUPO E USUÁRIOS PARA O USO DO FTP.

Precisamos criar o grupo ftp e os usuários que fazem parte desse grupo para que acessem o FTP. No entanto esses usuários não devem ter permissão para logarem no servidor como usuários comuns. Para tanto execute seguintes comandos:

Cria o grupo ftp
# addgroup ftp

Cria os usuários sem pasta home e com shell desativado:

# adduser itn2 --shell /bin/false --no-create-home
#
adduser suporte --shell /bin/false --no-create-home
#
adduser anonymous --shell /bin/false –no-create-home

Adiciona os usuário ao grupo ftp

# adduser itn2 ftp
# adduser suporte ftp
# adduser anonymous ftp

Agora vamos criar as pastas raiz do ftp, do usuário anonymous e do suporte definidos nas tags correspondentes no arquivo de configuração:

# mkdir /ftp
# mkdir /ftp/anonimo
# mkdir /ftp/suporte

Vamos ajustar a permissão das pastas:

Define o grupo ftp como dono do diretório /ftp e todos seus subdiretórios (opção -R)

# chown -R ftp.ftp /ftp

Define permissão total para o grupo ftp do diretório /ftp e todos seus subdiretórios (opção -R)

# chmod 575 -R /ftp

Basta agora liberamos as portas 21 bem como as portas 60000 ao 62000 no firewall. Se você utiliza o Iptables adicione as seguintes linhas no seu script:

iptables –A INPUT –p tcp --dport 21 –j ACCEPT
iptables –A INPUT –p tcp --dport 60000:62000 –j ACCEPT


Reinicie o servidor proftpd:
#/etc/init.d/proftpd restart

Caso você receba um erro de grupo nobody não encontrado, ao iniciar o servidor proftpd crie o grupo nobody com o comando abaixo e torne a reiniciar o proftpd:
# addgroup nobody
#/etc/init.d/proftpd restart

COMANDOS FTP PADRONIZADOS

Os comandos abaixo dizem respeito a comandos FTP padronizados pela RFC 959, os quais irão aparecer nas tags do nosso arquivo de configuração. Você pode achar estanho a ausência na lista de comandos como get por exemplo, isso irá acontecer porque o get é considerado um comando de usuário utilizado pelas aplicações ftp que indicam a requisição do download de um arquivo do servidor, no entanto o comando get é representado dentro da padronização pelo retr.
Vejamos abaixo alguns comandos que podem ser adicionados nas tags afim de permitir ou negar que determinado usuário execute determinada ação:

list Permite que o usuário liste os arquivos dos diretórios.

nlst Lista o nome dos diretórios.

retr Executa o download de um arquivo.

pwd Mostra o diretório atual.

size Permite o retorno do tamanho de um arquivo em decimal.

stat Retorna informações sobre o servidor.

cwd Permite definir o diretório inicial no ato da conexão.

cdup Marca o diretório acessado como diretório raiz para os demais.

stor, stou Permitem iniciar o upload de arquivos.

appe Utilizado para acrescentar informações ao final de um arquivo.

rnfr, rnto Utilizados para renomear arquivos.

dele Utilizado para exclusão de arquivos.

mkd Utilizado para criar diretórios.


CONCLUSÃO

Com a parte 1 desse tutorial nosso servidor FTP já está no ar e pronto para ser utilizado, podendo ser acessado normalmente por qualquer cliente FTP (mesmo que não possua suporte a conexão segura SSL como o Firezilla ou o Ftp-ssl, isto porque iremos implementar a transferência segura SSL na parte 2.

Não percam a continuação…

Link Parte 2

REFERÊNCIAS

FILE, transference protocol. Disponível em: < http://en.wikipedia.org/wiki/File_Transfer_Protocol > Acesso em: 08 ago. 2011.

MORIMOTO, Carlos. Instalando um servidor ftp. Disponível em: < http://www.hardware.co m.br/livros/servidores-linux/instalando-servidor-ftp.html > Acesso em: 08 de ago. 2011.

RIBEIRO, Pinguim. Proftpd + tls/ssl. Disponível em:< http://pinguimribeiro.wikidot.com/proftpd-tls-ssl > Acesso em: 07 ago. 2011.

RIBEIRO, Pinguim. Certificados ssl auto-assinados. Disponível em: < http://pinguimribeiro.wikidot.com/ssl-cert-self > Acesso em: 07 ago. 2011.

LIST, of raw command. Disponível em: < http://www.nsftools.com/tips/RawFTP.htm > Acesso em 08 ago. 2011.


4 comentários:

  1. Irineu boa tarde, porque você utilizou um range de porta 60000 a 62000 nesse proftpd ? estou criando um ftp seguro usando o zebedee mas esta dando erro, fiz umas pesquisas na internet e descobri que tinha que colocar esse range de porta, isso é necessario para o proftpd ?

    joao pandin

    ResponderExcluir
    Respostas
    1. Olá Leandro.
      É necessário para utilização de FTP passivo.
      Mais detalhes no link abaixo:
      http://wiki.locaweb.com.br/pt-br/FTP_Passivo_%28PasvMode%29_vs_FTP_Ativo

      Obrigado pela visita!

      Excluir
  2. Tudo foi muito bom!
    Já fiz tudo isso!
    Criei as pastas, as permissões, tudo direitinho.
    Consigo acessar pelo navegador o FTP, mas quando uso o Dreamweaver CS5, fala q n tenho acesso a pasta ou não existe.
    PQ ???

    ResponderExcluir
    Respostas
    1. Olá Gustavo,
      Verifique se o ftp embutido no Dreamweaver trabalha com FTP passivo, ou se existe alguma configuração a ser feita para trabalhar nesse modo.

      Obrigado pela visita!

      Excluir