Arquivos históricos do BR-Linux.org apresenta:

Servidor FTP com autenticação via banco de dados

O Luciano Barcaro (luciano@alvaro.com.br) enviou o tutorial abaixo explicando como ele fez para criar um servidor ProFTPd com autenticação via usuários registrados em um banco de dados SQL.

Luciano Barcaro (luciano@alvaro.com.br)

Motivação:

A poucos dias atrás, um amigo me pediu pra montar um servidor FTP. Ele tem uma empresa de software e gostaria de facilitar a atualização de seus clientes.
Mas tinha um detalhe importante a ser contemplado. Quem cuidaria das atualizações era o pessoal de suporte, que, por medidas de segurança, não deveriam ter a senha do usuário root. Mas como criar os usuários no linux (seus clientes) sem permissão para tal?
Após uma vasculhada rápida, vi que o ProFTPd tinha autenticação via Banco de dados. Mas tive uma grande decepção quando praticamente não encontrei documentação para aplicar esta idéia.
Foi aí que resolvi escrever este tutorial, depois de quebrar um pouco a cabeça.

Software necessário:

MySQL (www.mysql.com)
ProFTPd (www.proftpd.org)

Documentação utilizada:

www.mysql.com/doc/en/index.html
www.proftpd.org/docs/configs/mysql_simple.conf
www.castaglia.org/proftpd/modules/mod_sql.html
www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-SQL.html

Download e instalação dos softwares utilizados

MySQL (Não é obrigatório utilizar o MySQL, esta escolha foi com base em minha experiência com este banco. Nada impede que você utilize postgreSQL).
Baixe a versão estável mais recente do mysql de www.mysql.com. No momento, esta versão é a 4.0.15.
Para instalar esta versão do mysql, descompacte-a dentro do diretório /usr/local:
tar zxvf /usr/local/downloads/mysql-standard-4.0.15-pc-linux-i686.tar.gz
Será criado um diretório mysql-standard-4.0.15-pc-linux-i686
Crie o seguinte link:
ln -s mysql-standard-4.0.15-pc-linux-i686 mysql
Caso seja necessário, crie um usuário chamado mysql pertencendo ao grupo mysql.
Crie a base inicial do MySQL
cd mysql
scripts/mysql_install_db
Vamos agora modificar as permissões de acesso dos arquivos do MySQL
chmod -R 770 *
chown -R mysql.mysql *
Vamos agora colocar o MySQL no ar
bin/mysqld_safe &
Para testar se o MySQL está funcionando, digite:
bin/mysql
Deve aparecer uma mensagem de boas vindas e abrir um prompt "mysql>" . Saia, digitando o comando quit e pressionando a tecla ENTER.
Para facilitar um pouco, insira o caminho /usr/local/mysql/bin em seu PATH
PATH=$PATH:/usr/local/mysql/bin
Isto garante que não seja necessário digitar toda a vez o caminho completo para o cliente do mysql.

Com isto encerramos a etapa de instalação do MySQL.

ProFTPd
Baixe a versão estável (1.2.8p).
Descompacte o arquivo baixado:
cd /usr/local/src
tar jxvf /usr/local/downloads/proftpd-1.2.8p.tar.bz2
entre no diretório criado:
cd proftpd-1.2.8
Agora, vamos compilar o proftpd, não nos esquecendo de ligar o suporte a MySQL (ou postgres):
./configure --with-modules=mod_sql:mod_sql_mysql \
--with-includes=/usr/local/mysql/include \
--with-libraries=/usr/local/mysql/lib

Para utilizar o PostgreSQL em vez do MySQL, troque o mod_sql_mysql por mod_sql_postgres
Após alguns instantes, o ProFTPd estará pronto para ser compilado. Mas antes de compilar-mos, é necessário fazer uma alteração em um arquivo do proftpd. Abra o arquivo modules/mod_sql_mysql.c com o editor de sua preferência e localize a linha 136:
#include <mysql/mysql.h>
Deixe-a assim:
#include <mysql.h>
Agora sim, o ProFTPd está pronto para ser compilado e instalado
make
Caso você, como eu, esteja utilizando o Kurumin, e nesta etapa apresentar um erro /usr/bin/ld: cannot find -lz, instale o pacote zlib1g-dev e re-execute o comando make.
E finalmente, vamos instalar o ProFTPd:
make install

Neste ponto, temos o MySQL rodando e o ProFTPd instalado. Vamos agora configurar o ProFTPd:

Precisamos antes, criar as tabelas necessárias no MySQL (usuários de postgres precisam adaptar este trecho):
mysql Chama o cliente em modo texto do mysql
create database proftpd; Cria um banco de dados chamado proftpd, este nome foi escolhido por ficar fácil de lembrar
use proftpd Seleciona o banco recém criado
create table usuario (
Usuario char(30),
Senha char(30),
UID int,
GID int,
DirBase char(30),
Shell char(30));
Cria a tabela de usuários. Aqui são definidos os usuários que podem utilizar o serviço de ftp, que UID/GID serão atribuídos a eles e qual o diretório que eles tem acesso.
grant all on proftpd.* to proftpd_user@localhost identified by 'proftpd_password'; Cria um usuário para o ProFTPd poder acessar a base de dados, dando todos os direitos a ele sobre o banco de dados "proftpd". Este usuário chama-se proftpd_user e sua senha é proftpd_password.
flush privileges; Faz com que o mysql re-leia a tabela de permissões.
insert into usuario values ('teste','teste',1001,1001,'/home/teste','/bin/bash'); Insere um usuário para testes. Note que os campos UID e GID devem ser válidos.

Preparando o ProFTPd para utilizar esta base de dados criada:

Edite o arquivo /usr/local/etc/proftpd.conf com seu editor favorito.
Insira as seguintes linhas no arquivo:
SQLAuthTypes Plaintext
SQLAuthenticate users
SQLConnectInfo proftpd@localhost proftpd_user proftpd_password
SQLUserInfo usuario usuario senha uid gid dirbase shell

O segredo está nestas 2 últimas linhas:
SQLConnectInfo indica ao ProFTPd qual banco deve conectar e com que usuário e senha.
SQLUserInfo é composto dos seguintes campos:
Nome da tabela (neste nosso exemplo, usuario)
Campos utilizados (Login, password, UID, GID, HomeDir e Shell).

Inicialize o proFTPd (execute o comando proftpd) e tente fazer um ftp com o usuário teste e senha teste (criados agora a pouco).
Neste ponto já temos o proFTPd autenticando via MySQL. Nada mais é necessário para funcionar. Abaixo tem alguns pontos que podem ser melhorados nesta integração ProFTPd e MySQL.

Para dificultar um pouco as coisas, vamos supor que seja necessário fazer uma verificação extra para aceitar ou não a conexão de determinado usuário. (Você pode manter o cadastro de usuários mas por algum motivo quer bloquear momentaneamente algum usuário, por exemplo).
Vamos inserir um novo campo na tabela de usuários. Este campo indicará se o usuário está temporariamente bloqueado ou não.
mysql proftpd
alter table usuario add bloqueado char(1) default 'N';
quit

Agora precisamos informar ao proFTPd que ele também precisa verificar se este campo contém 'N'.
Edite novamente o arquivo /usr/local/etc/proftpd.conf e insira o seguinte parâmetro:
SQLUserWhereClause "bloqueado='N'"

Você pode criar qualquer verificação extra necessária, como limitar alguns usuários a se conectarem apenas de manhã, ou apenas nas quintas-feiras. Sua imaginação é o limite.

Reinicialize o profTPd e teste novamente, variando os valores para o campo bloqueado.

Gerando o log de conexões e transferências.

Agora, nós precisamos gerar no MySQL as informações referentes ao log do ProFTPd, quem conectou, quando conectou e o que transferiu, por exemplo.
Novamente vamos voltar ao MySQL para criar as tabelas que reterão estas informações. Neste exemplo, vou criar apenas uma tabela que conterá o que o usuário fez. Nada impede que você crie mais tabelas.
mysql proftpd
create table log (id int unsigned not null auto_increment primary key,
Usuario char(30),
Host char(15),
DataHora datetime,
Acao char(20),
Referencia text);
quit

Com a tabela criada, vamos agora alterar o ProFTPd para gravar nela os dados necessários. Abra o arquivo /usr/local/etc/proftpd.conf novamente e insira as seguintes linhas:
SQLNamedQuery conexao INSERT "'%u','%a',now(),'conexão',null" log
SQLNamedQuery download INSERT "'%u','%a',now(),'download','%f'" log
SQLNamedQuery upload INSERT "'%u','%a',now(),'upload','%f'" log
SQLNamedQuery err_download INSERT "'%u','%a',now(),'ERRO download','%f'" log
SQLNamedQuery err_upload INSERT "'%u','%a',now(),'ERRO upload','%f'" log
SQLLog PASS conexao
SQLLog RETR download
SQLLog STOR upload
SQLLog ERR_RETR err_download
SQLLog ERR_STOR err_upload

Coloquei abaixo algumas substituições que podem ser feitas:
%a IP do usuário
%A Anonymous ou Unknown se não anônimo
%b Bytes transferidos (tanto upload quanto download)
%d Nome do diretório
%D Nome do diretório (caminho completo)
%f Arquivo transferido, com caminho absoluto
%F Arquivo transferido, da mesma forma que o cliente o encherga
%h Nome do host do cliente
%l Usuário remoto ou UNKNOWN se desconhecido
%L IP do servidor
%m Comando recebido pelo cliente
%p Número da porta local
%P Pid do processo local
%r Linha de comando completa recebida pelo cliente
%s Código numérico de resposta do FTP
%t Hora local
%T Tempo de transferência do arquivo
%u Nome do usuário autenticado
%U Nome do usuário, enviado originalmente pelo cliente

Com isso, chegamos ao final deste mini tutorial sobre autenticação do ProFTPd via banco de dados.
Não quis entrar em detalhes de como colocar os softwares rodando automaticamente a cada boot, mesmo por que não era este o objetivo deste documento.

-----
Sobre o autor:
Luciano Barcaro é graduando em ciência da computação, trabalha com desenvolvimento de software e brinca com linux desde 1998.
Email: luciano@alvaro.com.br

Postado por brain em outubro 26, 2003 08:45 PM

Comentários para "Servidor FTP com autenticação via banco de dados"

» Postado por: sandro lemanski em outubro 27, 2003 08:08 AM, 200.181.199:

 

» Postado por: Júnio José dos Santos em novembro 19, 2003 09:24 AM, 200.103.111:

 

» Postado por: Luciano Barcaro em novembro 26, 2003 11:27 PM, 200.138.63.:

 

» Postado por: chrdm em março 9, 2004 11:02 AM, 200.222.60.:

 

» Postado por: Jefferson em março 17, 2004 02:41 PM, 200.204.77.:

 

» Postado por: Luciano Barcaro em março 22, 2004 10:24 AM, 200.195.134:

 

» Postado por: Jonas Augusto Telöcken em maio 17, 2004 04:10 PM, 200.103.142:

 

» Postado por: Luciano Barcaro em junho 18, 2004 05:15 PM, 200.195.134:

 

» Postado por: alex em julho 31, 2004 09:13 PM, 80.8.46.134:

 

» Postado por: dario basso cardoso em agosto 3, 2004 08:51 AM, 200.167.185:

 

» Postado por: maxwull em agosto 24, 2004 11:30 PM, 201.9.44.32:

 

Antes de comentar...

- Preserve a qualidade desta discussão
- Leia os Termos de Uso.
- Este formulário deve ser usado para comentários sobre a notícia. Se você tem dúvidas ou precisa de ajuda, use o Fórum.
- Mantenha o foco nos argumentos e no assunto
- Não faça ataques pessoais.
- Pense 5 vezes antes de entrar em discussões inúteis, como "qual é a melhor distribuição/ambiente gráfico/linguagem de programação/etc.", mesmo se alguém já tiver provocado - um erro não justifica o outro
- Não seja um e-mala ;-)


O Arquivo Histórico do BR-Linux.org mantém no ar (sem alteração, exceto quanto à formatação) notícias, artigos e outros textos publicados originalmente no site na segunda metade da década de 1990 e na primeira década do século XXI, que contam parte considerável a história do Linux e do Open Source no Brasil. Exceto quando indicado em contrário, a autoria dos textos é de Augusto Campos, e os termos de uso podem ser consultados na capa do BR-Linux.org. Considerando seu caráter histórico, é provável que boa parte dos links estejam quebrados, e que as informações deste texto estejam desatualizadas.