Visite também: Br-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]
Voltar   Under-Linux.org Fóruns > UnderLinux Wiki
Wiki Classificados Galeria Reviews Jogos Comunidades RSS Feeds FAQ Termos de Uso Sobre
Cadastre-se FotosBlogs Lista de Membros Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Ferramentas pessoais
Publicidade

From UnderLinux Wiki

ProFTPD com autenticação via MySQL

Tabela de conteúdo

Introdução

Estou supondo que você já possui o MySQL instalado no seu computador, por isso não abordarei a instalação do mesmo neste tutorial.

Pacotes utilizados

  • Distribuição utilizada: Slackware 10;
  • Versão do ProFTPD: 1.2.10;
  • Versão do MySQL: 4.0.20.

Hora de colocar a mão na massa

Desinstalando

A primeira coisa que você deve fazer é verificar se o ProFTPD foi instalado na tua máquina através de um pacote pré-compilado. Se sim, você terá que o desinstalar.

Aí você se pergunta: "Pra que desinstalar e instalar de novo? No mínimo esse cara quer me fazer de besta x/".

Não é bem assim. O problema é que precisamos instalar o ProFTPD através do source para podermos habilitar o suporte ao MySQL, afinal, o objetivo é esse certo?

No Slackware eu fiz isso:

# ls /var/log/packages/ | grep proftpd
proftpd-1.2.9-i486-3

daí:

# removepkg /var/log/packages/proftpd-1.2.9-i486-3*

OBS:Você terá que adaptar os comandos de acordo com sua distribuição ou usar o gerenciador de pacotes de sua distro.

  1. pkgtool

(Slackware)

Agora que desinstalamos o pacote pré-compilado, é hora de baixar o source. A página oficial do ProFTPD é: "http://www.proftpd.org"

E o link para a versão mais atual (no momento em que fiz o tutorial) é: "ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10.tar.bz2"

use:

# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.10.tar.bz2

ou seu navegador preferido.

Terminado o download, temos que descompactar o arquivo:

# tar xvjf proftpd-1.2.10.tar.bz2 -C /usr/local/src/

(isso descompactará o arquivo na pasta /usr/local/src/)

# cd /usr/local/src/proftpd-1.2.10/


Preparando o arquivo para a compilação

Antes temos que encontrar as pastas "include" e "lib" relacionadas ao MySQL.

# find / -name mysql | grep lib
/usr/lib/mysql 

# find / -name mysql | grep include
/usr/include/mysql 

Obs.: Pode variar de acordo com sua distribuição.

Instalando

Com esses resultados eu posso compilar:

# ./configure --with-modules=mod_sql:mod_sql_mysql --with-libraries=/usr/lib/mysql --with-includes=/usr/include/mysql

Se tudo estiver OK:

# make

Espere terminar (o tempo vai variar de acordo com seu computador) e faça:

# make install

OBS: Não esqueça de substituir as pastas no --with-libraries e --with-includes pelas pastas encontradas no seu sistema ao usar os comandos:

# find / -name mysql | grep include
# find / -name mysql | grep lib

Configurando

MySQL

Agora que já temos o ProFTPD instalado com os módulos corretos, precisamos criar uma database e uma tabela onde serão guardados os dados dos usuários do FTP.

Chamando o MySQL

Primeiro chame o MySQL:

# mysqld_safe &

( No Slackware )

Agora crie uma database

# mysqladmin create ftp -u root -p

Logando-se ao MySQL

# mysql -u root -p

Criando as tabelas

Agora vamos criar as tabelas. Primeiramente temos que pensar no que precisaremos para cadastrar um usuário. Acho que nome, login, senha, UID, GID, shell e diretório são suficientes. É bom colocar um campo mostrando se o usuário é ativo ou não, pois assim você poderá desativar determinados usuários temporariamente apenas modificando o conteúdo desse campo.

Uma vez logado e supondo que o nome da database criada seja "ftp", digite:

mysql> use ftp
Database changed

Criando a tabela:

mysql> CREATE TABLE ftpusers (
-> nome varchar(255) NOT NULL DEFAULT ''''fulano'''',
-> login varchar(20) NOT NULL UNIQUE,
-> senha varchar(20) NOT NULL,
-> uid int(10) UNIQUE AUTO_INCREMENT,
-> gid int(10),
-> ativo char(1) NOT NULL DEFAULT ''''s'''',
-> dir varchar(255) NOT NULL,
-> shell varchar(255) NOT NULL,
-> email varchar(255));
Query OK, 0 rows affected (0.00 sec)
  • O comando: "CREATE TABLE ftpusers (" está dizendo ao MySQL para iniciar a criação de uma tabela chamada "ftpusers".
  • "nome varchar(255) NOT NULL DEFAULT 'fulano'" significa que a variável "nome" poderá ter até 255 caracteres e "fulano" como padrão.
  • Os outros campos seguem o mesmo esquema.

Criando usuário para acesso ao MySql

Com a tabela criada, precisamos criar um usuário para que o ProFTPD possa acessar a database "ftp", que foi a que criamos e dar a ele todos os privilégios de acesso a essa database:

mysql> GRANT ALL PRIVILEGES ON ftp.* to usuario@localhost IDENTIFIED BY ''''ftpsenha''''; Query OK, 0 rows affected (0.03 sec)

Assim o usuário "usuario", que tem como senha "ftpsenha", terá todos os privilégios sobre a database "ftp".

Entenderam? É só trocar "usuario" e "ftpsenha" pelo nome e senha que deseja.

Atualizando as permições

Em seguida mandamos o MySQL atualizar as permissões:

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

usuário para usarmos como teste

mysql> INSERT INTO ftpusers VALUES (''''nome de teste'''', ''''teste'''', ''''casa'''', 8099, 8099, ''''s'''', ''''/home/teste'''', ''''/bin/bash'''', '''' teste@mail.com'''');

O comando acima mandou inserir na tabela "ftpusers" os valores: 'nome de teste', 'userteste', 'senhateste', 9000, 8099, 's', '/home/teste', '/bin/bash', ' teste@mail.com'.

Verificando os usuários cadastrados

mysql> SELECT * FROM ftpusers;

Caso queira em ordem alfabética (usando "login" como referência):

mysql> SELECT * FROM ftpusers ORDER BY login;

Saindo do MySQL

mysql> quit
Bye

ProFTPD

Com a tabela criada no MySQL e um usuário teste cadastrado, está na hora de configurar o ProFTPD.

Primeiramente localize o arquivo de configuração do ProFTPD (proftpd.conf):

# find / -name proftpd.conf

No meu caso obtive isto: "/usr/local/etc/proftpd.conf"

Daí é só usar seu editor preferido:

# pico /usr/local/etc/proftpd.conf

Tudo o que você precisa fazer para ter o ProFTPD funcionando em cima do MySQL é adicionar as seguintes linhas ao arquivo:

SQLAuthTypes Plaintext Crypt
SQLAuthenticate users
SQLConnectInfo ftp@localhost usuario ftpsenha
SQLUserInfo ftpusers login senha uid gid dir shell
SQLUserWhereClause "ativo=''''s''''"
SQLHomedirOnDemand on

Explicando ...

  • SQLAuthTypes Plaintext Crypt: Passwords no MySQL são encriptados usando CRYPT.
  • SQLAuthenticate: Mostra o método de autenticação e o que autenticar.
  • SQLConnectInfo ftp@localhost usuário ftpsenha: aqui é onde são colocados os dados necessários para se conectar a database.

Modo de usar

SQLConnectInfo nome_da_databse@localhost usuario_da_database senha_do_usuario

  • SQLUserInfo ftpusers login senha uid gid dir shell: aqui colocamos os nomes das colunas criadas na tabela "ftpusers".


SQLUserInfo nome_da_tabela login senha uid gid dir shell
  • SQLUserWhereClause "ativo='s'": Indica ao ProFTPD que ele também precisa verificar se este campo possui como valor "s".
  • SQLHomedirOnDemand on: Diz ao ProFTPD para criar o diretório home do usuário caso não exista.

Iniciando

Agora que adicionamos as linhas ao proftpd.conf, tudo o que precisamos é inicializar o servidor FTP:

# proftpd

Testando

Agora já temos o ProFTPD configurado e rodando. Hora de testá-lo:

$ ftp localhost
Connected to localhost.
220 ProFTPD 1.2.10 Server (Angelina Jolie Me Deseja) [127.0.0.1]

Name (localhost:n0z3y): userteste
331 Password required for userteste.

Password: ******
230 User userteste logged in.

Remote system type is UNIX.
Using binary mode to transfer files.

Caso esteja tudo OK, meus parabéns, você acaba de montar um servidor de FTP com autenticação via MySQL, caso contrário refaça os passos e me avise caso encontre algum erro.

Em seguida mostrarei algumas coisas legais e configurações adicionais do ProFTPD, não sendo obrigatórias para o funcionamento do servidor.


Entendendo o arquivo proftpd.conf

Agora vamos entender um pouco como funciona o arquivo de configuração do ProFTPD.

Se você visualizar seu arquivo novamente, verá que ele está mais ou menos parecido com isso:

ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
Port 21
Umask 022
MaxInstances 30

User nobody
Group nogroup

<Directory /*>
AllowOverwrite on
</Directory>

<Anonymous ~ftp>
config
</Anonymous>

SQLAuthTypes Plaintext Crypt
SQLAuthenticate users
SQLConnectInfo ftp@localhost usuario ftpsenha
SQLUserInfo ftpusers login senha uid gid dir shell
SQLUserWhereClause "ativo=''''s''''"
SQLHomedirOnDemand on

Explicando as opções

  • ServerName: Aqui é onde será definido o nome do servidor. Exemplo:
ServerName "Servidor Ftp de teste"
  • ServerType: Aqui você define o tipo do servidor. Pode ser standalone ou inetd. No arquivo acima ele está definido como standalone.
  • DefaultServer: Diz ao ProFTPD para usar a configuração padrão caso a conexão não seja feita pelo IP da própria máquina ou por algum VirtualHost.
  • Port: Porta padrão que o ProFTPD rodará.
  • Umask 022: Serve para previnir novos diretórios e arquivos te terem permissão de escrita global.
  • MaxInstances: Limita o número de conexões simultâneas, em nosso caso, para 30.
  • <Anonymous ~ftp> e </Anonymous>: Tudo que estiver aqui dentro será uma configuração específica para um acesso anônimo ao servidor.

</pre>

A parte do MySQL já foi explicada anteriormente.

Isto foi só uma visão geral sobre algumas coisas básicas do "proftpd.conf". Na verdade estas e outras opções estão explicadas com mais detalhes no próprio proftpd.conf.


Criando Virtual Hosts

A diretriz é usada pra criar configurações diferentes para determinados hosts e/ou IPs. Pode ser usado também para oferecer conexões a diferentes portas na mesma máquina.

A maneira de se criar um VirtualHost é a seguinte:

<VirtualHost endereço_e/ou_ip>
configuração
</VirtualHost>

Exemplos de VirtualHost

<VirtualHost www.angelina_me_quer.org>
ServerName "Estou sonhando"
ServerAdmin an@ge.li.na
Port 21
MaxClients 05
DefaultServer on
TransferLog /var/log/proftpd/angelinameker.log
DefaultRoot /home/ftp/angelina
AllowOverwrite yes
</VirtualHost>

<VirtualHost ftp.domínio.com.br>
ServerName "Servidor ftp"
Port 8021
DefaultRoot ~
DefaultServer on
AllowOverwrite yes
ServerAdmin email@do.admin
Umask 022
TransferLog /var/log/proftpd/serverftp.log
</VirtualHost>


Configurações adicionais O que vimos até agora foi uma configuração básica do ProFTPD. Na verdade ele possui um grande número de funções que podem ser de grande uso para vocês. Justamente por ser um grande número, citarei apenas algumas destas funções aqui.

Existem funções, por exemplo, que servem para personalizar as mensagens mostradas durante uma seção no ProFTPD.

Mensagem personalizada

Quando Loga

Para mostrar uma mensagem quando um usuário se logar você usa:

AccessGrantMsg "mensagem"

Exemplo:

AccessGrantMsg "Seja bem vindo %u"
  • %u --> Será trocado pelo nome do usuário.

Ao falhar

Para mostrar uma mensagem quando um usuário falhar ao tentar se logar use:

AccessDenyMsg "mensagem"

Exemplo:

AccessDenyMsg "Acesso negado à %u ! Vá com Deus filho ..."

Antes do login

Para mostrar uma mensagem antes do login você usa:

DisplayConnect diretório/arquivo.msg

Exemplo:

DisplayConnect /usr/local/proftpd/connect.msg

Setando mensagem de login e logout

DisplayLogin login.msg
DisplayQuit logout.msg

OBS: Os arquivos login.msg e logout.msg devem estar abaixo do diretório principal do usuário.

Funções de tempo

Existem funções que usam o tempo que o usuário está conectado para executar determinadas ações.

Derrubando usuários por tempo ocioso

Para desconectar um usuário se ele ficar ocioso durante um certo tempo:

TimeoutIdle Tempo_em_segundos

Exemplo:

TimeoutIdle 180

Desconecta o usuário se ele ficar ocioso por 3 minutos.

Demora para logon

Para desconectar alguém que não se logou com sucesso durante um determinado tempo:

TimeoutLogin tempo_em_segundos

Exemplo:

TimeoutLogin 60

Desconectar por tempo sem upload/Download

Para desconectar um usuário caso ele fique um determinado tempo sem transferir nada:

TimeoutNoTransfer tempo_em_segundos

Exemplo:

</pre> TimeoutNoTransfer 120 </pre>

Desconecta o usuário depois de 2 minutos sem transferência.

Tempo máximo de cada cessão

Para desconectar alguém depois de um determinado tempo:

TimeoutSession tempo_em_segundos

Exemplo:

TimeoutSession 600

Desconecta qualquer usuário logado por 10 minutos.

função TransferRate=

Uma função bastante útil é a "TransferRate". Com ela você pode limitar a taxa de transferência do servidor. Para usá-la:

TransferRate RETR taxa_em_kbps:byteslivres

Exemplo:

TransferRate RETR 8:10

Limita a taxa de transferência para 8kbps.

  • taxa_em_kbps: é a taxa limite de transferência que você deseja aplicar.
  • bytes_livres: é a quantidade de bytes que podem ser transferidos antes do controle de taxa de transferência ser aplicado.

função DefaultRoot

Outra bastante utilizada é a DefaultRoot.

DefaultRoot diretório

Exemplo:

DefaultRoot /home/tal

Com ela você pode limitar os usuários a um determinado usuário. Caso use:

DefaultRoot ~

você estará limitando o usuário ao seu próprio home (recomendável).


Exemplo de proftpd.conf

ServerName "Angelina Jolie Me Deseja"
ServerType standalone
DefaultServer on
Port 8021
#Umask 022
MaxInstances 20
User nobody
Group nogroup
DefaultRoot ~
AccessGrantMsg "Uepaa!! Seja Bem Vindo %u"
AccessDenyMsg "ADEUS!"
DisplayConnect /usr/local/message.msg

TimeoutLogin 60
TimeoutNoTransfer 120
TimeoutIdle 180

# Normally, we want files to be overwriteable.
AllowOverwrite on

# Bar use of SITE CHMOD by default
<Limit SITE_CHMOD>
DenyAll
</Limit>

SQLAuthTypes Plaintext Crypt
SQLAuthenticate users
SQLConnectInfo ftp@localhost usuario ftpsenha
SQLUserInfo ftpusers login senha uid gid dir shell
SQLUserWhereClause "ativo=''''s''''"
SQLHomedirOnDemand on


Conclusão

Concluindo ... Como dito anteriormente, isto foi apenas uma configuração básica do ProFTPD. Aconselho dar uma olhada na página oficial do mesmo para configurações adicionais.

Espero ter ajudado.


PS: Sou novo nesse negócio de Linux e artigos, então qualquer sugestão para que eu possa melhorar será muito bem vinda. Valeu, abraço à todos o/

Autor

Hugo Dória (xnozey@gmail.com)
Horários baseados na GMT -3. Agora são 12:24.


Powered by vBulletin®
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.