Como criar um servidor FTP (Pure-FTPd) com usuário no banco de dados (MariaDB) usando Debian 10
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 10 Stretch / Instalação Limpa
Vire root de maneira correta no Debian 10!
# 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.
Assim, você pode logar diretamente sem fornecer a senha root do MariaDB. Mas isso é estranho, pois minha senha do root do MariaDB é diferente do meu usuário unix.
Bom se você é meio paranoico com segurança, para alterar a senha do usuário root do MariaDB de forma bruta faça o seguinte:
# mariadb -u root
USE mysql; UPDATE user SET password=PASSWORD('SENHA_DB_ROOT') WHERE User='root'; UPDATE user SET plugin="mysql_native_password"; FLUSH PRIVILEGES; quit;
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) ); quit;
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'); quit;
Limpe o histórico do mariadb. Não queremos ninguém vendo o q digitamos lá 😛
# echo > /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 no Debian 10 Buster “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 faz pra acessar? tem que abrir portas? o meu esta dando erro na conexão: Tempo excedido detectado (controlar conexão)
Conexão falhou.
Tutorial show, só fiquei em dúvida na parte de implementar/acessar a interface web, ficou um pouco vago. Teria como explicar mais detalhadamente? Abraços!
Poizé, fiquei com duvidas também
Deu certo. Muito obrigado por compartilhar, seu Rudimar!
Acrescento um detalhe…
Para dummies como eu, observar a liberação das portas ftp (ou a que especificar no servidor ftp) e as portas passivas no firewall.
como faço pra excluir um usuário criado, ou alterar o diretório associado à um usuário?
Diretamente no banco de dados, vc pode usar o phpmyadmin para facilitar sua vida, ou desenvolver algum app web para gerencia. O tutorial explica como colocar o motor.