Virtual Hosting com PureFTPd e MySQL Autoria de Felippe de Meirelles Motta 14/05/2007 Última Atualização 15/06/2007 FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD 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 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 possib 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 MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR 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  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ã sob um sistema Windows ou gftp sob um Desktop Linux) eâ tenteâ conectarse.â 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 s 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â eã 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. De tado. 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>