212.2 Protegendo Servidores FTP
Introdução
O FTP (File Transfer Protocol) é um protocolo de rede usado para transferência de arquivos entre computadores conectados à internet ou a uma rede local. Ele foi criado em 1971 por Abhay Bhushan como parte de seu trabalho de tese de mestrado em ciência da computação na Universidade de Massachusetts.
O FTP usa duas portas: a porta 21 para a conexão de controle e a porta 20 para a transferência de dados. A porta 21 é usada para estabelecer a conexão entre o cliente e o servidor FTP, enquanto a porta 20 é usada para transferir os dados propriamente ditos.
O FTP é amplamente utilizado para o compartilhamento de arquivos, especialmente em ambientes corporativos e de rede. Ele é considerado um protocolo inseguro, pois envia as informações de login e senha em texto claro, tornando fácil a interceptação por hackers. Para contornar esse problema, é recomendado o uso de versões mais seguras do protocolo, como o SFTP (Secure File Transfer Protocol) ou o FTPS (FTP over SSL/TLS).
No FTP, existem dois modos de transferência de dados: o modo ativo e o modo passivo.
modo ativo
O cliente inicia a conexão com o servidor na porta 21 e solicita que o servidor abra uma conexão na porta 20 para enviar os dados. O servidor então inicia uma conexão de dados com o cliente na porta 20 para transferir os arquivos. Esse modo é chamado de ativo porque o servidor é quem inicia a conexão de dados com o cliente.modo passivo
O cliente inicia a conexão de controle com o servidor na porta 21, mas em vez de o servidor iniciar a conexão de dados na porta 20, ele solicita que o cliente abra uma conexão na porta especificada para transferir os dados (essa porta é escolhida pelo servidor a partir de um conjunto de portas configuradas para esse fim, geralmente acima da porta 1024.). Dessa forma, o cliente é quem inicia a conexão de dados com o servidor. Esse modo é chamado de passivo porque o cliente é quem inicia a conexão de dados com o servidor.O modo passivo é mais comum e mais seguro do que o modo ativo, pois ele permite que as conexões de dados sejam iniciadas apenas pelo cliente, evitando problemas com firewalls e NATs. Além disso, ele também é mais seguro porque o servidor não precisa abrir uma porta adicional para enviar os dados, o que pode deixar o servidor vulnerável a ataques.
vsftpd
O vsftpd (Very Secure FTP Daemon) é um servidor FTP de código aberto e amplamente utilizado em sistemas Unix e Linux. Ele é considerado um dos servidores FTP mais seguros e estáveis disponíveis, com recursos avançados de segurança e suporte a TLS/SSL.
O vsftpd foi projetado para ser leve e eficiente em termos de recursos, tornando-o uma escolha popular para servidores de arquivos e transferência de dados em redes de grande porte. Ele suporta configurações avançadas, incluindo suporte a IPv6, autenticação de usuários virtuais e controle de acesso baseado em IP, entre outras funcionalidades.
O vsftpd é uma opção popular para implementações de FTP em ambientes Linux/Unix. Além do VSFTPD temos também o ProFTPD e Pure-FTPD que é muito utilizado. Vamos instalar o vsftpd:
# Instale os pacotes abaixo:
$ sudo apt install -y vsftpd
- CentOS 7
- Ubuntu 20.04
O arquivo de configuração fica em: /etc/vsftpd/vsftpd.conf
.
O arquivo de configuração fica em: /etc/vsftpd.conf
.
As principais configurações do VSFTPD são:
opção | Descrição |
---|---|
listen | Vamos iniciar o VSFTPD como standalone ou com xinetd (standalone podemos usar o systemctl para gerenciar), o valor de NO será executado como um daemon independente e não será controlado pelo xinetd. |
anonymous_enable | Define se a conexão anônima é permitida. Se definido como YES, os usuários anônimos podem se conectar sem fornecer credenciais de login. Se definido como NO, apenas usuários autenticados podem se conectar. |
local_enable | Define se os usuários locais são permitidos para se conectar e acessar o servidor FTP. Se definido como YES, os usuários locais podem se conectar usando suas credenciais de sistema. Se definido como NO, apenas usuários anônimos podem se conectar. |
write_enable | Define se os usuários podem fazer upload ou modificar arquivos no servidor FTP. Se definido como YES, os usuários podem fazer upload e modificar arquivos se tiverem permissão de gravação. Se definido como NO, os usuários só podem ler arquivos. |
anon_upload_enable | Define se os usuários anônimos podem fazer upload de arquivos para o servidor FTP. Quando essa opção é definida como YES, usuários anônimos terão permissão para enviar arquivos para o servidor, desde que a diretiva write_enable=YES também esteja definida. |
anon_mkdir_write_enable | Define se os usuários anônimos podem criar diretórios no servidor FTP. É importante ter cuidado ao habilitar essa opção, pois pode permitir que usuários mal-intencionados criem diretórios indesejados no servidor. Por padrão, essa opção é definida como NO. |
chroot_local_user | Define se o diretório raiz para usuários locais deve ser o diretório de sua pasta pessoal, ou seja, usar sua HOME (se definido como YES vai usar a HOME) ou o diretório raiz do servidor FTP (NO). Também impede que um usuários dentro do FTP naveguem pelo sistema de arquivos, é possível configurar para que o vsftpd restrinja o acesso deles a um diretório específico, também conhecido como chroot jail. |
pasv_enable | Define se o modo passivo está habilitado. Se definido como YES, o servidor FTP permitirá conexões de dados no modo passivo. Se definido como NO, o servidor FTP permitirá apenas conexões de dados no modo ativo. |
pasv_min_port e pasv_max_port | Define as portas a serem usadas para conexões de dados no modo passivo. Essas portas precisam ser configuradas no firewall para permitir conexões de entrada. |
ftp_username | Define o nome de usuário usado pelo vsftpd para realizar as operações de sistema de arquivos no servidor FTP, é sob qual usuário o daemon do VSFTPD vai rodar no sistema. Por padrão, o vsftpd usa o usuário "nobody" para realizar essas operações, mas em alguns casos, isso pode causar problemas de permissão. Ao definir a opção ftp_username, é possível especificar um nome de usuário diferente que tenha as permissões adequadas para realizar as operações de sistema de arquivos no servidor FTP. |
anon_root | É usada para especificar o diretório raiz para usuários anônimos. É o diretório que o usuário anônimo terá acesso quando ele se conectar ao servidor FTP. Por padrão, o diretório raiz para usuários anônimos é o diretório /srv/ftp , mas com a opção anon_root é possível alterá-lo para qualquer outro diretório desejado. Por exemplo, se a opção anon_root for definida como /var/ftp , os usuários anônimos serão levados diretamente para este diretório quando conectarem no servidor FTP. |
Após definir as opções de sua escolha reinicie o serviço:
$ sudo systemctl restart vsftpd
O usuário anonimo nunca deve conseguir escrever na Raiz, devemos criar um diretório dentro da raiz que ele loga e nesse diretório ele deverá logar.
Se remover a permissão de leitura não será possível ver o que tem dentro do diretório com ls
.
Cliente FTP
Como cliente podemos usar o terminal ou um gerenciador de interface gráfica como o FileZilla. No terminal é bem simples:
# Abra uma conexão com o servidor FTP:
$ ftp 192.168.151.2
Connected to 192.168.151.2.
220 (vsFTPd 3.0.3)
Name (192.168.151.2:vagrant): vagrant
331 Please specify the password.
$ Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Dentro do FTP podemos usar ls
para listar, get
para baixar um arquivo, put
para enviar um arquivo, além dos comandos normais como: mkdir, cd, rmdir etc.
Para mudar para o modo passivo, basta digitar
passive
depois de logar no servidor FTP.
Pure-FTPD
O Pure-FTPd é um software de servidor FTP (Protocolo de Transferência de Arquivos) gratuito, seguro e eficiente. Ele é escrito em linguagem C e é projetado para ser executado em sistemas operacionais Unix e seus derivados, como Linux e FreeBSD. O Pure-FTPd suporta uma ampla variedade de recursos, incluindo autenticação de usuários virtual, TLS / SSL (criptografia segura), suporte a IPv6, restrições de taxa de transferência, limites de tamanho de arquivo, entre outros recursos avançados. É uma opção popular para hospedagem web, backup de arquivos, compartilhamento de arquivos e outras aplicações que envolvem transferência de arquivos pela internet.
- CentOS 7
- Ubuntu 20.04
Vamos instalar o pure-ftpd:
# Instale os pacotes abaixo:
$ sudo yum install -y pure-ftpd
O arquivo de configuração fica em: /etc/pure-ftpd/pure-ftpd.conf
.
Vamos instalar o pure-ftpd:
# Instale os pacotes abaixo:
$ sudo apt install -y pure-ftpd
O arquivo de configuração fica em: /etc/pure-ftpd/pure-ftpd.conf
, além desse arquivo ainda temos um outro que dita como o processo vai ser iniciado: /etc/default/pure-ftpd-common
. O padrão é iniciar no modo standalone
.
Além de /etc/pure-ftpd/pure-ftpd.conf
, é possível encontrar arquivos de configuração em /etc/pure-ftpd/conf/
, onde cada arquivo de configuração recebe o nome da configuração e dentro do arquivo deve ser colocado a configuração do servidor FTP. As configurações no arquivo /etc/pure-ftpd/conf
têm prioridade sobre as configurações no arquivo /etc/pure-ftpd/pure-ftpd.conf
.
Em resumo, o diretório /etc/pure-ftpd/conf/
é usado para configurações específicas de usuário e diretório, enquanto o arquivo /etc/pure-ftpd/pure-ftpd.conf
é usado para configurações globais do servidor FTP, então sempre coloque as configurações dentro de /etc/pure-ftpd/conf/
, caso contrário, pode não funcionar.
As principais configurações do Pure-FTPD são:
Opção | Descrição |
---|---|
AltLog | Define o caminho e o nome do arquivo de log alternativo. |
AllowUserFXP | Define se a transferência de arquivos entre dois clientes FTP (FXP) é permitida. Se definido como YES, os clientes FTP podem transferir arquivos diretamente entre si, sem que os dados precisem passar pelo servidor. Se definido como NO, a transferência de arquivos FXP é proibida. |
AnonymousBandwidth | Define a largura de banda máxima permitida para usuários anônimos. |
AnonymousCanCreateDirs | Define se usuários anônimos podem criar diretórios no servidor FTP. |
AnonymousCantUpload | Define se usuários anônimos têm permissão para enviar arquivos para o servidor FTP. |
AnonymousOnly | Define se apenas usuários anônimos têm permissão para se conectar ao servidor FTP. |
NoAnonymous | Define se usuários anônimos têm permissão para se conectar ao servidor FTP. |
AntiWarez | Define se o servidor FTP deve tentar detectar e impedir a distribuição ilegal de software (warez). |
AutoRename | Define se o servidor FTP deve renomear automaticamente arquivos com nomes duplicados. |
Bind | Define o endereço IP que o servidor FTP deve usar para se comunicar com clientes. |
BrokenClientsCompatibility | Define se o servidor FTP deve tentar se comunicar com clientes FTP antigos ou que não estejam em conformidade com os padrões. |
ChrootEveryone | Define se todos os usuários devem ser confinados em suas próprias pastas home. |
FSCharset | Define o conjunto de caracteres usado pelo servidor FTP para nomear arquivos e diretórios. |
FortunesFile | Define o arquivo de citações de "fortunes" que o servidor FTP deve usar. |
IPFilter | Define uma lista de endereços IP que são permitidos ou proibidos de se conectar ao servidor FTP. |
LDAPConfigFile | Define o arquivo de configuração do LDAP que o servidor FTP deve usar. |
LimitRecursion | Define a profundidade máxima de recursão de diretórios permitida. |
MaxClientsNumber | Define o número máximo de conexões simultâneas permitidas. |
MaxClientsPerIP | Define o número máximo de conexões simultâneas permitidas para cada endereço IP. |
MaxDiskUsage | Define o tamanho máximo do diretório raiz do servidor FTP. |
MaxIdleTime | Define o tempo máximo que um usuário pode ficar ocioso antes de ser desconectado. |
MaxLoad | Define a carga máxima permitida no servidor FTP. |
MaxLoginAttempts | Define o número máximo de tentativas de login permitidas antes que um usuário seja desconectado. |
MaxProcesses | Define o número máximo de processos que o servidor FTP pode usar. |
MaxRatio | Define a taxa máxima de upload/download permitida para usuários. |
NoChmod | Define se os usuários têm permissão para alterar as permissões de arquivo. |
NoRename | Define se os usuários têm permissão para renomear arquivos. |
PassivePortRange | Define o intervalo de portas passivas permitidas. |
PAMAuthentication | Define se a autenticação PAM deve ser usada. |
UnixAuthentication | Define se a autenticação deve ser realizada via Unix. Se definido como YES, o Pure-FTPD usará os arquivos de senha Unix para autenticar os usuários. Se definido como NO, o Pure-FTPD usará seus próprios mecanismos de autenticação. |
PureDB | Define o caminho para o arquivo de banco de dados do Pure-FTPD. Este arquivo contém informações sobre os usuários FTP e suas senhas criptografadas. |
Quota | Define se as quotas de disco devem ser habilitadas. Se definido como YES, o Pure-FTPD limitará o espaço em disco disponível para cada usuário. É importante lembrar que o sistema de arquivos usado pelo Pure-FTPD deve suportar quotas. |
TLS | Define se o Pure-FTPD deve usar o protocolo TLS (Transport Layer Security) para criptografar as comunicações FTP. Se definido como YES, o Pure-FTPD exigirá que os clientes usem conexões criptografadas. Por padrão, essa opção é definida como NO. |
TLSCertificateFile | Define o caminho para o arquivo de certificado TLS. Este arquivo deve conter o certificado TLS usado para criptografar as comunicações FTP. |
TLSCertificateKeyFile | Define o caminho para o arquivo de chave privada TLS. Este arquivo deve conter a chave privada correspondente ao certificado TLS. |
TLSRequiredCipher | Define a lista de cifras de criptografia TLS que o Pure-FTPD aceitará para estabelecer uma conexão segura. |
O nome do Daemon é
pure-ftpd.service
.
Para executar com usuário anonimo temos que criar uma conta de usuário para ftp.
sudo useradd --home-dir=/var/tmp ftp
# /var/tmp é a home que o usuário anonimo vai cair quando logar.
Além de executar o Pure-FTPD como um daemon controlado pelo SystemD, podemos executar ele via comando, criando um processo que inicia o servidor FTP:
# Pare a execução do Pure-FTPD pelo SystemD:
$ sudo systemctl stop pure-ftpd
# Agora inicie via comando:
$ sudo pure-ftpd -e -i &
ProFTPD
ProFTPD é um servidor de FTP (File Transfer Protocol) de código aberto e gratuito, que permite a transferência de arquivos entre computadores através da Internet. Ele foi criado em 1997 por um grupo de desenvolvedores liderados por TJ Saunders.
O ProFTPD é muito flexível e escalável, e suporta vários recursos avançados, criptografia SSL/TLS, limites de banda e quotas de disco. Além disso, o servidor é altamente configurável e personalizável, permitindo que os administradores de sistema ajustem as configurações para atender às necessidades específicas de suas redes.
- CentOS 7
- Ubuntu 20.04
Vamos instalar o proftpd:
# Instale os pacotes abaixo:
$ sudo yum install -y proftpd
O arquivo de configuração fica em: /etc/proftpd/proftpd.conf
.
Vamos instalar o proftpd:
# Instale os pacotes abaixo:
$ sudo apt install -y proftpd
O arquivo de configuração fica em: /etc/proftpd/proftpd.conf
.
Após a instalação vamos mover os usuários ativos para /etc/ftpusers
, impedindo que esses usuário acessem o FTP. Vamos então, criar um usuário especifico para acessar o FTP, caso usuários ativos precisem acessar o FTP, o administrador, deve fazer a remoção dos usuários no arquivo em questão.
As principais configurações do proftpd são:
Opção | Descrição |
---|---|
AltLog | Define o caminho e o nome do arquivo de log alternativo. |
AllowUserFXP | Define se a transferência de arquivos entre dois clientes FTP (FXP) é permitida. Se definido como YES, os clientes FTP podem transferir arquivos diretamente entre si, sem que os dados precisem passar pelo servidor. Se definido como NO, a transferência de arquivos FXP é proibida. |
AnonymousBandwidth | Define a largura de banda máxima permitida para usuários anônimos. |
DefaultRoot | Define o diretório raiz padrão para usuários autenticados. |
Directory | Define as permissões de acesso, proprietário e grupo para um diretório específico. |
Global | Define configurações globais para todo o servidor. |
Group | Define o grupo padrão para os arquivos enviados por um usuário. |
IdentLookups | Define se o servidor deve realizar lookups de ident (identificação do usuário remoto) para cada conexão. |
Limit | Define limitações específicas para um grupo de usuários ou diretório. |
ListOptions | Define as opções de exibição para o comando LIST, que lista o conteúdo do diretório atual. |
MaxClients | Define o número máximo de conexões simultâneas permitidas. |
MaxLoginAttempts | Define o número máximo de tentativas de login permitidas. |
PathAllowFilter | Define um filtro de permissão de acesso para diretórios e arquivos. |
RequireValidShell | Define se os usuários precisam ter um shell válido para fazer login. |
RootLogin | Define se os usuários com permissão de root podem fazer login no servidor. |
ServerName | Define o nome do servidor que será exibido para os usuários. |
TimeoutIdle | Define o tempo limite para uma conexão ociosa antes que o servidor a feche. |
UseReverseDNS | Define se o servidor deve tentar realizar lookups reversos de DNS para identificar o endereço IP remoto. |
Vamos as configurações:
# Faça backup das configurações atuais:
$ sudo mv /etc/proftpd/proftpd.conf /etc/proftpd/proftpd.conf.bak-$(date +%H:%M:%S)
# baixe as configurações:
$ sudo wget -O /etc/proftpd/proftpd.conf https://gitlab.com/sysnetbr/codes/-/raw/main/ftp/proftpd.conf
# Reinicie o serviço:
$ sudo systemctl restart proftpd.service
# Para criar usuários que devam acessar o FTP:
$ sudo useradd -m -s /bin/nologin fulano
$ sudo usermod -p $(openssl passwd -1 123) fulano
# Todos os usuários que não devam acessar o FTP devem ser adicionados ao arquivo abaixo:
$ sudo cat /etc/ftpusers
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
nobody
vagrant
Ao invés de
/bin/nologin
pode ser/bin/false
.
VSFTPD vs ProFTPD vs Pure-FTPD
Todos as três opções são servidores FTP mais populares disponíveis no mercado atualmente. Cada um tem suas próprias vantagens e desvantagens, e a escolha de qual usar vai depender das necessidades do usuário. Abaixo estão algumas diferenças entre eles:
O ProFTPD é um servidor FTP de código aberto que suporta uma ampla variedade de recursos, incluindo conexões seguras via SSL/TLS, virtualização de usuários e grupos, limitação de taxa de transferência, configuração flexível de diretórios e arquivos compartilhados, e muitos outros recursos. O ProFTPD é altamente configurável e pode ser personalizado para atender às necessidades específicas de diferentes ambientes.
Por outro lado, o vsftpd (Very Secure FTP Daemon) é conhecido por sua simplicidade e segurança. Ele foi projetado para ser pequeno, rápido e fácil de configurar. O vsftpd inclui recursos como suporte a SSL/TLS, autenticação virtual, limitação de taxa de transferência e suporte a IPv6. O vsftpd é conhecido por ser um dos servidores FTP mais seguros disponíveis e é frequentemente usado em servidores públicos.
Já o Pure-FTPd é um servidor FTP seguro, que suporta autenticação virtual, conexões SSL/TLS, limitação de taxa de transferência e uma ampla variedade de recursos avançados. Ele é projetado para ser executado em sistemas operacionais Linux/Unix. É considerado uma opção fácil de instalar e configurar.
Em geral, a escolha entre ProFTPD, vsftpd e Pure-FTPD dependerá das necessidades específicas do usuário. O ProFTPD é uma boa escolha para usuários que precisam de uma ampla variedade de recursos e flexibilidade de configuração, enquanto o vsftpd é uma boa escolha para usuários que valorizam a simplicidade e a segurança. O Pure-FTPd é uma opção segura e fácil de instalar e configurar, com uma ampla variedade de recursos avançados.
Vejamos alguns pontos relevantes na hora de escolher qual usar.
Segurança
Todos os três servidores FTP são conhecidos por serem seguros, com vários recursos de segurança, como suporte SSL/TLS e autenticação de usuários virtuais. No entanto, o VSFTPD é frequentemente considerado o mais seguro dos três devido ao seu foco na segurança e na minimização de vulnerabilidades.Velocidade
O VSFTPD é conhecido por sua alta velocidade e eficiência, e é frequentemente usado em ambientes de alta demanda, como provedores de hospedagem. O Pure-FTPd também é rápido, mas não é tão otimizado quanto o VSFTPD. O ProFTPD é um pouco mais lento em comparação com os outros dois, mas ainda é rápido o suficiente para a maioria das aplicações.Personalização
O ProFTPD é altamente personalizável e permite que os usuários modifiquem e personalizem várias opções, como limites de conexão, suporte a diferentes módulos e plugins, e muito mais. O VSFTPD também é altamente configurável, mas não tanto quanto o ProFTPD. O Pure-FTPd é um pouco menos personalizável, mas ainda oferece muitas opções avançadas para usuários experientes.Facilidade de uso
O VSFTPD é considerado fácil de usar e configurar, é frequentemente recomendado para usuários iniciantes. O Pure-FTPd é ainda mais fácil de usar e configurar. O ProFTPD é um pouco mais complexo em comparação com os outros dois e pode exigir um pouco mais de experiência em servidores FTP para configurá-lo corretamente.Suporte
O VSFTPD é um projeto de código aberto com uma grande comunidade de usuários e desenvolvedores, o que significa que há muitos recursos disponíveis online para ajudar a solucionar problemas e responder a perguntas. O ProFTPD e o Pure-FTPd também são projetos de código aberto com uma comunidade de usuários e desenvolvedores, mas não são tão amplamente usados quanto o VSFTPD.
Fontes importantes
https://major.io/2007/07/01/active-ftp-connections-through-iptables/