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: 40.674 ]

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

GINGA - Software Livre para TV Digital Brasileira

Mascarando conexões VPN com iptables

Recurso de Views no Bind

Redes de comunicação sem fio (Wireless)

Acesso SSH com celular (wapsh)

  
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