VsFTPd (Very Secure FTP daemon)

Os serviços de http://pt.wikipedia.org/wiki/File_Transfer_Protocol FTP ainda são uns dos mais utilizados para troca de arquivos em redes privadas e públicas. Contudo, quando não configurados corretamente, podem conter certas vulnerabilidades.

Existem vários servidores FTP. Dentre eles, o mais utilizado e considerado o mais seguro é o vsftpd(Very Secure FTP daemon),desenvolvido com enfoque na segurança.

Seu daemon é o vsftpd e seu arquivo de configuração é o /etc/vsftpd.conf. Uma das principais características do vsFTPd é criar um ambientechroot quando um usuário entra no sistema via FTP, sem necessidade de preparar uma árvore de diretórios especifica para isso.

Em primeiro lugar, é necessário criar o diretório base para o FTP, geralmente /home/ftp ou /var/ftp. Este diretório deve pertencer ao usuário root, e não ter permissão de escrita para o usuário ftp. Caso contrário o vsftpd informará que existe uma brecha de segurança não funcionará corretamente.

As configurações são simples e dificilmente é necessário alterar o padrão. Se o vsftpd nào for utilizado através do initd ou xinetd, a opção listen=YES deve estar presente no arquivo /etc/vsftpd.conf.

Características do vsftpd

Além da segurança, estabilidade e velocidade, o vsftpd ainda possui as seguintes características:

  • Suporte a IPs virtuais;
  • Suporte a usuários virtuais;
  • Pode ser executado sob demanda, a partir do inetd ou xinetd, ou como um processo à parte (standalone);
  • Suporte à limitação de consumo de banda;
  • Configuração por IP de origem;
  • Limite de conexões por endereço IP;
  • Suporte a Ipv6;
  • Suporte à criptografia através de integração com SSL.

Instalação do vsftpd

Como servidor FTP, será usando o vsftpd. Sua instalação é muito simples, basta executar o seguinte comando:

Em sistema baseados em Debian

aptitude install vsftpd -y

Em sistemas baseados em Red Hat

yum install vsftpd

Em Gentoo Linux

emerge vsftpd

Em Slackware

slackpkg install vsftpd

Em SUSE Linux

zypper install vsftpd

Em Mandriva Linux

urpmi vsftpd

Em !ArchLinux

pacman -S vsftpd 

Em Sabayon

equo install vsftpd

Poderão ocorrer algumas solicitações de remoção de pacotes de outros FTPs por questões de conflitos, mas pode-se perfeitamente seguir adiante.

Configuração do vsftpd

A configuração do vsftpd é feita no arquivo /etc/vsftpd/vsftpd.conf. Logo abaixo, um exemplo:

#/etc/vsftpd.conf
 
#Libera ftpd anônimo.
anonymous_enable=YES
 
#Permite que os usuários locais efetuem o login.
local_enable=YES
 
#Permite que os usuários gravem sem seus diretórios pessoais.
write_enable=YES
 
#Usuários que será utilizado para acesso anônimo.
nopriv_user=ftp
 
#Habilita a exibição de mensagens para os usuários remotos quando entrarem 
#nos diretório. Para que a mensagem seja mostrada, é necessário criar um 
#arquivo .message com o conteúdo da mensagem dentro de cada diretório.
dirmessage_enable=YES
 
#Ativa o log de todos od downloads e uploads.
xferlog_file=/var/log/vsftpd.log
 
#Permite conexões na porta 20(ftp-dados).
connect_from_port_20=YES
 
#Define o tempo de desconexão automática por inatividade.
idle_session_timeout=600
 
#Define que o usuário logado deve ficar preso em seu diretório pessoal
chroot_local_user=YES
 
#Permite que seja utilizada uma lista com os usuários que não ficaram presos 
#no seu diretório pessoal.
chroot_list_enable=YES
 
#Lista com os usuários que poderam sair do HOME.
chroot_list_file=/etc/vsftpd/chroot-list

### FOR NAT
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12100

Na tabela abaixo, há uma relação de várias opções que podem ser utilizadas no arquivo de configuração do vsftpd e a descrição detalhada das que estão no exemplo acima:

OpçãoSignificado
anonymous_enable=NOImpede o login anônimo. Se seu servidor de FTP for público, o valor deve ser YES
local_enable=YESIsto permite que os usuários locais efetuem o login. Útil para um servidor privado (nosso caso) como o de um ISP.
write_enable=YESPermite que esses usuários escrevam em suas pastas por FTP.
local_umask=022Define as permissões dos arquivos depois do upload. O padrão é 077 (octal), escrita e leitura somente pelo dono.
anon_upload_enable=NOAtiva o upload anônimo. Este valor deve ser YES se o servidor de FTP for público.
anon_mkdir_write_enable=NOAtiva a criação de pastas por usuários anônimos.
dirmessage_enable=YESPermite que o conteúdo do arquivos .message seja exibido caso exita no diretório atual. Um bom uso deste recuso é criar o arquivo .message (o conteúdo deve ser texto puro) e colocar informações sobre a pasta atual.
xferlog_enable=YESAtiva o log detablhado, que inclui log de upload e download.
connect_from_port_20=YESPermite conexões na porta 20 (ftp-dados).
chown_uploads=YESSe esta opção estiver habilitada, cada upload de arquivo executado pelo usuário anônimo terá automaticamente, como dono do arquivo, o usuário especificado na opçãochown_username. Não é recomendado que seja feito upload com o usuário root
chown_username=whoeverPermite especificar qual usuário será o dono dos arquivos que forem enviados para o servidor (upload) pelo usuários anônimo.
xferlog_file=/var/log/vsftpd.logPode ser especificado em qual arquivo serão registrados os logs do serviço vsftpd. O padrão é /var/log/vsftpd.log.
xferlog_std_format=YESSe estiver habilitado, o arquivo de log será gerado no formato padrão do ftpd xferlog.
idle_session_timeout=1800Define o tempo de desconxão automática por inatividade.
data_connection_timeout=120Tempo permitido de ociosidade (em segundos) em uma conexão antes que o cliente remoto seja desconectado.
nopriv_user=ftpsecureEsta opção é recomendada para definir um usuário único do sistema, o qual será utilizado pelo servidor FTP que seja totalmente isolado e sem privilégios. Geralmente escolhe-se o usuário nobody.
userlist_enable=YESCom esta opção ativada, o vsftpd irá carregar uma lista de nome de usuários a partir do arquivo especificado em userlist_file. Se o usuário tentar conectar usando um nome da lista, ele será PROIBIDO de fazer o login. Mesmo digitando a senha corretamente, terá um retorno de erro de acesso.
userlist_deny=YESEsta opção só será examinada userlist_enable esteja ativada. Ela faz com que os usuários da lista userlist_file sejam negados antes mesmo de solictar a senha. Isso serve para impedir login com senhas nulas, chamadas de cleartext (texto puro).
userlist_file=/etc/vsftpd.user_listNesta opção pode ser especificado um arquivo, o qual conterá o nome dos usuários a serem negados pela opção userlist_enable.
check_shell=YESNOTA: Esta opção só funciona caso não se utilize autenticação via PAM paravsftpd. Se desabilitada, vsftpd não ira checar o /etc/shells para saber se o shell do usuário é válido para conexões locais.
async_abor_enable=YESQuando esta opção é habilitada, um comando do FTP conhecido como async ABOR é ativado. Alguns clientes de FTP mais antigos podem apresentar problemas se esta opção não estiver habilitada, porém ela representa um futo na segurança.
ascii_upload_enable=YESQuando habilitada, o modo ASCII de transferência de dados é ativado para uploads.
ascii_download_enable=YESQuando habilitada, o modo ASCII de transferência de dados é ativado para downloads.
fptd_banner=Bem Vindo ao FTPO banner de boas vindas, quando é feito login no servidor FTP, pode ser personalizado.
deny_email_enable=YESEndereços de e-mails anônimos podem ser desabilitados, ou seja, isso proibirá o login de usuários que possuem esse endereços. Prático para combater ataques do tipo DOS.
banned_email_file=/etc/vsftpd.banned_emailsEsta opção anda em conjunto com a deny_email_enable. Pode-se especificar um arquivo onde estarão listados os endereços de e-mails que serão banidos.
chroot_local_user=YESDefine que o usuário conectado deve ficar preso num diretório raiz. Esta opção é útil em servidores de hospedagem.
chroot_list_enable=YESHabilita uma lista de usuários que estarão presos em um diretório raiz.
chroot_list_file=/etc/vsftpd.chroot_listEsta opção define qual é o arquivo que irá conter a lista de usuários para chroot.
listen=YESDefine a execução do vsftpd em modo standalone. Se definido como YES, requerbackground=YES. Se for iniciado pelo xinetd, deve ficar no NO.
text_userdb_names=YESAtiva a exibição dos nomes de usuários e grupos nas listagens de arquivos e diretório. Se definido como NO serão exibidos do IDs.
use_localtime=YESDetermina a exibição das datas em local time zone.
ls_recurse_enable=YESEsta opção habilita a utilização do comando ls -R. Não é muito útil já que isso, em grandes diretórios, pode consumir muito recurso.

Segurança

Por questões de segurança, pode-se evitar que determinados usuários conectem via FTP.

userlist_enable=YES

Se esta opção for ativada o vsftpd lerá uma lista de nomes que está na opção do userlist_file(/etc/vsftpd/ftpdusers). Se o usuário tenta acessar o sistema tiver o nome nesse arquivo, terá seu acesso negado antes que sua senha seja perguntada.

Levantando o serviço

Terminada a configuração, pode ser ativado o serviço de FTP a partir do serviço xinetd.

/etc/init.d/vsftpd restart

ou

/etc/rc.d/vsftpd restart

Rodando FTP sob Demanda com Xinet

O serviço FTP pode ser adicionado ao Xinet de forma que seja sob demanda. Para isso, basta desativar as opções de standalone do serviço em/etc/vsftpd/vsftpd.conf, mudando as opções para NO.

#Habilitando para trabalhar em modo Standalone
listen=NO
tcp_wrappers=NO

Parar o serviço de FTP

/etc/init.d/vsftpd stop

ou

/etc/rc.d/vsftpd stop

No arquivo /etc/xinetd.d/vsftp, colocar em no a opção disable.

vim /etc/xinetd.d/vsftp
service ftp
{
    disable         = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/sbin/vsftpd
    server_args     = /etc/vsftpd/vsftpd.conf
    nice            = 10
    per_source      = 5
    instances       = 200
    log_on_success += PID host DURATION
    log_on_failure += host
    flags           = IPv4
}

Vamos agora reiniciar o xinetd:

/etc/init.d/xinetd restart

ou

/etc/rc.d/xinetd restart

Agora a escolha é do usuário trabalhar em standalone ou xinet.

Arquivo de exemplo do CentOS 6.4

Arquivo de exemplo do vsftpd configuração do padrão do CentOS 6.4

# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=no
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# The target log file can be vsftpd_log_file or xferlog_file.
# This depends on setting xferlog_std_format parameter
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# The name of log file when xferlog_enable=YES and xferlog_std_format=YES
# WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log
xferlog_file=/var/log/xferlog
#
# Switches between logging into vsftpd_log_file and xferlog_file files.
# NO writes to vsftpd_log_file, YES to xferlog_file
xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
#
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES
#
# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
# sockets, you must run two copies of vsftpd with two configuration files.
# Make sure, that one of the listen options is commented !!
#listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

## FOR NAT
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12100

Adicionar o /bin/true nos shells do sistema

echo "/bin/true" > /etc/shells

Cadastrando um usuário qualquer

useradd -s /bin/true -m jose

Definindo uma senha para ele

passwd jose

Reiniciando o vsftpd

/etc/init.d/vsftpd restart

Colocando o serviço na inicialização do sistema

chkconfig --add vsftpd
chkconfig vsftpd on

Referências