Servidor FTP · 7 min read · Jan 31, 2026
Hospedagem Virtual Com Proftpd E MySQL (Incl. Quota) No Ubuntu 14.04LTS
Este documento descreve como instalar um servidor Proftpd que utiliza usuários virtuais de um banco de dados 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 quotas com essa configuração. Este tutorial é baseado no Ubuntu 14.04LTS.
Para a administração do banco de dados MySQL, você pode usar ferramentas baseadas na web como o phpMyAdmin, que também será instalado neste guia. O phpMyAdmin é uma interface gráfica confortável, o que significa que você não precisa mexer com a linha de comando.
Este guia é destinado a ser um manual 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. Não dou nenhuma garantia de que isso funcionará para você!
1 Nota Preliminar
Neste tutorial, uso o nome do host server1.example.com com o endereço IP 192.168.0.100. Essas configurações podem diferir para você, então você deve substituí-las onde apropriado.
Certifique-se de que você está logado como root:
sudo su
1.1 Mudar O Shell Padrão
/bin/sh é um symlink para /bin/dash, no entanto, precisamos de /bin/bash, não /bin/dash. Portanto, fazemos isso:
dpkg-reconfigure dash
Instalar dash como /bin/sh? <– Não
1.2 Desabilitar AppArmor
AppArmor é uma extensão de segurança (semelhante ao SELinux) que deve fornecer segurança estendida. Na minha opinião, você não precisa dele para configurar um sistema seguro, e geralmente causa mais problemas do que vantagens (pense nisso depois de ter feito uma semana de resolução de problemas porque algum serviço não estava funcionando como esperado, e então você descobre que tudo estava ok, apenas o AppArmor estava causando o problema). Portanto, eu o desabilito.
Podemos desabilitá-lo assim:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Instalar MySQL E phpMyAdmin
Tudo isso pode ser instalado com um único comando:
apt-get install mysql-server mysql-client phpmyadmin apache2
Você será solicitado a fornecer uma senha para o usuário root do MySQL - essa senha é válida para o usuário root@localhost, bem como [email protected], então não precisamos especificar uma senha root do MySQL manualmente mais tarde:
Nova senha para o usuário “root” do MySQL: <– sua senha root sql
Repita a senha para o usuário “root” do MySQL: <– sua senha root sql
Além disso, você verá as seguintes perguntas:
Servidor web para reconfigurar automaticamente: <– apache2
Configurar banco de dados para phpmyadmin com dbconfig-common? <– Não
3 Instalar Proftpd Com Suporte A MySQL
Para o Ubuntu, há um pacote proftpd-mod-mysql pré-configurado disponível. Instale-o como um daemon autônomo assim:
apt-get install proftpd-mod-mysql
Você será solicitado a seguinte pergunta:
Executar proftpd: <– autônomo
Então, 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 proftpd” -g ftpgroup ftpuser
4 Criar O Banco De Dados MySQL Para Proftpd
Agora criamos um banco de dados chamado ftp e um usuário MySQL chamado proftpd que o daemon proftpd usará mais tarde para se conectar ao banco de dados ftp:
mysql -u root -p
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp. TO ‘proftpd’@’localhost’ IDENTIFIED BY ‘senha’;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp. TO ‘proftpd’@’localhost.localdomain’ IDENTIFIED BY ‘senha’;
FLUSH PRIVILEGES;
Substitua a string senha por qualquer senha que você queira usar para o usuário MySQL proftpd. Ainda no shell do MySQL, criamos as tabelas do banco de dados que precisamos:
USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default ‘’,
gid smallint(6) NOT NULL default ‘5500’,
members varchar(16) NOT NULL default ‘’,
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT=’Tabela de grupo ProFTP’;
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum(‘user’,’group’,’class’,’all’) NOT NULL default ‘user’,
per_session enum(‘false’,’true’) NOT NULL default ‘false’,
limit_type enum(‘soft’,’hard’) NOT NULL default ‘soft’,
bytes_in_avail bigint(20) unsigned NOT NULL default ‘0’,
bytes_out_avail bigint(20) unsigned NOT NULL default ‘0’,
bytes_xfer_avail bigint(20) unsigned NOT NULL default ‘0’,
files_in_avail int(10) unsigned NOT NULL default ‘0’,
files_out_avail int(10) unsigned NOT NULL default ‘0’,
files_xfer_avail int(10) unsigned NOT NULL default ‘0’
) ENGINE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default ‘’,
quota_type enum(‘user’,’group’,’class’,’all’) NOT NULL default ‘user’,
bytes_in_used bigint(20) unsigned NOT NULL default ‘0’,
bytes_out_used bigint(20) unsigned NOT NULL default ‘0’,
bytes_xfer_used bigint(20) unsigned NOT NULL default ‘0’,
files_in_used int(10) unsigned NOT NULL default ‘0’,
files_out_used int(10) unsigned NOT NULL default ‘0’,
files_xfer_used int(10) unsigned NOT NULL default ‘0’
) ENGINE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default ‘’,
passwd varchar(32) NOT NULL default ‘’,
uid smallint(6) NOT NULL default ‘5500’,
gid smallint(6) NOT NULL default ‘5500’,
homedir varchar(255) NOT NULL default ‘’,
shell varchar(16) NOT NULL default ‘/sbin/nologin’,
count int(11) NOT NULL default ‘0’,
accessed datetime NOT NULL default ‘0000-00-00 00:00:00’,
modified datetime NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT=’Tabela de usuário ProFTP’;
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ê pode usar o endereço IP em vez de server1.example.com) em um navegador e fazer login como proftpd. Então você pode dar uma olhada no banco de dados. Mais tarde, você pode usar o phpMyAdmin para gerenciar seu servidor Proftpd.
5 Configurar Proftpd
Abra /etc/proftpd/modules.conf…
vi /etc/proftpd/modules.conf
… e habilite os seguintes três módulos:
| [...] # Instale um dos proftpd-mod-mysql, proftpd-mod-pgsql ou qualquer outro # mecanismo de backend SQL para usar este módulo e o backend necessário. # Este módulo deve ser carregado obrigatoriamente antes de qualquer um dos # backends SQL existentes. LoadModule mod_sql.c [...] # Instale proftpd-mod-mysql e descomente o anterior # módulo mod_sql.c para usar isso. LoadModule mod_sql_mysql.c [...] # Instale um dos backends SQL anteriores e descomente # o módulo mod_sql.c anterior para usar isso LoadModule mod_quotatab_sql.c [...] |
Então abra /etc/proftpd/proftpd.conf e comente as seguintes linhas:
vi /etc/proftpd/proftpd.conf
| [...] # |
Mais abaixo no arquivo, adicione as seguintes linhas:
| [...] # # Estruturas de autenticação alternativas # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # As senhas no MySQL são criptografadas usando CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # usado para conectar ao banco de dados # nome_do_banco@host usuario_do_banco senha_do_usuario SQLConnectInfo ftp@localhost proftpd senha # Aqui dizemos ao ProFTPd os nomes das colunas do banco de dados na "usertable" # com as quais queremos interagir. Combine os nomes com os do db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Aqui dizemos ao ProFTPd os nomes das colunas do banco de dados na "grouptable" # com as quais queremos interagir. Novamente os nomes combinam com os do db SQLGroupInfo ftpgroup groupname gid members # defina UID e GID mínimos - caso contrário, estes são 999 cada SQLMinID 500 # crie o diretório home de um usuário sob demanda se não existir CreateHome on # Atualize a contagem toda vez que o usuário fizer login SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Atualize modificado toda vez que o usuário fizer upload ou excluir um arquivo SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Quotas de usuário # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...] |
Certifique-se de que você substituiu a string senha pela senha real do usuário MySQL proftpd na linha SQLConnectInfo!
Então reinicie o Proftpd:
/etc/init.d/proftpd restart
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.