Servidor FTP · 14 min read · Dec 24, 2025

Servidor FTP com PureFTPd, MariaDB e Usuários Virtuais (incl. Gerenciamento de Quota e Largura de Banda) no CentOS 7.2

Este documento descreve como instalar um servidor PureFTPd que utiliza usuários virtuais de um banco de dados MariaDB (compatível com MySQL) em vez de usuários reais do sistema. Isso é muito mais eficiente e permite ter milhares de usuários FTP em uma única máquina. Além disso, mostrarei o uso de limites de quota e de largura de banda de upload/download com essa configuração. As senhas serão armazenadas criptografadas como strings MD5 no banco de dados.

Para a administração do banco de dados MariaDB, você pode usar ferramentas baseadas na web como o phpMyAdmin, que também será instalado neste tutorial. O phpMyAdmin é uma interface gráfica confortável, o que significa que você não precisa se preocupar com a linha de comando.

Este tutorial é baseado no CentOS 7.2. Você já deve ter configurado um sistema CentOS 7.2 básico e mínimo.

Este guia é destinado a ser um guia prático; não cobre os fundamentos teóricos. Eles são tratados em muitos outros documentos na web.

Este documento vem sem garantia de qualquer tipo! Quero dizer que este não é o único modo de configurar tal sistema. Existem muitas maneiras de alcançar esse objetivo, mas este é o caminho que eu sigo.

1 Nota Preliminar

Neste tutorial, uso o nome do host server1.example.com com o endereço IP 192.168.1.100. Essas configurações podem diferir para você, então você deve substituí-las onde apropriado.

2 Instalar MySQL e phpMyAdmin

Primeiro, habilitamos o repositório EPEL em nosso sistema CentOS, pois alguns pacotes que vamos instalar ao longo deste tutorial não estão disponíveis nos repositórios oficiais do CentOS 7.2:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Em seguida, habilitamos o repositório EPEL em nosso sistema CentOS, pois muitos dos pacotes que vamos instalar ao longo deste tutorial não estão disponíveis no repositório oficial do CentOS 7:

yum -y install epel-release
yum -y install yum-priorities

Edite /etc/yum.repos.d/epel.repo…

nano /etc/yum.repos.d/epel.repo

… e adicione a linha priority=10 à seção [epel]:

[epel]
name=Pacotes Extras para Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Em seguida, atualizamos nossos pacotes existentes no sistema:

yum update

Agora podemos instalar o servidor web Apache, PHP, MariaDB e phpMyAdmin da seguinte forma:

yum -y install mariadb mariadb-server phpmyadmin httpd php

Agora configuramos o phpMyAdmin. Mudamos a configuração do Apache para que o phpMyAdmin permita conexões não apenas de localhost (comentando tudo na seção e adicionando a linha Require all granted):

nano /etc/httpd/conf.d/phpMyAdmin.conf

para que o arquivo fique assim:

# phpMyAdmin - Navegador MySQL baseado na web escrito em php
#
# Permite apenas localhost por padrão
#
# Mas permitir phpMyAdmin a qualquer um além de localhost deve ser considerado
# perigoso, a menos que devidamente protegido por SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

  
    AddDefaultCharset UTF-8
#  
#     # Apache 2.4
#     
#       Require ip 127.0.0.1
#       Require ip ::1
#     
#   
#   
#     # Apache 2.2
#     Order Deny,Allow
#    # Deny from All
#     Allow from 127.0.0.1
     Options Indexes
     AllowOverride None
     Require all granted
#     Allow from ::1
#   




   
     # Apache 2.4
     
       Require ip 127.0.0.1
       Require ip ::1
     
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   


# Esses diretórios não requerem acesso via HTTP - retirado do tarball original do
# phpMyAdmin
#

    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None


# Esta configuração impede que o mod_security nos diretórios do phpMyAdmin
# filtre SQL etc. Isso pode quebrar sua implementação do mod_security.
#
#
#    
#        SecRuleInheritance Off
#    
#

Em seguida, criamos os links de inicialização do sistema para MySQL e Apache (para que ambos iniciem automaticamente sempre que o sistema for inicializado) e iniciamos ambos os serviços.

Abra as portas http e https quando o Firewall do CentOS “firewalld” estiver instalado em seu servidor.

firewall-cmd --permanent --zone=public --add-service=http  
firewall-cmd --permanent --zone=public --add-service=https  
firewall-cmd --reload

Em seguida, inicie o MariaDB e o Apache.

systemctl enable mariadb.service  
systemctl start mariadb.service
systemctl enable httpd.service  
systemctl start httpd.service

Crie uma senha para o usuário root do MySQL (substitua yourmariadbpassword pela senha que você deseja usar):

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: linha 379: find_mysql_client: comando não encontrado

NOTA: EXECUTAR TODAS AS PARTES DESTE SCRIPT É RECOMENDADO PARA TODOS OS SERVIDORES MariaDB EM USO DE PRODUÇÃO! POR FAVOR, LEIA CADA ETAPA CUIDADOSAMENTE!

Para fazer login no MariaDB e protegê-lo, precisaremos da senha atual para o usuário root. Se você acabou de instalar o MariaDB e não definiu a senha root ainda, a senha estará em branco, então você deve apenas pressionar enter aqui. <–ENTER
Digite a senha atual para root (pressione enter para nenhum): <–ENTER
OK, senha usada com sucesso, prosseguindo…

Definir a senha root garante que ninguém possa fazer login no usuário root do MariaDB sem a devida autorização.

Definir senha root? [Y/n] <–ENTER
Nova senha: <–yourmariadbpassword
Reinsira nova senha: <–yourmariadbpassword
Senha atualizada com sucesso!
Recarregando tabelas de privilégios..
… Sucesso!

Por padrão, uma instalação do MariaDB tem um usuário anônimo, permitindo que qualquer um faça login no MariaDB sem precisar ter uma conta de usuário criada para eles. Isso é destinado apenas para testes e para facilitar a instalação. Você deve removê-los antes de entrar em um ambiente de produção.

Remover usuários anônimos? [Y/n] <–ENTER
… Sucesso!

Normalmente, o root deve ser permitido apenas conectar-se de ‘localhost’. Isso garante que alguém não possa adivinhar a senha root pela rede.

Desabilitar login remoto do root? [Y/n] <–ENTER
… Sucesso!

Por padrão, o MariaDB vem com um banco de dados chamado ‘test’ que qualquer um pode acessar. Isso também é destinado apenas para testes e deve ser removido antes de entrar em um ambiente de produção.

Remover banco de dados de teste e acesso a ele? [Y/n] <–ENTER

  • Removendo banco de dados de teste…
    … Sucesso!
  • Removendo privilégios no banco de dados de teste…
    … Sucesso!

Recarregar as tabelas de privilégios garantirá que todas as alterações feitas até agora tenham efeito imediato.

Recarregar tabelas de privilégios agora? [Y/n] <–ENTER
… Sucesso!

Limpando…

Tudo pronto! Se você completou todas as etapas acima, sua instalação do MariaDB deve agora estar segura.

Obrigado por usar o MariaDB!
[root@server1 ~]#

3 Instalar PureFTPd com Suporte a MySQL / MariaDB

O pacote PureFTPd do CentOS suporta vários backends, como MySQL, PostgreSQL, LDAP, etc. Portanto, tudo o que precisamos fazer é instalar o pacote normal do PureFTPd:

yum -y install pure-ftpd

Em seguida, criamos um grupo ftp (ftpgroup) e um usuário (ftpuser) ao qual todos os nossos usuários virtuais serão mapeados. Substitua o grupo e o ID do usuário 2001 por um número que esteja livre em seu sistema:

groupadd -g 2001 ftpgroup  
useradd -u 2001 -s /bin/false -d /bin/null -c "usuário pureftpd" -g ftpgroup ftpuser

O serviço ftp deve ser permitido pelo firewall-cmd da seguinte forma:

firewall-cmd --permanent --zone=public --add-service=ftp  
firewall-cmd --reload

4 Criar o Banco de Dados para PureFTPd

Agora criamos um banco de dados chamado pureftpd e um usuário MariaDB chamado pureftpd que o daemon PureFTPd usará mais tarde para se conectar ao banco de dados pureftpd:

mysql -u root -p
CREATE DATABASE pureftpd;  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';  
FLUSH PRIVILEGES;

Substitua a string ftpdpass pela senha que você deseja usar para o usuário MySQL pureftpd. Ainda no shell do MySQL, criamos a tabela do banco de dados que precisamos (sim, há apenas uma 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)  
) ENGINE=MyISAM;
quit;

Como você pode ter notado, com o comando quit; saímos do shell do MySQL e estamos de volta ao shell do Linux.

A propósito, (estou assumindo que o nome do host do seu sistema de servidor FTP é server1.example.com) você pode acessar o phpMyAdmin em http://server1.example.com/phpMyAdmin/ (você também pode usar o endereço IP em vez de server1.example.com) em um navegador e fazer login como o usuário pureftpd. Então você pode dar uma olhada no banco de dados. Mais tarde, você pode usar o phpMyAdmin para administrar seu servidor PureFTPd.

5 Configurar PureFTPd

Edite /etc/pure-ftpd/pure-ftpd.conf e certifique-se de que as linhas ChrootEveryone, MySQLConfigFile e CreateHomeDir estejam habilitadas e pareçam assim:

nano /etc/pure-ftpd/pure-ftpd.conf
[...]
ChrootEveryone              yes
[...]
MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf
[...]
CreateHomeDir               yes
[...]

A configuração ChrootEveryone fará com que o PureFTPd chroot cada usuário virtual em seu diretório home, para que ele não possa navegar em diretórios e arquivos fora de seu diretório home. A linha CreateHomeDir fará com que o PureFTPd crie o diretório home de um usuário quando o usuário fizer login e o diretório home ainda não existir.

Em seguida, editamos /etc/pure-ftpd/pureftpd-mysql.conf. Ele deve parecer assim:

cp /etc/pure-ftpd/pureftpd-mysql.conf /etc/pure-ftpd/pureftpd-mysql.conf_orig  
cat /dev/null > /etc/pure-ftpd/pureftpd-mysql.conf  
nano /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/lib/mysql/mysql.sock
#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLUser       pureftpd
MYSQLPassword   ftpdpass
MYSQLDatabase   pureftpd
#MYSQLCrypt md5, cleartext, crypt() ou password() - md5 é MUITO RECOMENDÁVEL em relação ao cleartext
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")

Certifique-se de substituir a string ftpdpass pela senha real para o usuário MySQL pureftpd na linha MYSQLPassword! Observe que usamos md5 como método MYSQLCrypt, o que significa que armazenaremos as senhas dos usuários como uma string MD5 no banco de dados, o que é muito mais seguro do que usar senhas em texto simples!

Agora criamos os links de inicialização do sistema para o PureFTPd e o iniciamos:

systemctl enable pure-ftpd.service  
systemctl start pure-ftpd.service

6 Preencher o Banco de Dados e testar o Servidor

Para preencher o banco de dados, você pode usar o shell do MySQL:

mysql -u root -p
USE pureftpd;

Agora criamos o usuário exampleuser com o status 1 (o que significa que sua conta ftp está ativa), a senha secret (que será armazenada criptografada usando a função MD5 do MySQL), o UID e GID 2001 (use o ID do usuário e o ID do grupo que você criou no final da etapa dois!), o diretório home /home/www.example.com, uma largura de banda de upload e download de 100 KB/sec. (kilobytes por segundo) e uma quota de 50 MB:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;

Agora abra seu programa cliente FTP em sua estação de trabalho (algo como FileZilla se você estiver em um sistema Windows ou gFTP em um desktop Linux) e tente se conectar. Como nome do host, use server1.example.com (ou o endereço IP do sistema), o nome de usuário é exampleuser e a senha é secret.

Conectar ao servidor FTP com FileZilla.

Se você conseguir se conectar - parabéns! Se não, algo deu errado.

Agora, se você executar

ls -l /home

você deve ver que o diretório /home/www.example.com (diretório home do exampleuser) foi criado automaticamente e é de propriedade de ftpuser e ftpgroup (o usuário/grupo que criamos no final da etapa dois):

[root@server1 ~]# ls -l /home  
total 0  
drwx------. 2 administrator administrator 59 Jun 21 16:13 administrator  
drwxr-xr-x. 2 ftpuser ftpgroup 22 Jul 4 18:30 www.example.com  
[root@server1 ~]#

7 Administração do Banco de Dados

Para a maioria das pessoas, é mais fácil ter uma interface gráfica para o MySQL; portanto, você também pode usar o phpMyAdmin (neste exemplo em http://server1.example.com/phpMyAdmin/) para administrar o banco de dados pureftpd.

O Painel do PHPMyAdmin

O banco de dados MySQL do pure-ftpd

Sempre que você quiser criar um novo usuário, você deve criar uma entrada na tabela ftpd, então explicarei as colunas desta tabela aqui:

Tabela FTPD:

  • User: O nome do usuário virtual do PureFTPd (por exemplo, exampleuser).
  • status: 0 ou 1. 0 significa que a conta está desativada, o usuário não pode fazer login.
  • Password: A senha do usuário virtual. Certifique-se de usar a função MD5 do MySQL para salvar a senha criptografada como uma string MD5:
    Adicionar um usuário FTP.
  • UID: O ID do usuário do ftp que você criou no final da etapa dois (por exemplo, 2001).
  • GID: O ID do grupo do ftp que você criou no final da etapa dois (por exemplo, 2001).
  • Dir: O diretório home do usuário virtual do PureFTPd (por exemplo, /home/www.example.com). Se não existir, será criado quando o novo usuário fizer login pela primeira vez via FTP. O usuário virtual será preso a este diretório home, ou seja, ele não pode acessar outros diretórios fora de seu diretório home.
  • ULBandwidth: Largura de banda de upload do usuário virtual em KB/sec. (kilobytes por segundo). 0 significa ilimitado.
  • DLBandwidth: Largura de banda de download do usuário virtual em KB/sec. (kilobytes por segundo). 0 significa ilimitado.
  • comment: Você pode inserir qualquer comentário aqui (por exemplo, para sua administração interna) aqui. Normalmente, você deixa este campo vazio.
  • ipaccess: Insira endereços IP aqui que são permitidos a se conectar a esta conta FTP. * significa que qualquer endereço IP é permitido se conectar.
  • QuotaSize: Espaço de armazenamento em MB (não KB, como em ULBandwidth e DLBandwidth!) que o usuário virtual é permitido usar no servidor FTP. 0 significa ilimitado.
  • QuotaFiles: quantidade de arquivos que o usuário virtual é permitido salvar no servidor FTP. 0 significa ilimitado.

8 FTP Anônimo

Se você quiser criar uma conta ftp anônima (uma conta ftp que todos podem fazer login sem uma senha), você precisa de um usuário e um grupo chamados ftp. Ambos foram criados automaticamente quando você instalou o pacote pure-ftpd, então você não precisa criá-los manualmente. No entanto, o diretório home do ftp é /var/ftp por padrão, mas eu gostaria de criar o diretório ftp anônimo em /home/ftp (os diretórios ftp dos usuários normais também estão em /home, por exemplo, /home/www.example.com). Mas, claro, você pode usar o diretório /var/ftp para ftp anônimo, se preferir.

Se você quiser usar /home/ftp, abra /etc/passwd e mude o diretório home do usuário ftp de /var/ftp para /home/ftp (não faça isso se você quiser usar /var/ftp):

nano /etc/passwd
[...]
#ftp:x:14:50:Usuário FTP:/var/ftp:/sbin/nologin
ftp:x:14:50:Usuário FTP:/home/ftp:/sbin/nologin
[...]

Em seguida, mova /var/ftp para /home (não faça isso se você quiser usar /var/ftp):

mv /var/ftp /home

Em seguida, criamos o diretório /home/ftp/incoming que permitirá que usuários anônimos enviem arquivos. Daremos ao diretório /home/ftp/incoming permissões de 311 para que os usuários possam enviar, mas não ver ou baixar nenhum arquivo nesse diretório. O diretório /home/ftp terá permissões de 555, o que permite ver e baixar arquivos:

chown ftp:nobody /home/ftp  
cd /home/ftp  
mkdir incoming  
chown ftp:nobody incoming/  
chmod 311 incoming/  
cd ../  
chmod 555 ftp/

(Se você quiser usar /var/ftp em vez disso, substitua /home/ftp por /var/ftp nos comandos acima.)

Usuários anônimos poderão fazer login e serão permitidos a baixar arquivos de /home/ftp, mas os uploads serão limitados a /home/ftp/incoming (e uma vez que um arquivo é enviado para /home/ftp/incoming, ele não pode ser lido nem baixado de lá; o administrador do servidor deve movê-lo para /home/ftp primeiro para torná-lo disponível para outros).

Agora precisamos configurar o PureFTPd para ftp anônimo. Abra /etc/pure-ftpd/pure-ftpd.conf e certifique-se de que você tenha as seguintes configurações nele:

nano /etc/pure-ftpd/pure-ftpd.conf
[...]
NoAnonymous                 no
[...]
AntiWarez                   no
[...]
AnonymousBandwidth            8
[...]
AnonymousCantUpload         no
[...]

(A configuração AnonymousBandwidth é opcional - permite que você limite as larguras de banda de upload e download para usuários anônimos. 8 significa 8 KB/sec. Use qualquer valor que você desejar ou comente a linha se não quiser limitar as larguras de banda.)

Finalmente, reiniciamos o PureFTPd:

systemctl restart pure-ftpd.service

9 Baixar este servidor CentOS 7.2 como máquina virtual

Esta configuração está disponível como download de máquina virtual em formato ova/ovf (compatível com VMWare e Virtualbox) para assinantes do howtoforge.

Detalhes de login para a VM

  • A senha root é: howtoforge
  • A senha do usuário “administrator” é: howtoforge

Por favor, mude ambas as senhas no primeiro login.

  • O endereço IP da VM é 192.168.1.100

10 Links

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.