VSFTPD + Usuários Virtuais + MySQL

Neste artigo desejo compartilhar com a comunidade uma maneira de configurar um servidor FTP com suporte aos usuários 100% virtuais, em uma base de dados MySQL a fim de facilitar a administração, backups, trocas de senhas, entre tantos outros benefícios.

[ Hits: 65.121 ]

Por: Eduardo Frazão em 02/12/2005


VSFTP



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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. PAM - Pluggable Authentication Modules for Linux
   3. PAM - MySQL
   4. VSFTP
   5. Considerações finais
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Load Balancer com Failover, Perlbal e Heartbeat para servidores web

Transmissão de dados via telemetria: uma opção de comunicação remota

Servidor Apache hospedando diversos sites com e sem SSL

Como bloquear anúncios indesejados durante sua navegação pela web

MSN-Proxy no Debian Lenny

  
Comentários
[1] Comentário enviado por gustavo_marcon em 02/12/2005 - 12:12h

Legal teu artigo, mas tenho uma dúvida semelhante:

Alguém sabe se tem como fazer a mesma coisa só que com o SQUID?
Gravar os usuários em uma base mySQL e fazer o Squid consultar lá na hora de autenticar?

Obrigado!

[2] Comentário enviado por EduFrazao em 02/12/2005 - 17:20h

Tem sim amigo:
http://freshmeat.net/projects/mysql_auth/
Esse é um Basic Auth Helper. Ele é facilmente acoplado ao SQUID e pode validar suas consultas no MySQL...
O SQUID tb tem um Helper embutido, pra fazer autenticação via PAM, ou seja. Mais um metodo pra autenticar em MySQL

Abraços
Frazão

[3] Comentário enviado por gpr.ppg.br em 14/12/2005 - 18:52h

como faço para baixar tudo de uma pasta, arquivos e subpastas. no ftp em modo texto ??? pois eu usei o comando: mget *.* e só baixa os arquivos.

[4] Comentário enviado por ip3 em 06/02/2006 - 20:28h

Otimo artigo! muito bem explicado , só um errinho ali no final , no comando "vsftp &" no caso , pelo menos aqui foi "vsftpd &" faltou o "d" ali , mas muito bom o artigo , parabens!

[5] Comentário enviado por sergioalsp em 22/10/2006 - 22:27h

Ai Edu eu fiz da forma que tu escreveu ai só que na hora de autenticar dar o erro:

500 OOPS: child died

e até agora não consegui detectar o que pode está errado...

A minha distrib é Ubuntu..

[6] Comentário enviado por macinux em 16/01/2007 - 17:59h

pessoal seguinte... eu consegui fazer um usuario acessar o ftp dele normalmente... rola o acesso tanto por browser, como via terminal e via Zend studio, so que o problema está na hora do usuário gravar dentro da pasta da permissão negada so que a pasta em que o cara esta gravando está até com a permissão 777 e nada adianta... alguém sabe o que pode ser?? desde ja agradeço e parabéns pelo post Edu!!!

[7] Comentário enviado por diegofa em 03/05/2007 - 15:47h

Aqui não estava autenticando e eu achei em outro artigo a seguinte linha no arquivo /etc/pam.d/vsftpd:
session required /lib/security/pam_mysql.so user=vsftpd passwd=senha host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=0

Dai ficou blz!
Se alguem estiver com problemas tente adicionar essa linha.

[8] Comentário enviado por biosterlinux em 20/06/2007 - 11:06h

Eu fiz e deu certo, mas só funciona com o crypt=0

Que será heim?
Minha intenção mesmo era por criptografia no login!

Valeu!!

[9] Comentário enviado por apokalypse em 30/09/2008 - 01:27h

olha amigos...
fiquei com uma dúvida aqui. pelo que entendi, o diretorio com os arquivos do usuario ficariam dentro de /var/vsftp/nome_do_usuario. Como estu configurando um servidor de host, seria mais obvio organizar os arquivos do cliente dentro do diretorio /home/nome_do_usuario, da mesma forma que o cpanel faz.
ja modifiquei pra cair dentro dessa pasta, mas minha duvida ficou a seguinte: a pasta deve ter permissao para o usuario/grupo virtualftp:secureftp. Mas desta forma o meu apache nao consegue acessar os arquivos!!

alguem ai teria alguma solução??? Deixar como nobody talvez??

abraços!

[10] Comentário enviado por ikkarus em 14/04/2011 - 11:35h

bom dia,

como previsto no artigo, o servidor esta utilizando meu usuario root,
em qual arquivo de configuração faço a seguinte alteração?


virtualftp:x:1009:110::/var/vftp/root:/bin/false

Se assim estiver, altere para:

virtualftp:x:1009:110::/var/vftp/$USER:/bin/false



abraço galera.

[11] Comentário enviado por ikkarus em 16/04/2011 - 01:08h

ola!
a quem interessar, o arquivo a que me referi eh o /etc/passwd
=)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts