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

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

7 Resultados

  1. Caio disse:

    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.

  2. Joabe Santos disse:

    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!

  3. Eliézer Macedo disse:

    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.

  4. Eduardo Brito disse:

    como faço pra excluir um usuário criado, ou alterar o diretório associado à um usuário?

  1. 17 de dezembro de 2019

    […] Requisitos ter um servidor FTP 😛 Sugestão: Como criar um servidor FTP (Pure-FTPd) com usuário no banco de dados (MariaDB) usando Debian 10 […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *