Como criar um servidor FTP (Pure-FTPd) com usuário no banco de dados MariaDB/MySQL com Debian 11 Bullseye
Neste tutorial vamos montar um servidor FTP utilizando o PureFTPd com usuários no banco de dados Mysql ao invés de usar usuários do sistema, vamos ainda poder configurar quotas e limites de upload e download.
Requisito:
Debian 11 Instalação Limpa
Vire root de maneira correta no Debian 11!
# su -
Instalação do banco de dados MariaDB
# apt install mariadb-server mariadb-client
Por padrão o pacote MaraiDB no Debian usa unix_socket para autenticar o login do usuário, o que basicamente significa que você pode usar o nome de usuário e a senha do sistema operacional para efetuar login no console do MariaDB.
Definindo senha para o root do mariaDB
Para aumentar a seguraçã vamos definir uma senha para o usuário root do MariDB, não esqueça de alterar ALTERE_3ST4_SENHA pela sua senha.
# mariadb -u root
USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED BY 'ALTERE_3ST4_SENHA'; FLUSH PRIVILEGES; EXIT;
Apague seus rastros, em /root/.mysql_history temos um histórico com todos os comandos dado no terminal do MariaDB, então não é legal deixar lá em texto puro a senha que setamos!
# > /root/.mysql_history
Instalação do Pure FTP
# apt install pure-ftpd-mysql
Agora criaremos nosso grupo FTP (grupoftp) e usuário (pureftpd) para que nosso usuários virtuais sejam mapeados.
# groupadd -g 2001 ftpgroup # useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser
# vim /etc/default/pure-ftpd-common
altere
UPLOADUID= UPLOADGID=
para
UPLOADUID=2001 UPLOADGID=2001
Próximo passo criar a nossa base de dados, onde ficaram armazenado as informações dos nossos usuários.
# mariadb -u root -p
Entre com a senha de root criada anteriormente. Não esqueça de alterar senha (SENHA_FTP_USER).
CREATE DATABASE pureftpd; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'SENHA_FTP_USER'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'SENHA_FTP_USER'; FLUSH PRIVILEGES;
Crie a tabela
USE pureftpd; CREATE TABLE ftpd ( User varchar(16) NOT NULL default '', status enum('0','1') NOT NULL default '0', Password varchar(64) NOT NULL default '', Uid varchar(11) NOT NULL default '-1', Gid varchar(11) NOT NULL default '-1', Dir varchar(128) NOT NULL default '', ULBandwidth smallint(5) NOT NULL default '0', DLBandwidth smallint(5) NOT NULL default '0', comment tinytext NOT NULL, ipaccess varchar(15) NOT NULL default '*', QuotaSize smallint(5) NOT NULL default '0', QuotaFiles int(11) NOT NULL default 0, PRIMARY KEY (User), UNIQUE KEY User (User) ); EXIT;
Salve o arquivo original /etc/pure-ftpd/db/mysql.conf e crie um novo com novas configurações, mais uma vez preste atenção a senha [SENHA_FTP_USER].
# mv /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig # vim /etc/pure-ftpd/db/mysql.conf
Adicione:
MYSQLSocket /var/run/mysqld/mysqld.sock MYSQLUser pureftpd MYSQLPassword SENHA_FTP_USER MYSQLDatabase pureftpd MYSQLCrypt md5 MYSQLGetPW SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetUID SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetGID SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MYSQLGetDir SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R") MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
Esteja certo que você mudou o campo MYSQLPassword ‘SENHA_FTP_USER’
A configuração ChrootEveryone fará com que o PureFTPd faça chroot em todos os usuários virtuais em seu diretório pessoal, para que ele não consiga procurar diretórios e arquivos fora do diretório pessoal. A linha CreateHomeDir fará com que o PureFTPd crie o diretório inicial de um usuário quando o usuário efetuar login e o diretório inicial ainda não existir.
# echo yes > /etc/pure-ftpd/conf/ChrootEveryone # echo yes > /etc/pure-ftpd/conf/CreateHomeDir # echo 1 > /etc/pure-ftpd/conf/TLS # echo HIGH > /etc/pure-ftpd/conf/TLSCipherSuite
Gere os certificados.
# openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048 # openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout \ /etc/ssl/private/pure-ftpd.pem \ -out /etc/ssl/private/pure-ftpd.pem # chmod 600 /etc/ssl/private/*.pem
Vamos criar agora um usuário, Qual ficará dentro do diretório /var/pure-ftpd/ onde vou deixar todos meus usuários criado, porém você pode escolher qualquer diretório, usarei a pasta /var/ pois seria o “lugar correto”.
Entre no mariadb com seu usuario pureftpd e senha para fazer a criação do usuário ftp, no meu ex vou criar o usuário chamado remontti.
# mysql -u pureftpd -p
USE pureftpd; INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('remontti', '1', MD5('SUA_SENHA'), '2001', '2001', '/var/pure-ftpd/remontti', '100', '100', '', '*', '50', '0'); SELECT * FROM ftpd; EXIT;
Limpe o histórico do mariadb. Não queremos ninguém vendo o q digitamos lá 😛
# > /root/.mysql_history
Ao fazer login o diretório /var/pure-ftpd/USUARIO será criado automaticamente.
Restarte o serviço e verifique o status do mesmo
# systemctl restart pure-ftpd-mysql # systemctl status pure-ftpd-mysql
Sempre que você queira criar um novo usuário, você tem que criar uma entrada na tabela ftpd.
Explicando a estrutura da tabela:
User: Seu usuário (ex. como no nosso usuário acima: teste).
Status: 0 ou 1. 0 deixará sua conta inativa, e o usuário não pode logar.
Password: A senha do usuário. A senha está encriptada com MD5.
UID: O userid do usuário ftp que você criou (ex: 2001)
GID: O groupid do grupo ftp que você criou (ex: 2001).
Dir: Diretório home do usuário (ex: /home/teste). Se não existir será criado quando logar pela primeira vez via FTP. O usuário será preso neste diretório home.
ULBandwidth: Controle de Upload em KB/Sec. Use 0 para que seja ilimitado.
DLBandwidth: Controle de Download em KB/sec. Use 0 para que seja ilimitado.
Comment: Você pode inserir qualquer comentário (ex: Usuário da administração). Você deixa este campo limpo.
Ipaccess: Você pode definir o ip que serão permitidos para conectar nesta conta FTP. Ou ‘*’ para qualquer endereço IP.
QuotaSize: Espaço de armazenamento em MB (não KB, como em ULBandwidth eDLBandwidth) Defina 0 como ilimitado.
QuotaFiles: Número total de arquivos que este usuário poderá salvar. Defina 0 para ilimitado.
Protegendo com Fail2ban
# apt install fail2ban # echo yes > /etc/pure-ftpd/conf/DontResolve # vim /etc/fail2ban/jail.d/defaults-debian.conf
Adicione o filtro pure-ftpd.
[sshd] enabled = true [pure-ftpd] enabled = true
Restarte o fail2ban
# systemctl restart fail2ban
Se você tiver interesse em ter uma interface web para gerenciamento recomendo:
Passo-a-passo como criar um servidor WEB Apache + PHP + MariaDB + phpMyAdmin + Let’s Encrypt no Debian 11 bullseye “LAMP”
Gostou?
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!
Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Abraço!
Fonte: http://download.pureftpd.org/pub/pure-ftpd/doc/README.MySQL
Como remover um usuario ou alterar a senha?
Boa tarde, para alterar a porta padrão 21 para outra porta onde seria ?
crie o arquivo Bind em /etc/pure-ftpd/ com o numero da porta que deseja.
echo “2121” > /etc/pure-ftpd/conf/Bind
Como faço pra renovar o certificado?
aqui tive que mudar o diretorio para apenas /
depois disso funciona bem, muito obrigado.
no debian 12 da o erro [WARNING] Authentication failed for user, alguma dica, obrigado
no pagina do pureftpds-mysql encontrei essa informação, Support for MD5, SHA1 and the MySQL PASSWORD() function were removed for password hashing. You should now use scrypt, argon2 or the system crypt(3) function.
encrontrei a solução.
no /etc/pure-ftpd/db/mysql.conf mudar de MYSQLCrypt md5 para MYSQLCrypt crypt e criar usuario com ENCRYPT
INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`)
VALUES (‘remontti’, ‘1’, ENCRYPT(‘SUA_SENHA’), ‘2001’, ‘2001’, ‘/var/pure-ftpd/remontti’, ‘100’, ‘100’, ”, ‘*’, ’50’, ‘0’);
funcionando 100% no Debian 12
Rudimar, muito obrigado pelo conteudo, você é fera!!
Uma pergunta, posso utilizar esse serviço para fazer backups de olts, switchs, routeros entre outros ? Obrigado.
Oi Rudimar, gostei muito… porém tive problema na geração do certificado. Neste passo: openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout \
/etc/ssl/private/pure-ftpd.pem \
-out /etc/ssl/private/pure-ftpd.pem
Me da a saida:
root@server:~# openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout \ /etc/ssl/private/pure-ftpd.pem \ -out /etc/ssl/private/pure-ftpd.pem
Generating a RSA private key
………………………………………………………………………………………………………………………………………………….+++++
………………………………………………………………………..+++++
writing new private key to ‘ /etc/ssl/private/pure-ftpd.pem’
req: Can’t open ” /etc/ssl/private/pure-ftpd.pem” for writing, No such file or directory
Detalhe: Estou utilziando Ubuntu 20.04 Server
Ótimo tutorial como sempre Rudimar
Parabéns e muito obrigado por sempre está ajudando!
Só depois da uma ajustada nos requisitos, que o link está para baixar o debian 10
Ajustado, obrigado.