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.173 ]

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

Modem Huawei E226 Claro 3G

Solução para conexão Claro 3G no Linux Ubuntu 8.10

Download de MP3s no IRC via X-Chat usando o protocolo SDFind

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

Configurando o Velox no seu Linux

  
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