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.