ProFTPD + MySQL + DProFTPAdmin + Debian Squeeze

Aqui vou abordar a configuração do ProFTPD com autenticação em MySQL com um gerenciador web de usuários que eu desenvolvi atualmente ele esta na versão 01 então erros e correções favor me informar, pois a intenção desse gerenciador web é ajudar o usuário final.

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Vamos instalar os pacotes para o ProFTPD dar suporte a quota

aptitude install quota quotatool -y

Agora vamos editar o /etc/fstab para acertar o suporte a quota o sistema de arquivo ext3 usa usrquota e grpquota os ext4 e xfs utilizam usrjquota e grpjquota então configure de acordo com o seu sistema de arquivos

vim /etc/fstab
[...]
#configurando com sistema de arquivos ext3
/dev/sda6      /home        ext3    defaults,errors=remount-ro,usrquota,grpquota 0       1
#configurando com sistema de arquivos ext4
/srv/ext4      /home        ext4    defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0        0       2
#configurando com sistema de arquivos xfs
/srv/xfs       /home        xfs     defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0        0       2

Agora vamos a configuração e ao ajuste de quotas

Vamos criar os arquivos de controle de quotas e vamos acertar as permissões deles

touch /home/aquota.user /home/aquota.group
touch /home/quota.user /home/quota.group
chmod 600 /home/quota.*

Agora vamos remontar o sistema de arquivos e ativar as quotas

cd /
mount -o remount,rw /home
quotacheck -vaguM
quotaon -vagu

Para editar quota utilizarmos o seguinte comando

edquota usuario

Para visualizar as quotas dos usuários utilizamos o seguinte comando

repquota -av

Vamos instalar o MySQL e suas dependências

aptitude install mysql-server mysql-client libmysqlclient-dev -y

Agora vamos instalar o apache e suas dependências

aptitude install apache2 apache2-doc libapache2-mod-php5 libapache2-mod-perl2 php5 php5-cli \
php5-common php5-curl php5-dev php5-xmlrpc php5-gd php5-imap php5-mhash php5-mysql php5-odbc \
php-pear curl libwww-perl imagemagick -y

Agora vamos habilitar alguns módulos do apache

a2enmod ssl
a2enmod rewrite
a2enmod suexec
a2enmod include

Vamos reiniciar o apache

/etc/init.d/apache2 restart

Vamos instalar o proftpd e o seu módulo para conexão em MySQL

aptitude install proftpd libcrypt-mysql-perl proftpd-mod-mysql -y
#Opções Selecione "standalone" ou "autônomo"

Agora vamos criar o grupo e o usuário para o nosso proftpd

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

Vamos remover arquivos que não seram necessários

cd /var/www/
rm -rf *

Obtendo o pacote do dproftpadmin

cd /var/www
wget -c http://wiki.douglasqsantos.com.br/Downloads/misc/dproftpadmin_v01.tar.gz

Desempacotando o dproftpadmin

tar -xzvf dproftpadmin_v01.tar.gz

Acertando a localização dos arquivos

mv html/* .
rm -rf html dproftpadmin_v01.tar.gz

Acertando as permissões de diretórios e arquivos

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Acertando o dono dos arquivos

chown -R www-data:www-data /var/www/

Agora precisamos importar o banco de dados

mysql -u root -p < database/base.sql

Agora já podemos acessar o nosso DProFTPAdmin em http://ip_servidor

  • Usuário: admin
  • Senha: admin

Agora vamos acertar o proftpd

vim  /etc/proftpd/proftpd.conf
[...]
UseIPv6                         off
[...]
IdentLookups off
ServerIdent on "FTP Server ready."
[...]
DefaultRoot ~
[...]
User                            proftpd
Group                           ftpgroup
[...]
Include /etc/proftpd/sql.conf

Agora temos que habilitar os modulos do sql e do mysql no proftpd

vim /etc/proftpd/modules.conf
[...]
LoadModule mod_sql.c
[...]
LoadModule mod_sql_mysql.c

Agora vamos editar o arquivo de conexão do proftpd com o MySQL

vim /etc/proftpd/sql.conf
<IfModule mod_sql.c>

#Banco de Dados que vai ser utilizado
SQLBackend  mysql
SQLEngine on

# Utilizar o tipo de autenticação aqui estou utilizando o crypt e o plaintext
SQLAuthTypes crypt plaintext

#Como vai ser a autenticação
SQLAuthenticate         users* groups*

# Aqui estamos informando como foi feita a conexão
# databasename@host database_user user_password
# estes parametros de usuário e senha foram importados no base.sql do dproftpadmin
SQLConnectInfo  dproftpadmin@localhost proftpd password

#Aqui informamos para o proftpd o nome da tabela de usuários e quais campos vão ser utilizados por ele
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Aqui informamos para o proftpd o nome da tabela de grupos e quais campos vão ser utilizados
SQLGroupInfo    ftpgroup groupname gid members

# Definindo o UID minimo e GID minimo
SQLMinID        2001

# Criar o diretório home do usuário caso não exista
CreateHome on

# Fazendo o update da quantidade de acessos do usuário
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Fazendo o pdate da hora da modificação pelo usuário tanto upload de arquivos como remoçãoSQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# Parametros de quota
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

#Não liberar o root a efetuar login
RootLogin off

#Não necessita de um shell valido
RequireValidShell off
</IfModule>

Agora vamos reiniciar o proftpd para testarmos a configuração

/etc/init.d/proftpd restart
Stopping ftp server: proftpd.
Starting ftp server: proftpd.

Vamos acertar as permissões do diretório raiz do ftp aonde o usuário admin vai ter acesso

chgrp -R ftpgroup /home/ftp
chmod -R 775 /home/ftp

Agora vamos fazer um teste de conexão ftp no servidor mesmo com o usuário admin e senha admin que foi criado pelo dproftpadmin

ftp localhost
Connected to localhost.
220 FTP Server ready.
Name (localhost:root): admin
331 Password required for admin
Password:
230-Welcome, archive user admin@localhost !
230-
230-The local time is: Mon Dec 26 18:10:54 2011
230-
230-This is an experimental FTP server.  If you have any unusual problems,
230-please report them via e-mail to <root@debian.douglasqsantos.com.br>.
230-
230 User admin logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.

Agora vamos criar um novo usuário no proftpdadmin e vamos efetuar login com ele

ftp localhost
Connected to localhost.
220 FTP Server ready.
Name (localhost:root): douglas
331 Password required for douglas
Password:
230 User douglas logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir novo
257 "/novo" - Directory successfully created
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxr-xr-x   2 douglas  ftpgroup     4096 Dec 26 18:15 novo
226 Transfer complete
ftp> quit
221 Goodbye.

Need to take a look at it

<IfModule mod_quotatab.c>
    QuotaEngine on
    QuotaLog /var/log/ftpd/quota.log
</IfModule>