Neste artigo irei demonstrar como podemos configurar um
servidor de FTP no
Raspberry Pi, que pode ser utilizado para compartilhar arquivos através de seus dispositivos. Iremos utilizar o
vsFTPd, pois ele é muito estável, seguro, além de um servidor FTP muito rápido. Irei também demonstrar como configurar o vsFTPd para restringir os usuários para seus diretórios HOME, junto com a criptografia de toda a conexão utilizando SSL/TLS.
Caso queira seguir esse material, você deve possuir o Raspberry Pi OS instalado no seu Raspberry Pi. A execução de um servidor FTP não requer uma interface gráfica, então recomendo a instalação do Raspberry Pi OS Lite com o serviço SSH habilitado, viabilizando o acesso remoto.
Instalar o vsFTPd no Raspberry Pi
O pacote vsftpd está disponível nos repositórios oficiais do Raspberry Pi OS, portanto pode ser instalado com os seguintes comandos:
sudo apt update
sudo apt install vsftpd
Após a instalação, o serviço do servidor de FTP será iniciado automaticamente. Para verificar o status desse serviço, execute:
sudo systemctl status vsftpd
O retorno desse comando deve retornar "Active: active (running) since ...", algo como:
vsftpd.service - vsftpd FTP server
Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-05-23 07:02:41 BST; 14s ago
...
Configurar o servidor FTP com o vsFTPd
A configuração do vsFTPd é realizada através do arquivo
/etc/vsftpd.conf.
A maioria das configurações está bem documentada, em inglês, no arquivo de configuração. Caso você deseje avaliar todas as opções disponíveis, recomendo o site oficial em:
Manpage of VSFTPD.CONF
1. Acesso ao servidor de FTP
Para garantir que apenas os usuários locais do sistema operacional possam acessar o servidor FTP, busque pelas entradas anonymous_enable e local_enable no arquivo de configuração, deixando-as da seguinte forma:
anonymous_enable=NO
local_enable=YES
2. Habilitando os uploads
Localize e descomente a configuração write_enable para permitir alterações no sistema de arquivos, habilitando o upload e a remoção dos arquivos pelos usuários:
write_enable=YES
3. Jaula chroot
Para prevenir que os usuários FTP acessem arquivos fora de sua pasta home, devemos criar uma jaula chroot, descomentando a configuração
chroot_local_user:
chroot_local_user=YES
Quando a função chroot está ativa, o vsFTPd irá inviabilizar o upload de arquivos, caso o diretório do usuário esteja bloqueado.
Utilize uma das opções abaixo para deixar o ambiente chroot no modo de escrita.
Opção 1 - a forma recomendada para habilitar o upload dos arquivos e deixar o chroot ativo, configurando os diretórios do FTP. No exemplo a seguir, irei criar um diretório de ftp dentro da pasta home do usuário, que servirá como a pasta utilizada pelo chroot e habilitará o upload dos arquivos nela.
user_sub_token=$USER
local_root=/home/$USER/ftp
Opção 2 - outra alternativa é adicionar a configuração allow_writeable_chroot no arquivo vsftpd.conf. Essa opção irá habilitar a opção de escrita na pasta home dos usuários.
allow_writeable_chroot=YES
4. Conexões passivas no servidor FTP
Por padrão, o vsFTPd utiliza o modo ativo. Para utilizar o modo passivo, defina o intervalo mínimo e máximo de portas utilizado.
pasv_min_port=30000
pasv_max_port=31000
O vsFTPd pode utilizar qualquer porta no modo passivo. Quando o modo passivo é habilitado, o cliente FTP abre uma conexão em uma porta aleatória na conexão com o servidor FTP, no intervalo que você definiu no arquivo de configuração.
5. Limitar o log in para certos usuários
Podemos configurar o vsFTPd para permitir o log in de apenas alguns usuários. Para realizar essa configuração, adicione as seguintes linhas no arquivo de configurações:
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
Quando esta configuração está habilitada, você deve explicitar quais usuários poderão realizar o log in, adicionando seus user names no arquivo /etc/vsftpd.user_list, sendo um usuário por linha.
6. Transmissão segura com SSL/TLS
Para criptografar a transmissão FTP com SSL/TLS, você precisa possuir um certificado SSL e configurar o servidor FTP para utilizá-lo. Podemos utilizar um certificado SSL existente assinado por uma emissora certificada, ou criar um certificado auto assinado.
Caso você possua um domínio, ou subdomínio apontando para o IP do seu servidor FTP, pode gerar um certificado SSL gratuito utilizando o Let's Encrypt. Caso nunca tenha utilizado, segue a documentação oficial:
Começando a Usar - Let's Encrypt - Certificados SSL/TLS Gratuitos
Neste artigo, iremos gerar uma chave auto assinada, utilizando o comando openssl.
Execute o comando abaixo para criar uma chave (certificado) de 2048 bits privada, auto assinada e válida por 10 anos. As chaves públicas e privadas serão armazenadas no mesmo arquivo.
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Após a criação das chaves, abra novamente o arquivo de configurações do vsFTPd:
sudo nano /etc/vsftpd.conf
Encontre as configurações rsa_cert_file e rsa_private_key_file, alterando seus valores para o arquivo pem e defina a configuração ssl_enable para YES.
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
Caso essas configurações não estejam configuradas da forma correta, o servidor de FTP irá utilizar apenas o TLS para deixar as conexões seguras.
Reiniciar o servidor de FTP
Quando as configurações acima forem realizadas, o arquivo de configurações do vsFTPd deve estar desta forma (sem os comentários):
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=30000
pasv_max_port=31000
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
Salve o arquivo e reinicie o serviço do vsFTPd para que as alterações desse arquivo tenham efeito:
sudo systemctl restart vsftpd
Abrindo o Firewall
Caso você utilize o UFW Firewall na sua distribuição, deverá liberar o tráfego FTP, abrindo as portas 20 (dados do FTP), 21 (comandos do FTP) e 30000-31000 (portas do modo passivo), através dos seguintes comandos:
sudo ufw allow 20:21/tcp
sudo ufw allow 30000:31000/tcp
Agora, releia as regras do UFW, desabilitando-as e reabilitando.
sudo ufw disable
sudo ufw enable
Criar um usuário para o FTP
Para testar nosso servidor de FTP, iremos criar um usuário.
- Caso você já tenha um usuário que será utilizado e deseja apenas liberar seu acesso, pule o primeiro passo.
- Caso tenha definido allow_writeable_chroot=YES no seu arquivo de configuração, pule o terceiro passo.
01. Criar um usuário chamado novouserftp:
sudo adduser novouserftp
Quando solicitado, defina a senha do usuário.
02. Adicionar o usuário a lista dos que poderão utilizar o servidor de FTP.
echo "novouserftp" | sudo tee -a /etc/vsftpd.user_list
03. Criar o diretório do FTP e definir as permissões corretas.
sudo mkdir -p /home/novouserftp/ftp/upload
sudo chmod 550 /home/novouserftp/ftp
sudo chmod 750 /home/novouserftp/ftp/upload
sudo chown -R novouserftp: /home/novouserftp/ftp
Como discutido anteriormente, o usuário poderá realizar o upload de arquivos na pasta ftp/upload do seu diretório home.
Neste ponto, seu servidor FTP está totalmente funcional e você pode conectar nele utilizando clientes de FTP, como o FileZilla!
Desabilitar o acesso via shell
Por padrão, quando um usuário é criado, caso não seja realizada uma configuração adicional, este usuário possui acesso SSH ao servidor. Para desabilitar este acesso, crie um novo shell que apenas exiba uma mensagem dizendo ao usuário que essa conta está limitada apenas ao acesso via FTP.
Crie o shell
/bin/ftponly e deixe-o executável.
echo -e '#!/bin/sh
echo "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly
sudo chmod a+x /bin/ftponly
Acrescente o novo shell à lista dos shells válidos, no arquivo
/etc/shells:
echo "/bin/ftponly" | sudo tee -a /etc/shells
Altere a shell do usuário criado para /bin/ftponly:
sudo usermod novouserftp -s /bin/ftponly
Utilize este último comando para todos os usuários que terão acesso apenas ao servidor FTP.
Conclusões
Espero que tenha ficado claro como instalar e configurar um servidor de FTP rápido e seguro no seu sistema Raspberry Pi.