A instalação do VSFTP é absolutamente simples. Os processos de instalação são baseados na versão 2.0.3. Acredito que ao longo da série 2.0.x não deverão mudar.
Baixe o source atualizado no site do VSFTPD, citado na introdução do artigo.
Logo após, descompacte-o e acesse o diretório.
Criaremos alguns diretórios e usuários necessários ao funcionamento do Daemon. É possível que alguns dos usuários e diretórios já existam em seu sistema.
# mkdir /usr/share/empty
# mkdir /var/ftp
# mkdir /var/vftp
# groupadd ftp
# groupadd secureftp
# useradd -d /var/ftp -s /bin/false -g ftp ftp
# useradd -d /usr/share/empty -s /bin/false -g secureftp secureftp
# useradd -d /var/vftp/$USER -s /bin/false -g secureftp virtualftp
Observação: Este último usuário será utilizado como um usuário base aos virtuais. Observem que seu diretório HOME é um tanto quanto peculiar, pois apresenta uma variável. É até importante dizer que essa variável deva existir no atual console, ou seja, quando você der o comando, ela poderá ser substituída pelo atual usuário (root), logo, seu passwd ficará assim (exceto pelo UID e GID):
virtualftp:x:1009:110::/var/vftp/root:/bin/false
Se assim estiver, altere para:
virtualftp:x:1009:110::/var/vftp/$USER:/bin/false
Agora, vamos alterar as permissões de acesso aos diretórios criados:
# chown root.root /var/ftp && chmod 775 /var/ftp
# chown secureftp.secureftp /usr/share/empty && chmod 700 /usr/share/empty
# chown virtualuser.secureftp /var/vftp && chmod 770 /var/vftp
Usuários e diretórios OK, vamos compilar o daemon:
# make
# make install
Após a compilação, crie um arquivo com o nome de 'vsftpd.conf' em /etc:
### Arquivo de configuração do VSFTPD
anonymous_enable=YES
anon_umask=077
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd-xfer.log
vsftpd_log_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=200
data_connection_timeout=120
nopriv_user=secureftp
async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Bem Vindo ao FTP XXXX ( Deixe aqui o Banner ).
ls_recurse_enable=NO
listen=YES
chroot_local_user=YES
guest_username=virtualftp
user_sub_token=$USER
guest_enable=YES
pam_service_name=vsftpd
# Final do arquivo de configuração.
Agora, crie um arquivo com o nome de 'vsftpd' dentro de /etc/pam.d.
Seu conteúdo será:
auth required /lib/security/pam_mysql.so user=vsftpd passwd=senha
host=localhost db=vsftpd table=users usercolumn=name
passwdcolumn=passwd crypt=0
account required /lib/security/pam_mysql.so user=vsftpd passwd=senha
host=localhost db=vsftpd table=users usercolumn=name
passwdcolumn=passwd crypt=0
Observação 1: Somente pule linha, após o parâmetro crypt=0. Antes de ele, tudo faz parte da mesma linha mesmo. Dependendo da resolução do seu monitor, as linhas obviamente podem ser cortadas, mas são somente duas :).
Observação 2: O parâmetro crypt pode ser alterado, opções:
- crypt=0 = Senha sem criptografia;
- crypt=1 = Criptografia Crypt mesmo;
- crypt=2 = Criptografia do parâmetro PASSWORD do MySQL.
Escolha seu método e se divirta. :)
Feito isso, a configuração do VSFTPD já está praticamente pronta. Obviamente, existem muitos outros parâmetros a serem explorados e todos de fácil implementação. Uma conferida no manual sempre faz bem:
# man 5 vsftpd.conf
Agora, só resta criar o banco de dados no MySQL e "povoar" as tabelas.
Crie um arquivo de texto com o nome de 'vsftpd.sql'. O arquivo terá o seguinte conteúdo:
######
# Script para criação do Banco de Dados para autenticação dos Usuários
# VSFTPD - By Eduardo Frazao - edufrazao @ gmail.com
######
use mysql;
INSERT INTO user (host, user, password) VALUES ('localhost','vsftpd','');
UPDATE user set password=PASSWORD('senha') WHERE user='vsftpd';
create database vsftpd;
use vsftpd;
create table users ( name char(16) binary ,passwd char(16) binary );
FLUSH PRIVILEGES;
GRANT select ON vsftpd.* to vsftpd;
# Fim do Script
Observação: Não esqueça de alterar a senha do usuário no script. Fazendo isto, altere também a senha do usuário no arquivo /etc/pam.d/vsftpd. Após salvar o arquivo, você pode usar o cliente do MySQL para adicionar o banco de dados automaticamente:
# mysql -u root -p < vsftpd.sql
Entre com a senha de root do banco de dados e, automaticamente, será criado o banco de dados e o usuário que terá acesso à ele.
Agora já podemos fazer um teste. Vamos adicionar um usuário dentro do banco de dados:
# mysql -u root -p
(Não se esqueça que, por segurança, demos apenas permissão de 'select ' no banco para o user vsftpd. Por isso, estamos acessando o banco de dados como root. )
mysql>
use vsftpd;
Database changed
mysql>
INSERT into users (name, passwd) VALUES ('usuario','senha');
Query OK, 1 row affected (0.01 sec)
mysql>
quit
OK. Usuário adicionado. Devemos criar o HOME dele, pois o VSFTPD, infelizmente, ainda não faz isso por nós, se faz não descobri como, desculpem-me.
# cd /var/vftp
# mkdir usuario
# chown virtualftp.secureftp usuario
# chmod 775 usuario -R
Agora, vamos subir o Daemon:
# vsftp &
Agora, é só fazer um teste:
$ ftp
ftp>
open (to) localhost
Connected to localhost.
220 Bem Vindo ao FTP do CPD Faban - Unidade II - Powered By
Linux 2.6
Name (localhost:eduardo): usuario
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
No Log do MySQL, podemos constatar então que o PAM fez a sua parte:
49 Connect vsftpd@localhost on vsftpd
49 Init DB vsftpd
49 Query SELECT 1, passwd FROM users WHERE name = 'usuario'
49 Quit
OK. Usuário autenticado em MySQL, 100% virtual no sistema. Nada de usuários no seu shadow.O interessante deste método é o gerenciamento de contas em larga escala. Obviamente que não adicionamos as contas em um banco de dados MySQL para fazermos o trabalho manualmente.
Criamos a possibilidade de criar um script simples em PHP, que poderá criar para nós os usuários, tirar a relação das contas, e obviamente, aumentar o número de campos da tabela, a fim de organizar um cadastro. É possível também via PHP, criar os diretórios de cada usuário. Assim tornamos o processo totalmente automatizado.