proFTPd con autenticación segura contra MySQL, fácil fácil.

8 03 2009

Una receta rápida y muy sencilla para un FTP corporativo más o menos seguro (en la medida de lo posible utilizando el protocolo FTP) con gestión web de usuarios, utilizando proftp + MySQL + TLS/SSL + proFTPdAdmin + Debian 5.0

  • Mediante APT, descargar todos los paquete necesarios;

apt-get install proftpd

apt-get install apache2 php5 mysql-server openssl (para proftpdadmin)

apt-get install php5-mysql (para proftpdadmin)

  • Recordad poner un password de root para MySQL !
  • Descargar e instalar proftpdAdmin;

wget http://freefr.dl.sourceforge.net/sourceforge/proftpd-adm/proftpd_admin_v1.2.tar.gz

tar zxvf proftpd_admin_v1.2.tar.gz

cd proftpd_admin_v1.2

      Una vez en el directorio de proftpd_admin, editar el archivo

misc/database_structure_mysql/db_structure.sql

    , escribiendo en las tres últimas lineas la contraseña para el usuario MySQL (proftpd) que se creará mediante este script.
  • Crear la nueva base de datos, a partir de la estructura del fichero db_structure.sql

mysql -u root -p < misc/database_structure_mysql/db_structure.sql

Si queremos comprobar que efectivamente se ha creado una nueva base de datos, podemos loguernos en nuestro MySQL como root, y escribr “show DATABASES;” tras lo que aparecerá algo como..

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |

|proftpd_admin |
+——————–+
3 rows in set (0.00 sec)

  • Dar permisos de escritura a todos para el fichero de configuración

chmod o+w configuration.xml

  • Sustituir el fichero de configuración original, por el que recomienda proftpdadmin y dar permisos al directorio “logs” para evitar problemas con el usuario de Apache (ya que este directorio irá en /var/www) aprovechando la posibilidad de generar bitácoras en fichero de texto, fuera de la base de datos.

cp misc/sample_config/proftpd.conf /usr/local/etc/proftpd.conf

chmod -R o+w logs

  • Mover el directorio completo de trabajo a /var/www

cd..

mv proftpd_admin_v1.2 /var/www/

chown -R www-data:www-data /var/www/proftpd_admin_v1.2/ (hacemos dueño recursivamente al usuario de apache)

  • Configurar Apache para que apunte únicamente a proftpdadmin. Por ejemplo, una configuración rápida y funcional, para accesos locales (demasiado inseguro para accesos externos!!) sería:
<VirtualHost *:80>
        DocumentRoot /var/www/proftpd_admin_v1.2/
        <Directory />
                Order deny,allow
                Deny from all
                Options None
                #Options FollowSymLinks
                #AllowOverride None
        </Directory>
        <Directory /var/www/proftpd_admin_v1.2/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>
  • Editar el fichero /etc/proftpd/proftpd.conf, sustituyendo los valores MasqueradeAddress y/o habilitando DynMasqRefresh (para IPs Dinámicas):
Include /etc/proftpd/modules.conf
UseIPv6                         off
IdentLookups                    off # If set on you can experience a longer connection delay in many cases.

#======================================================
ServerName                      "Servidor FTP !"
ServerType                      standalone
DeferWelcome                    on "Por favor, ingrese sus datos correctamente"

MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    off

TimeoutNoTransfer               120
TimeoutStalled                  120
TimeoutIdle                     240

DisplayLogin                    .welcome.msg
DisplayChdir                    .message true
ListOptions                     "-l"

#AccessGrantMsg                  "Bienvenido %u al servidor de cortesia de..."
#AccessDenyMsg                   "Datos de conexion incorrectos"

DenyFilter                      \*.*/ #Por aquel ataque raro basado en *.*.*.*.* (algunos servers antiguos todavía son inseguros)
PathDenyFilter                  "\\.ftp)|\\.ht)[a-z]+$" # impide crear nuevos archivos siguiendo los patrones dados

# Use this to jail all users in their homes
#DefaultRoot                    ~ users,!admins #podemos asignar grupos o usuarios a enjaular
DefaultRoot                     /home/ftp
RequireValidShell               off

Port                            21
PassivePorts                    40100 40200
MasqueradeAddress               xxx.xxx.xxx.xxx #Vuestra IP o nombre DNS externo
UseReverseDNS                   off

<IfModule mod_dynmasq.c>
        # DynMasqRefresh 28800  # This is useful for masquerading address with dynamic IPs:
</IfModule>

MaxInstances                    15 #For DOS Attacks don't put this value longer than 30
MaxClientsPerHost               3 #"Solo %m conexiones por host"
MaxClients                      10
MaxHostsPerUser                 1 #"Solo se puede conectar 1 vez"

MaxLoginAttempts         3
User                            ftp
Group                           nogroup

Umask                           022  022
AllowOverwrite                  on
AllowStoreRestart               on #Resumir uploads
AllowRetrieveRestart            on #Resumir donwloads

#===========================================================
# This is required to use both PAM-based authentication and local passwords
# AuthOrder                     mod_auth_pam.c* mod_auth_unix.c

# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile           off

ScoreboardFile          /var/log/scoreboard

LogFormat           default     "%h %l %u %t \"%r\" %s %b"
LogFormat           auth        "%v [%P] %h %t \"%r\" %s"
LogFormat           write       "%h %l %u %t \"%r\" %s %b"

SystemLog               /var/log/proftpd/proftpd.log
TransferLog             /var/log/proftpd.xferlog
ExtendedLog             /var/log/proftpd.access_log    WRITE,READ write
ExtendedLog             /var/log/proftpd.auth_log      AUTH auth
ExtendedLog             /var/log/proftpd.paranoid_log  ALL default

#============================================================
<IfModule mod_quotatab.c>
        QuotaEngine off
</IfModule>

<IfModule mod_ratio.c>
        Ratios off
</IfModule>

# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default.
<IfModule mod_delay.c>
        DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
        ControlsEngine        off
        ControlsMaxClients    2
        ControlsLog           /var/log/proftpd/controls.log
        ControlsInterval      5
        ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
        AdminControlsEngine off
</IfModule>

#=========================================================
# Alternative authentication frameworks
Include /etc/proftpd/tls.conf # This is used for FTPS connections Include /etc/proftpd/sql.conf 
#=========================================================
#/home/ftp >> Se puede leer por todos, y escribir solo por el grupo de administradores

<Directory /home/ftp/*>
        AllowOverwrite          off
        HideNoAccess            off

        <Limit READ>
                AllowAll
        </Limit>

        <Limit WRITE>
                AllowUser       usuario1
                DenyAll
        </Limit>
</Directory>

#==========================================================
#/home/ftp/incoming >> Se puede leer y escribir por todos

<Directory /home/ftp/incoming/*>
        AllowOverwrite          on
        HideNoAccess            on

        <Limit READ>
                DenyGroup       !admins #impide a todos menos a los admins
        </Limit>

        <Limit STOR MKD>  #STOR (de store) para habilitar subidas, y MKD para crear directorios
                AllowAll
        </Limit>
</Directory>
<Global>
</Global>
#=========================================================
# En FTPs anonimos, esta es la configuracion mas cerrada posible.No permite hacer casi nada, a no ser que se permita explicitamente.

#<Directory *>
#       <Limit CDUP CWD LIST MDTM NLST PWD RNFR STAT XCUP XCWD XPWD>
#               DenyAll
#       </Limit>
#       <Limit RETR SIZE>
#               DenyAll
#       </Limit>
#       <Limit APPE DELE MKD RMD RNTO STOR STOU XMKD XRMD>
#               DenyAll
#       </Limit>
#       <Limit WRITE READ RNEF>
#               DenyAll
#       </Limit>
#</Directory>
  • En el fichero /etc/proftpd/modules.conf, descomentar la linea LoadModule mod_sql_mysql.c y LoadModule mod_sql.c
  • Configurar el fichero /etc/proftpd/sql.conf
<IfModule mod_sql.c>
    AuthOrder               mod_sql.c
    SQLAuthTypes        Backend
    SQLConnectInfo           proftpd_admin@localhost proftpd password_usuarioMySQL (Cambiar por el password dado al principio)
    SQLUserInfo            usertable userid passwd uid gid homedir shell
    SQLGroupInfo        grouptable groupname gid members
    SQLUserWhereClause        "disabled=0 and (NOW()<=expiration or expiration=-1 or expiration=0)"

#========================================================

    SQLLogFile        /var/log/proftpd.mysql

    # Log the user logging in
    SQLLog PASS counter
    SQLNamedQuery counter UPDATE "lastlogin=now(), count=count+1 WHERE userid='%u'" usertable

    # logout log
    SQLLog EXIT time_logout
    SQLNamedQuery time_logout UPDATE "lastlogout=now() WHERE userid='%u'" usertable

    # display last login time when PASS command is given
    SQLNamedQuery login_time SELECT "lastlogin from usertable where userid='%u'"
    SQLShowInfo PASS "230" "Last login was: %{login_time}"

    # xfer Log in mysql
    SQLLog RETR,STOR transfer1
    SQLNamedQuery  transfer1 INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'c', NULL" xfer_stat
    SQLLOG ERR_RETR,ERR_STOR transfer2
    SQLNamedQuery  transfer2 INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'i', NULL" xfer_stat
</IfModule>
  • Generar un certificado para el acceso seguro con el comando:

openssl req -x509 -newkey rsa:1024 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -nodes -days 365
chmod 0600 /etc/ssl/private/proftpd.key
chmod 0640 /etc/ssl/private/proftpd.key

  • Por último, configurar el acceso seguro, editando el fichero /etc/proftpd/tls.conf
<IfModule mod_tls.c>
    TLSEngine                               on
    TLSLog                                  /var/log/proftpd/tls.log
    TLSProtocol                             SSLv23 TLSv1

    TLSRSACertificateFile                   /etc/ssl/certs/proftpd.crt
    TLSRSACertificateKeyFile                /etc/ssl/private/proftpd.key

    #TLSCACertificateFile              /etc/ssl/certs/
    # or avoid CA cert
    TLSOptions                              NoCertRequest

    # Authenticate clients that want to use FTP over TLS?
    TLSVerifyClient                         off
    # Are clients required to use FTP over TLS when talking to this server?     TLSRequired                             off #Permitimos conexiones fuera de TLS o exigimos usar SSL/TLS?

    # Allow SSL/TLS renegotiations when the client requests them, but
    # do not force the renegotations.  Some clients do not support
    # SSL/TLS renegotiations; when mod_tls forces a renegotiation, these
    # clients will close the data connection, or there will be a timeout
    # on an idle data connection.
    #
    TLSRenegotiate                          required off
</IfModule>

Tan solo quedaría reiniciar los servicios;

/etc/init.d/apache2 restart && /etc/init.d/proftpd restart

Si proftpd da algún error extraño al iniciar el demonio, probablemente hayáis copiado mal los archivos de configuración (en parte debido al formato que da WordPress al texto), así que debeis editar lo necesario a mano.

Ya se puede iniciar el configurador web, que en un principio mostrará un error de conexión a la base de datos

proftpdadmin

proftpdadmin

Hay que ir a configure > database y utilizar el usuario proftpd, con la contraseña que escribimos en los primeros pasos de la instalación (definida en misc/database_structure_mysql/db_structure.sql). Una vez hayamos enganchado a la base de datos, creamos un usuario, y probamos a conectarnos a nuestro nuevo server, que no funcionará bien hasta que creemos los directorios definidos en el archivo /etc/proftpd/proftpd.conf;

mkdir /home/ftp
mkdir /home/ftp/incoming
chmod 607 /home/ftp/incoming (para pruebas rápidas de subida de ficheros)

Una vez comprobado que el servidor funciona, ya podemos asignar permisos a los directorios y definir accesos más concienzudamente.

Las conexiones seguras, según marca el protocolo, son al puerto 990, pero para este ejemplo, y ya que el acceso será seguro e “inseguro” indistintamente, llevaremos todas las comunicaciones por el mismo puerto. Para configurar FileZilla (por ejemplo) para accesos seguros, basta copiar la siguiente config;

filezilla-ssl

filezilla-ssl

Para rizar el rizo, y si nos empeñamos en utilizar el puerto seguro, podemos configurar el acceso en un virtual server, sólo a un directorio concreto, y utiliizar además los muchos “contribs” que tiene proftpd (ban, radius, rewrite..) aunque esto ya es materia para otra receta distinta..

Suerte !!

PD: Más info en;

http://www.proftpd.org/
http://www.linuxcentro.net/linux/staticpages/index.php?page=ServidorFTPCompleto

Advertisement

Acciones

Información

6 respuestas

6 07 2009
gu

Hacia tiempo que no veia un manual valido para proftpd+mysql en condiciones! Muchas gracias por la info.

17 07 2009
AriesMOo

Me alegra que te haya resultado útil..

24 08 2009
Gustavo

Hola
Excelente el tutorial.
Pero siempre hay un pero.. ;)

Me da el siguiente error cuando hago esto /etc/init.d/proftpd start

Arrancando ftp server: proftpd/etc/init.d/proftpd: line 88: 5232 Violación de segmento start-stop-daemon –start –quiet –pidfile “$PIDFILE” –oknodo –exec $DAEMON — $OPTIONS
failed!

Revise todas las configuraciones y creo que estan bien escritas. Las copie tal cual este tutorial.
La parte de web esta andando, pero el servidor no arranca, alguna sugerencia por donde buscar.
Saludos y gracias por tu tiempo

26 08 2009
AriesMOo

Asegúrate de que tienes el modo “standalone” en ServerType del fichero de configuración bien puesto..
Parece que a tu proftp no le gusta alguna linea de ese fichero (revisa comas, espacios, caracteres raros…) y mira la linea 88 del script de arranque, haber si te da alguna pista..
Cuidado con las versiones de las librerías, que las hay que no se llevan bien unas con otras.

Si todo falla, prueba a poner el fichero de configuración original, haber si así te arranca el demonio, y ve haciendo los cambios de poco en poco. Quizá así aísles el problema.

Ahora mismo no tengo ningún proftp a mano, y andamos migrando el ESX de la oficina, por lo que no te puedo decir más cosas de momento.

Suerte y saludos.

31 12 2009
Valter

- Fatal: LoadModule: error loading module ‘mod_sql_mysql.c’: Permission denied on line 35 of ‘/etc/proftpd/modules.conf’
sando esse erro

11 08 2011
gera

Hola
Muy buen post, funciona perfecto y todo está masticadito. Lo felicito…
¿Cómo para hacer un ftp mixto com anónimos?

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s




Seguir

Get every new post delivered to your Inbox.