Pure-ftpd: Servidor de FTP com MySQL, quota e usuários virtuais

Este artigo demonstra de forma didática, como ter um servidor de FTP no Linux robusto e confiável, integrado com MySQL.

[ Hits: 41.218 ]

Por: Emerson Araujo em 12/11/2008


Configuração do pure-ftpd



Agora vem a parte divertida, afinal não tem graça instalar software no Linux! É mais fácil do que no "outro", o divertido é a configuração.

Se você chegou até aqui sem problemas, o pure-ftpd foi instalado na pasta /etc/pure-ftpd, e é la que vamos encontrar os arquivos de configuração. O primeiro passo será configurar a conexão com o banco de dados, nesse arquivo será configurado também as queries para autenticação do usuário via MySQL, o arquivo de configuração responsável por isso é o /etc/pure-ftpd/db/mysql.conf, pra facilitar vou colar meu arquivo comentado.

###ARQUIVO DE CONFIGURAÇÃO MYSQL PURE-FTPD###

MYSQLSocket      /var/run/mysqld/mysqld.sock
# como já defini o caminho do socket mysql, não preciso definir o servidor
# nem a porta abaixo, por isso estão comentados, mas se seu servidor mysql
# estiver em outra máquina você pode comentar a primeira linha e descomentar
# as duas a seguir e configurar o endereço e a porta do seu servidor mysql

#MYSQLServer     localhost
#MYSQLPort       3306

# define usuário para acesso ao banco (será criado um banco de dados mais adiante)

MYSQLUser       pureftpd

# define senha para acesso ao banco (será criado um banco de dados mais adiante)
MYSQLPassword   senha

# seleciona o banco de dados, no nosso caso o pureftpd (será criado um banco de dados mais adiante)
MYSQLDatabase   pureftpd

# define a criptografia utilizada para gravar as senhas de usuários,
# os tipos suportados são md5, cleartext, crypt() ou password()
MYSQLCrypt      md5

# observe nas queries abaixo que sempre há a checagem do campo status, ou seja,
# o usuário estará bloqueado se o valor desse campo for diferente de 1, e no caso
# do ipaddress pode-se definir um ip que terá a permissão de acesso, no meu caso
# uso "*", que permite acesso de qualquer ip

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")

Agora vamos evitar que o usuário saia do seu diretório definido no MySQL, para isso execute o comando:

# echo yes >> /etc/pure-ftpd/conf/ChrootEveryone

Agora é hora de criar o banco de dados, execute os seguintes comandos:

# mysql -u root -psenha mysql> CREATE DATABASE pureftpd;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'senha';
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'senha';
mysql> USE pureftpd;
mysql> 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)
) TYPE=MyISAM;

mysql>\q

Pronto, temos o banco de dados chamado pureftpd e dentro dele a tabela ftpd, vamos reiniciar o servidor FTP para que ele recarregue os arquivos de configuração:

# /etc/init.d/pure-ftpd-mysql restart

Nesse ponto você deve estar pensando... "tudo pronto, só adicionar o usuários e ser feliz", errado! Me dei mal justamente por pensar assim rsrsrs, como todos sabemos, o Linux, ao contrário do "outro", leva bastante a sério as permissões de arquivos e pastas, então temos que tomar cuidado com isso. Como estamos trabalhando com usuários virtuais, temos que "aproveitar" as permissões de usuários reais, por exemplo:

O usuário "jose", real (cadastrado no sistema), tem permissão completa no diretório /home/jose, ele quer disponibilizar o conteúdo da pasta /home/jose/compartilhamento para o um amigo dele chamado "joao", ele não precisa cadastrar o joao como usuário do sistema, basta cadastrar no banco de dados da seguinte forma:

# mysql -u root -psenha
mysql> USE pureftpd;
mysql> INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('joao', '1', MD5('senhadojoao'), '500', '500', '/home/jose/compartilhamento', '100', '100', '', '*', '50', '0');

Observe acima os números "500", "500", pra quem acompanhou a sequência do insert vai observar que esses valores são o Uid e Gid, respectivamente. Eles tem que ser os mesmos do usuário real jose, porém como foi definido no arquivo ChrootEveryone a opção yes, o usuário virtual joao vai ficar preso ao diretório /home/jose/compartilhamento, mas com as mesmas permissões do jose.

Vamos a uma aplicação real: no meu caso tenho um diretório /sites onde o usuário e grupo donos são respectivamente o www-data:www-data (33:33 - esses números podem ser conferidos no arquivo /etc/passwd). Tenho vários diretórios que hospedam sites diferentes, daí eu cadastro da seguinte forma:

# mysql -u root -psenha
mysql> USE pureftpd;
mysql> INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('belarmino', '1', MD5('senha'), '33', '33', '/sites/site-belarmino', '100', '100', '', '*', '50', '0');

mysql> INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('joaquino', '1', MD5('senha'), '33', '33', '/sites/site-joaquino', '100', '100', '', '*', '50', '0');

Só uma observação: no arquivo /etc/pure-ftpd/conf/MinUID por padrão vem o valor 1000, ou seja, qualquer UID abaixo disso será recusado e você não conseguirá logar. Para corrigir no meu caso eu configurei para 32 (pois estou usando 33) e funcionou normalmente (lembre-se que depois de configurar esse valor tem que reiniciar o pure-ftpd - /etc/init.d/pure-ftpd-mysql restart).

Agora vem os outros valores:
  • ULBandwidth: velocidade de upload, no caso acima esta em 100kbps;
  • DLBandwidth: velocidade de download, no caso acima esta em 100kbps;
  • comment: comentário;
  • ipaccess: ip da máquina que poderá obter acesso ao ftp, no caso acima foi usado o *, que permite qualquer ip;
  • QuotaSize: cota do usuário, no caso acima está em 50mb;
  • QuotaFiles: quantidade de arquivos, no meu caso está ilimitado (0).

Pronto, agora é só testar com algum cliente de FTP, entre com usuário e senha cadastrados no banco de dados e veja se deu tudo certo.

Conclusão

Configuramos então o pure-ftpd com usuários virtuais e MySQL, agora é só deixar a imaginação fluir, pode-se facilmente integrar isso com software de gestão para que sejam criados contas ftp automaticamente por exemplo, sem a necessidade da configuração manual.

Espero ter ajudado e até o próximo artigo.

Página anterior    

Páginas do artigo
   1. Preparando o ambiente
   2. Configuração do pure-ftpd
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Usando 3G da Vivo no Slackware 13.1

Qualidade de Serviços para Gateways Linux (QoS)

Conectividade Social vs. proxy Squid transparente

Modem USB 3G largado na gaveta! Nãããõooo...

Autenticando Documento com Blockchain e Ethereum

  
Comentários
[1] Comentário enviado por alexandre.nas em 14/11/2008 - 00:51h

Gostaria de saber se esse FTP permite a geração de logs de FTP para cada usuário. Por exemplo: O usuário teste publica seus arquivos e será gerado um arquivo em /var/log/pure-ftpd/teste.log.

Obrigado!

[2] Comentário enviado por araujoprog em 17/11/2008 - 22:10h

Amigo ele gera os logs em arquivo unico, mas detalhado por usuários.

[3] Comentário enviado por dramos em 10/04/2009 - 22:24h

Olá, primeiramente obrigado pelo tutorial, está muito bem explicado, o que é ótimo para mim que sou inciante em linux. vamos lá..... Fiz tudo exatamente como a explicação, não deu erro nenhum, mas nao ta funfando.... nem encontra o host, estou tentando conectar de outro micro pela rede local mesmo (192.168.1.XXX), será que tem que liberar algo a mais?

[4] Comentário enviado por killer_val em 30/01/2010 - 13:54h

ola belo tuto deu tudo certinho
agora como que faz para add mais usuarios tem algum script ou software

[5] Comentário enviado por calangoloco em 24/01/2013 - 09:14h

Testado e aprovado no Debian 6

[6] Comentário enviado por Carlos_Cunha em 15/07/2013 - 18:04h

Quem tiver com problemas na hora da criação da DATABASE na ultima linha no tipo de BASE ") TYPE=MyISAM;", isso pode ser(pelo menos comigo) pq nas versões mais novas do Msyql(usando 5.5) para determinar um tipo da DB de usa dessa forma ") ENGINE=MyISAM;" , ajustando isso funcionou.

Obrigado pelo HOW TO :-D

Usado em Debian 7 64Bits

[7] Comentário enviado por allanbarcelos em 20/03/2014 - 02:07h

existe uma forma de fazer um update ou um insert existe algum comando no pure-ftpd ?

[8] Comentário enviado por removido em 06/03/2022 - 19:18h


estamos no ano de 2022 e mysql apresenta o seguinte erro de version:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'senha';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'senha' at line 1

alguem sabe porque?

[9] Comentário enviado por allanbarcelos em 06/03/2022 - 19:49h

Tenta assim:

GRANT ALL PRIVILEGES ON 'pureftpd'.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'senha';

So vim responder porque você ressuscitou um tópico com 14 anos :)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts