Publico mais um bom artigo que atinge um bom nível de usuários, sempre tendo a necessidade de construir um servidor FTP para empresa, e seus clientes. Conta com a instalação de um utilitário web para administração deste servidor web, tanto para o banco de dados, quanto para os usuários de FTP.
Este documento descreve como fazer para instalar um servidor PureFTPd que usa usuários virtuais de um banco de dados MySQL ao invés de usuários reais do sistema. Isto é muito mais flexível e permite ter milhares de usuários FTP no mesmo servidor. Além disso, mostrarei o uso de quota e limites de upload/download com esta instalação. As senhas serão armazenadas e encriptadas como MD5 no banco de dados.
Este artigo foi originalmente escrito para utilização em um servidor Debian, portanto, adaptei o mesmo de linguagem simples para utilização no FreeBSD.
Para a administração do banco de dados MySQL você pode usar algumas ferramentas baseadas na web como phpMyAdmin, no qual será também instalado neste artigo. phpMyAdmin é uma interface gráfica confortável no qual substitue a necessidade de uso das linhas de comandos.
Este tutorial é baseado em FreeBSD 6.2-STABLE. Este artigo é um guia prática, não cobrindo os fundos teóricos. Este artigo aborda apenas uma das possibilidades de se montar este ambiente, visto que será a mais simples possível.
1 Nota preliminar
Neste tutorial eu uso o hostname servidor.exemplo.com.br com o endereço IP 192.168.0.100. Estas configurações são modificadas por você, então você tem que mudar para o apropriado.
2 Instalar MySQL e phpMyAdmin
Isto pode ser instalado facilmente pelo ports:
# cd /usr/ports/databases/mysql51-server ; make install clean # rehash && echo 'mysql_enable="YES" >> /etc/rc.conf # /usr/local/etc/rc.d/mysql-server start
Definindo a senha de root do MySQL
# mysqladmin -u root password SUA_SENHA
Vamos preparar o ambiente para instalação do phpMyAdmin, ou seja, instalaremos agora o Apache + PHP.
# cd /usr/ports/www/apache20 ; make install clean # cd /usr/ports/lang/php5 ; make install clean (Marque a opção APACHE, e desmarque a opção IPV6)
Adicione as seguintes linhas no seu /usr/local/etc/apache2/httpd.conf
AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
E configure a diretiva DirectoryIndex, adicionando index.php ao final da linha.
Lembre-se de configurar as diretivas ServerName e Listen para seu servidor.
# echo 'apache2_enable="YES"' >> /etc/rc.conf # /usr/local/etc/rc.d/apache2.sh start
Finalmente instalando o phpMyAdmin.
# cd /usr/ports/databases/phpmyadmin ; make install clean (Não precisa marcar/desmarcar quaisquer opções)
Verifique se os dois subiram com o seguinte comando:
# sockstat -4l | grep -e httpd -e mysql
3 Instalar PureFTPd com suporte MySQL
# cd /usr/ports/ftp/pure-ftpd # make config (Selecione MySQL e deixe as demais) # make install clean # echo 'pureftpd_enable="YES"' >> /etc/rc.conf
Então nós criamos um grupo FTP (grupoftp) e usuário (usuarioftp) que será onde todos nossos usuários virtuais serão mapeados.
# pw groupadd grupoftp -g 1002 # pw useradd -n usuarioftp -c "Usuarios FTP" -d /dev/null -g grupoftp -s /sbin/nologin
4 Criar a database MySQL para o Pure-FTPd
Agora nós criamos uma database chamado pureftpd e um usuário MySQL chamado pureftpd no qual o Pure-FTPd usará depois para conectar em sua database:
# mysql -u root -p
mysql> CREATE DATABASE pureftpd; mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pftp'@'localhost' IDENTIFIED BY 'pftpsenha'; mysql> FLUSH PRIVILEGES;
Modifique 'senha' para a senha desejada para estes usuários, no qual deverá ser configurado posteriormente no Pure-FTPd.
mysql> USE pureftpd; mysql> CREATE TABLE users ( 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> quit;
(Estou assumindo que o hostname de seu servidor ftp seja servidor.exemplo.com.br) você pode acessar phpMyAdmin sob http://servidor.exemplo.com.br/phpmyadmin/ (você pode também usar o endereço IP ao invés do hostname) em um navegador e logar como usuário pureftpd. Então você pode visualizar a database. Depois você pode usar o phpMyAdmin para administrar seu servidor Pure-FTPd.
5 Configurando PureFTPd
# cp /usr/local/etc/pureftpd-mysql.conf.sample /usr/local/etc/pureftpd-mysql.conf # ee /usr/local/etc/pureftpd-mysql.conf
Socket /var/run/mysqld/mysqld.sock MYSQLServer localhost MYSQLPort 3306 MYSQLUser pftp MYSQLPassword pftpsenha MYSQLDatabase pureftpd 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")
Esteja certo que você mudou o campo 'senha' com a senha real do MySQL do seu usuário pureftpd na linha MYSQLPassword! Por favor note que nós usamos md5 como método em MYSQLCrypt, no qual nós iremos armazenar as senhas de usuários como uma string MD5 na database obtendo mais segurança do que usar senhas em textos simples.
MaxClientsNumber - Número de clientes simultaneos; MaxClientsPerIP - Número máximo de clientes por IP; VerboseLog - Ligar o modo debug para os comandos de FTP dos usuários; MaxIdleTime - Tempo máximo de IDLE que o usuário terá antes de ser desconectado; MySQLConfigFile - Define o arquivo de configuração do MySQL; LimitRecursion files sub-dirs - Aqui será definido quantos arquivos e sub-diretórios poderá ser mostrado para os clientes (ex: LimitRecursion 2000 8 - serão mostrados 2000 arquivos e até 8 sub-diretórios) ChrootEveryone - Enjaular por padrão os usuários FTP; CreateHomeDir - Criar o home do usuário automaticamente;
6 Populando o banco de dados e testando
Para popular a database você pode usar a shell MySQL:
# mysql -u root -p
mysql> USE pureftpd;
Agora nós criamos o usuário usuariofug com o Status 1 (no qual define-o como uma conta ftp ativa), a senha secreta (na qual será armazenada e encriptada usando função MD5 do MySQL), o UID e GID 2001 (use o userid e groupid do usuário/grupo que você criou no fim do passo 2), o diretório home /home/www.exemplo.com.br, um controle de upload e download de 100KB/sec, e uma quota de 50 MB:
mysql> INSERT INTO `users` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('usuariofug', '1', MD5('senhasecreta'), '2001', '2001', '/home/www.dominio.com.br', '100', '100', '', '*', '50', '0'); mysql> quit;
Agora abra seu programa cliente de FTP sob sua área de trabalho (algo como WS_FTP ou SmartFTP se você está sob um sistema Windows ou gFTP sob um Desktop Linux) e tente conectar-se. Como hostname você usa servidor.dominio.com.br (ou endereço IP do servidor), o username será usuariofug, e a senha é senhasecreta.
Agora se você rodar:
# ls -l /home
você poderá ver que o diretório /home/www.dominio.com.br (diretório home do usuariofug) foi criado automaticamente, e está agregado por usuarioftp e grupoftp (o usuario/grupo que nós criamos no fim do passo 2) como donos.
servidor:# ls -l /home total 8 drwxr-xr-x 2 administrator adminisdrator 4096 2007-04-23 14:25 administrador drwxr-xr-x 2 ftpuser ftpgroup 4096 2007-04-23 17:26 www.dominio.com.br
7 Administração do Banco de dados
Para muitas pessoas isto se torna fácil, caso eles tenham um front-end para o MySQL; neste caso você pode usar o phpMyAdmin (neste exemplo sob http://servidor.dominio.com.br/phpmyadmin/) para administrar o banco de dados do pureftpd.
Sempre que você queira criar um novo uusário, você tem que criar uma entrada na tabela ftpd, assim como irei explicar os campos da tabela abaixo:
User: Seu_Usuario_Aqui (ex. usuariofug). Status: 0 ou 1. 0 menciona que esta conta está inativa, portanto, o usuário não pode logar. Password: A senha do usuário virtual. Confira se você está utilizando a função MD5 do MySQL para salvar a senha encriptada como uma string MD5. UID: O userid do usuário ftp que você criou no fim do passo 2 (ex: 2001) GID: O groupid do grupo ftp que você criou no fim do passo 2 (ex: 2001). Dir: Diretório home do usuário virtual do PureFTPd (ex: /home/www.dominio.com.br). Se isto não existe, isso será criado quando o novo usuário logar pela primeira vez via FTP. O usuário virtual será enjaulado dentro de seu diretório home, ou seja, ele não poderá acessar outros diretórios fora deste diretório. ULBandwidth: Controle de Upload do usuário virtual em KB/Sec, ou seja, Kilobytes por segundo. Use 0 para que seja ilimitado. DLBandwidth: Controle de Download do usuário virtual em KB/sec, ou seja, kilobytes por segundo. Use 0 para que seja ilimitado. Comment: Você pode inserir qualquer comentário aqui (ex: para sua administração interna). Normalmente você deixa este campo limpo. Ipaccess: Insira os endereços IPs aqui que serão permitidos para conectar nesta conta FTP. '*' define qualquer endereço IP permitido para conectar. QuotaSize: Espaço de armazenamento em MB (não KB, como em ULBandwidth eDLBandwidth) o usuário virtual é permitido para uso sob este servidor FTP. Defina 0 como ilimitado. QuotaFiles: Define número total de arquivos que este usuário virtual poderá salvar no servidor FTP. Defina 0 para ilimitado.
8 FTP Anônimo
Se você quer criar um usuário anônimo de ftp (uma conta que qualquer pessoa poderá logar-se sem uma senha), você pode usar algo como isto:
Primeiro cria um usuário ftp (com o homedir /home/ftp) e grupo ftp:
# pw groupadd ftp # pw useradd -s /bin/false -d /home/ftp -m -c "anonymous ftp" -g ftp ftp
Obs:: por padrão o pureftpd no FreeBSD já vem com usuário anônimo permitido, na diretiva: NoAnonymous, modifique para YES para NÃO aceitar logins anônimos.
Reinicie PureFTPd:
# /usr/local/etc/rc.d/pure-ftpd restart
Então nós criamos o diretório /home/ftp/incoming no qual irá permitir usuário anônimos para enviar arquivos. Nós iremos ter o diretório /home/ftp/incoming com permissões de 311 para que os usuários possam fazer upload, não vendo ou puxando quaisquer arquivos neste diretório. O diretório /home/ftp irá ter permissões de 555 no qual permite visualizar e puxar os arquivos:
# cd /home/ftp # mkdir incoming # chown ftp:nogroup incoming/ # chmod 311 incoming/ # cd ../ # chmod 555 ftp/
Agora usuários anônimos podem logar, e eles podem fazer download dos arquivos em /home/ftp, mas uploads são limitados para /home/ftp/incoming (uma vez que o arquivo seja enviado para /home/ftp/incoming, ele não poderá ser lido nem puxado, o administrador do servidor terá de movê-lo para /home/ftp primeiramente para disponibilizar para isto).
9 Links de referência
Artigo Original: http://www.howtoforge.com/debian_etch_virtual_hosting_pureftpd_mysql_quota PureFTPd: http://www.pureftpd.org MySQL: http://www.mysql.com phpMyAdmin: http://www.phpmyadmin.net
Traduzido e modificado por Felippe de Meirelles Motta <lippe at fug dot com dot br> |