Instalando e Configurando o Pure-FTPd com MySQL

Instalando o pacote do Pure-ftpd

aptitude install mysql-server mysql-client pure-ftpd-mysql -y

Agora vamos ajustar ele para rodar como deamon

echo "yes" > /etc/pure-ftpd/conf/Daemonize

Vamos proibir o login de anomymous

echo "yes" > /etc/pure-ftpd/conf/NoAnonymous

Vamos habilitar o chroot

echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone

Vamos habilitar o nosso servidor escutar somente em ipv4

echo "yes" > /etc/pure-ftpd/conf/IPV4Only

Vamos limitar a quantidade de Cliente para 10

echo "10" > /etc/pure-ftpd/conf/MaxClientsNumber

Vamos limitar a quantidade de conexões de um IP

echo "2" > /etc/pure-ftpd/conf/MaxClientsPerIP

Vamos ajustar os logs

echo "ftp" > /etc/pure-ftpd/conf/SyslogFacility

Vamos habilitar o verbose nos logs para termos mais informações sobre o que os usuário estão fazendo

echo "yes" > /etc/pure-ftpd/conf/VerboseLog

Vamos habilitar a listagem de arquivos ocultos

echo "yes" > /etc/pure-ftpd/conf/DisplayDotFiles

Vamos desabilitar a resolução de nomes nos logs

echo "yes" > /etc/pure-ftpd/conf/DontResolve

Vamos ajustar o tempo máximo que um cliente pode ficar ocioso

echo "10" > /etc/pure-ftpd/conf/MaxIdleTime

Vamos ajustar o uid mínimo para efetuar login no ftp, pois vamos mascarar os usuários do banco de dados

echo "9999" > /etc/pure-ftpd/conf/MinUID

Vamos habilitar o usuário a poder escrever ou remover arquivos ocultos

echo "no" > /etc/pure-ftpd/conf/ProhibitDotFilesWrite

Vamos habilitar o usuário poder ler arquivos ocultos

echo "no" > /etc/pure-ftpd/conf/ProhibitDotFilesRead

Vamos habilitar o servidor a nunca deixar sobreescrever arquivos

echo "no" > /etc/pure-ftpd/conf/AutoRename

Vamos desabilitar o usuário a mudar a permissão de seus arquivos

echo "yes" > /etc/pure-ftpd/conf/NoChmod

Vamos habilitar a criação do diretório home caso não exista

echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir

Vamos habilitar o percentual máximo de uso do disco, com isso quando chegar a este ponto não vamos mais habilitar uploads

echo "85" > /etc/pure-ftpd/conf/MaxDiskUsage

Vamos habilitar proteção contra usuário fazer coisa errada como chmod 0 nos arquivos

echo "yes" > /etc/pure-ftpd/conf/CustomerProof

Agora vamos criar o banco de dados e a tabela para armazenar os nossos usuários

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 5.5.37-0+wheezy1 (Debian)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database pure;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on pure.* to pure@localhost identified by 'pure';
Query OK, 0 rows affected (0.00 sec)

mysql> use pure;
Database changed
mysql> CREATE TABLE users (
    ->   User VARCHAR(16) BINARY NOT NULL,
    ->   Password VARCHAR(64) BINARY NOT NULL,
    ->   Uid INT(11) NOT NULL default '9999',
    ->   Gid INT(11) NOT NULL default '9999',
    ->   Dir VARCHAR(128) BINARY NOT NULL,
    ->   PRIMARY KEY  (User)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> \q
Bye

Vamos criar um grupo chamado pure para marcarar o gid do sistema

groupadd -g 9999 pure

Agora vamos criar um usuário chamado pure para utilizarmos ele para mascarar os uid do sistema

useradd -m -s /bin/false -g 9999 -u 9999 pure

Agora vamos configurar o arquivo de conexão do pure com o MySQL

Vamos fazer um backup do arquivo

cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf.old

Agora vamos ajustar o arquivo

vim /etc/pure-ftpd/db/mysql.conf
MYSQLServer     127.0.0.1
MYSQLPort       3306
MYSQLUser       pure
MYSQLPassword   pure
MYSQLDatabase   pure
MYSQLCrypt      password
MYSQLGetPW      SELECT Password FROM users WHERE User='\L'
MYSQLGetUID     SELECT Uid FROM users WHERE User='\L'
MYSQLDefaultUID 9999
MYSQLGetGID     SELECT Gid FROM users WHERE User='\L'
MYSQLDefaultGID 9999
MYSQLGetDir     SELECT Dir FROM users WHERE User='\L'

Agora vamos adicionar um usuário no banco de dados

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 5.5.37-0+wheezy1 (Debian)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use pure;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into users(user, password, dir) values ('douglas',password('123'),'/home/pure/douglas');
Query OK, 1 row affected (0.02 sec)

mysql> \q

Agora vamos criar o diretório para o douglas

mkdir -p /home/pure/douglas

Agora vamos ajustar as permissões

chown -R pure:pure /home/pure/douglas

Agora vamos desabilitar o login via pam e deixar somente via MySQL

echo "no" > /etc/pure-ftpd/conf/PAMAuthentication

Agora vamos reiniciar o pure

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

Agora vamos testar a conexão e vamos criar um diretório

ftp localhost
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 18:55. Server port: 21.
220-This is a private system - No anonymous login
220 You will be disconnected after 15 minutes of inactivity.
Name (localhost:root): douglas
331 User douglas OK. Password required
Password:
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful
150 Connecting to port 37494
226-Options: -l 
226 0 matches total
ftp> mkdir novo
257 "novo" : The directory was successfully created
ftp> ls
200 PORT command successful
150 Connecting to port 35479
drwxr-xr-x    2 9999       pure             4096 Jun 17 18:56 novo
226-Options: -l 
226 1 matches total
ftp> cd ..
250 OK. Current directory is /
ftp> quit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.

Habilitando o TLS

Habilitando que o TLS, se o valor for 1 podemos utilizar ou não a opção de TLS se o valor for dois é obrigatório utilizar o TLS na conexão.

echo "1" > /etc/pure-ftpd/conf/TLS

Vamos acessar o diretório que vai armazenar as nossas chaves

cd /etc/ssl/private 

Agora vamos gerar a nossa chave auto-assinada

openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem 
Generating a 1024 bit RSA private key
.........++++++
...................................................................................................................................................++++++
writing new private key to '/etc/ssl/private/pure-ftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas 
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:pure.douglasqsantos.com.br
Email Address []:douglas.q.santos@gmail.com

Agora vamos ajustar a permissão da nossa chave

chmod 400 pure-ftpd.pem

Agora vamos reiniciar o serviço

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

Referências