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
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;
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


Hacia tiempo que no veia un manual valido para proftpd+mysql en condiciones! Muchas gracias por la info.
Me alegra que te haya resultado útil..
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
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.
- Fatal: LoadModule: error loading module ‘mod_sql_mysql.c’: Permission denied on line 35 of ‘/etc/proftpd/modules.conf’
sando esse erro
Hola
Muy buen post, funciona perfecto y todo está masticadito. Lo felicito…
¿Cómo para hacer un ftp mixto com anónimos?