Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Instalando e configurando o Pure-FTPD

without comments

Como prometido, estou migrando mais um artigo do meu antigo site e agora é a vez do Pure-FTPD.

O Pure-FTP usa a licença (BSD) e é baseado no Troll-FTPd. Seu foco está na eficiência e na facilidade de utilização. É um excelente servidor de ftp, tanto para pequenas aplicações, quanto para provedores de hospedagem. Ele tem suporte a quase todos os tipos de autenticação: LDAP, MySQL, PostgreSQL, unix users e também tem um sistema de autenticação próprio. Em nossa instalação vamos usá-lo com suporte a MySQL.

Vamos começar instalando o Pure-FTPD e o pwgen, este segundo será utilizado para gerar uma senha randômica, pois se você é como eu e tem dificuldade para gerar senhas complexas, sabe do que estou falando. Como esta instalação é baseada em Debian, vamos ao famoso apt:

apt-get install -y pure-ftpd-mysql pwgen

Altere o arquivo /etc/default/pure-ftpd-common pois iremos utilizar o servidor via daemon em vez de inetd, o sed abaixo resolve este problema:

sed -i.default 's/^\(STANDALONE_OR_INETD=\)\(.*\)/\1standalone/' /etc/default/pure-ftpd-common

Com o Pure-FTPD instalado, vamos as configurações. Não vou entrar em detalhes para que serve cada feature, caso precise, digite man pure-ftpd. Continuando, digite as seguintes linhas para configurar todas as opções que iremos utilizar:

for FILE in AllowAnonymousFXP AllowUserFXP AnonymousCanCreateDirs \
        AnonymousOnly AutoRename BrokenClientsCompatibility DisplayDotFiles \
        ProhibitDotFilesRead ProhibitDotFilesWrite VerboseLog; do
        echo no > /etc/pure-ftpd/conf/${FILE}
done

for FILE in AnonymousCantUpload AntiWarez ChrootEveryone CreateHomeDir \
        CustomerProof Daemonize DontResolve; do
        echo yes > /etc/pure-ftpd/conf/${FILE}
done

echo "2000 8" > /etc/pure-ftpd/conf/LimitRecursion
echo 50 > /etc/pure-ftpd/conf/MaxClientsNumber
echo 20 > /etc/pure-ftpd/conf/MaxClientsPerIP
echo 95 > /etc/pure-ftpd/conf/MaxDiskUsage
echo 15 > /etc/pure-ftpd/conf/MaxIdleTime
echo 4 > /etc/pure-ftpd/conf/MaxLoad
echo ftp > /etc/pure-ftpd/conf/SyslogFacility
echo "133 022" > /etc/pure-ftpd/conf/Umask

Crie o usuário e grupo sob o qual todos os usuários virtuais irão rodar:

groupadd -g 2000 ftp
useradd -u 2000 -g ftp -s /sbin/nologin ftp

Renomeie o arquivo /etc/pure-ftpd/db/mysql.conf para /etc/pure-ftpd/db/mysql.conf.default:

mv /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf.default

Gere uma senha para ser utilizada no arquivo de configuração do mysql e também quando for dar o grant. Para gerar uma senha de 13 caracteres que contenha letras e números, utilize:

pwgen -n 13 1

Obs: Esta senha será utilizada no passo seguinte.

Antes de criar o arquivo /etc/pure-ftpd/db/mysql.conf você tem que saber se vai utilizar o MySQL local no servidor, se sim, recomendo utilizar socket, ou seja, deixe comentada as opções MYSQLServer e MYSQLPort, caso o Banco esteja em um servidor remoto, descomente-as e comente a opção MYSQLSocket. Não é possível utilizar as duas opções em conjunto. Também lembre de alterar a opção MYSQLPassword e colocar a senha que você criou no passo anterior:

# MySQL server name or IP. Don't define this for unix sockets.
#MYSQLServer    127.0.0.1

# MySQL port. Don't define this if a local unix socket is used.
#MYSQLPort      3306

# Define the location of mysql.sock if the server runs on this host.
MYSQLSocket     /var/run/mysqld/mysqld.sock

# User to bind the server as.
MYSQLUser       pureftpd

# User password. You must have a password.
MYSQLPassword   SENHA GERADA PELO PWGEN

# Database to open.
MYSQLDatabase   pureftpd

# How passwords are stored
# Valid values are : "cleartext", "crypt", "md5" and "password"
# ("password" = MySQL password() function)
# You can also use "any" to try "crypt", "md5" *and* "password"
MYSQLCrypt      any

# Query to execute in order to fetch the password
MYSQLGetPW      SELECT Password FROM users WHERE User="\L" and Status='1'

# Query to execute in order to fetch the system user name or uid
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L" and Status='1'

# Query to execute in order to fetch the system user group or gid
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L" and Status='1'

# Query to execute in order to fetch the home directory
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L" and Status='1'

# Query to get the maximal disk usage (virtual quotas)
# The number should be in Megabytes.
MySQLGetQTASZ   SELECT QuotaSize FROM users WHERE User="\L" and Status='1'

# Bandwidth throttling. The server has to be compiled with throttling
# support. Values are in KB/s .
MySQLGetBandwidthUL     SELECT ULBandwidth FROM users WHERE User="\L" and Status='1'
MySQLGetBandwidthDL     SELECT DLBandwidth FROM users WHERE User="\L" and Status='1'

Mude a permissão do arquivo para 0600:

chmod 0600 /etc/pure-ftpd/db/mysql.conf

Conecte no MySQL e execute os comandos abaixo, lembrando de alterar a senha para a senha que foi gerada pelo pwgen:

CREATE DATABASE pureftpd;
USE pureftpd;

CREATE TABLE users (
  id int(32) unsigned NOT NULL auto_increment,
  User varchar(16) NOT NULL default '',
  Password varchar(64) NOT NULL default '',
  Uid varchar(11) default '2000',
  Gid varchar(11) default '2000',
  Dir varchar(128) NOT NULL default '',
  QuotaSize smallint(5) NOT NULL default '0',
  ULBandwidth smallint(5) NOT NULL default '0',
  DLBandwidth smallint(5) NOT NULL default '0',
  Status enum('0','1') NOT NULL default '1',
  Clearpass varchar(128) default '',
  PRIMARY KEY  (`id`,`User`),
  UNIQUE KEY `User` (`User`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

GRANT ALL PRIVILEGES ON pureftpd.* to 'pureftpd'@'localhost' identified by 'SENHA GERADA PELO PWGEN';

FLUSH PRIVILEGES;

Antes de inserir algum usuário no banco de dados, veja os campos e cada opção que você pode utilizar:

User - Nome do usuário.
Password - Password do usuário encriptado com MD5. 
Dir - Diretório home do usuário. 
QuotaSize - Quota do usuário em MB. 0 é ilimitado.
ULBandwidth - Limita o Upload do usuário em KB, muito útil para preservar o link do servidor. 0 é ilimitado 
DLBandwidth - Similar ao anterior, só que este aqui é para download. 0 é ilimitado.
Status - Os valores aqui dizem se a conta do usuário está ou não ativada. 1 = ativada e 0 = desativada. 
Clearpass - senha do usuario sem encriptar. Este campo muito útil, caso o usuário perca sua senha, você não precisa ficar alterando.

Para inserir um usuário de teste, conecte no MySQL e digite:

USE pureftpd;

INSERT INTO users VALUES (NULL, 'teste', MD5('teste123'), NULL, NULL, '/home/teste', 0, 0, 0, 1, 'teste123');

Com isto basta startar seu Pure-FTPD com o comando:

/etc/init.d/pure-ftpd-mysql start

Prontinho, seu servidor de FTP no ar com toda a segurança de não ter usuário no /etc/passwd.

Uma dica para ver quem está logado no seu FTP, é utilizar o comando pure-ftpwho, com ele você consegue ver quais usuários estão logados no sistema, qual o ip, etc.

Written by but3k4

April 5th, 2010 at 9:16 pm

Posted in Linux

Tagged with , ,

Leave a Reply