Instalación y configuración de un servidor FTP con Pure-FTPD en Slackware (Con usuarios Virtuales). Introducción. Pure-FTPd es un servidor FTP libre (GPL) basado en Troll-FTPd. Fue modificado por Frank Dennis por razones de seguridad y funcionalidad. Los principales objetivos de este servidor FTP son la eficiencia, la seguridad y la facilidad de uso. Está diseñado para ser seguro en su configuración por defecto; no tiene buffer overflows conocidos y es muy sencillo de instalar. Ha sido diseñado para los kernels modernos, y ha sido portado con éxito a Linux, FreeBSD, NetBSD, OpenBSD, BSDi, Solaris, Darwin, Tru64, Irix y HPUX. Entre las características que destacan en Pure-ftpd se encuentran: directorios home enjaulados ( chrood()ed ) y también virtual chroot()ed, dominios virtuales, 'ls' preincluido, sistema anti-warez, puertos configurables para descargas en modo pasivo, protocolo FXP, control de ancho de banda, ratios, autenticación contra LDAP / MySQL, PostgreSQL, archivos fortuna, archivos de registro tipo Apache, modo rápido standalone, reportes de estado en tiempo real txt / HTML / XML, usuarios virtuales, quotas virtuales, separación de privilegios, SSL/TLD y más. Instalación del servidor Pure-FTPD. Para instalar pure-ftpd en Slackware vamos a hacerlo compilando el paquete, pero para ahorrarnos el trabajo vamos a usar un script (SlackBuild) para al mismo tiempo de compilar el paquete vamos a hacer un paquete bien hecho para Slackware, lo primero que haremos es descargar completamente el directorio: http://tuxjm.net/downloads/packages/Slackware-10.0/pure-ftpd/ Entonces entraremos al directorios que hayamos descargado llamado pure-ftpd. y veremos que contiene algunos archivos, uno es el archivo destinfo que contiene el MD5 para comprobar la integridad de las fuentes del archivo pure-ftpd-1.0.20.tar.gz, también esta el script pure-ftpd.SlackBuild, el archivo pure-ftpd.png que es solamente el logo del programa y el archivo slack-desc que contiene la información que se le agregara al paquete. Ahora empezaremos ejecutando el script pure-ftpd.SlackBuild así: # sh +x pure-ftpd.SlackBuild --cleanup Y esperaremos hasta que nos muestre un mensaje similar a este: Moving pure-ftpd-1.0.20-i486-1jm.tgz to /tmp... Package creation complete. Esto indica que el paquete ya fue hecho y procederemos a instalarlo asi: # installpkg /tmp/pure-ftpd-1.0.20-i486-1jm.tgz Ahora ya tienes el programa instalado, puedes ver donde se instalo y su contenido haciendo: $ less /var/log/packages/pure-ftpd-1.0.20-i486-1jm Arrancando el servidor y opciones de configuración. Ahora que ya tenemos instalado el servidor seguiremos con su arranque y veremos las opciones de configuración. Para arrancar el servidor es tan simple como ejecutar el programa "pure-ftpd". # pure-ftpd & *NOTA: Al usar este método la autenticación se hace contra el archivo /etc/passwd , es decir, usando cuentas del sistema, mas adelante veremos que parametro usar para arrancar el servicio con autenticación para usuarios virtuales. Y comprobamos que el proceso fue iniciado asi: # ps auxw | grep pure-ftpd root 12052 0.0 0.6 1856 568 pts/0 S 23:09 0:00 pure-ftpd (SERVER) [SERVER] es el Servidor principal. Si matas este proceso, el servidor terminara por completo despues de la siguiente conexión. Entonces probaremos haciendo una conexión al servidor y veremos esto: $ ftp ftp.dominio.com Connected to ftp.dominio.com. 220---------- Welcome to Pure-FTPd ---------- 220-You are user number 1 of 50 allowed. 220-Local time is now 23:11. Server port: 21. 220 You will be disconnected after 15 minutes of inactivity. Name (ftp.dominio.com:usuario): Y ahora hacemos de nuevo: # ps auxw | grep pure-ftpd Y veremos esta linea extra: root 12060 0.0 0.9 2016 860 pts/0 S 23:11 0:00 pure-ftpd (IDLE) [IDLE] muestra un cliente sin transferencias activas. Para facilidad al hace scripts, el archivo '/var/run/pure-ftpd.pid' es creado y siempre contiene el PID (Process ID, Identificador del proceso) de el proceso de el servidor principal. Como vimos en la parte que muestra al hacer una conexión al servidor, vemos que muestra algo asi: 220-You are user number 1 of 50 allowed. 220-Local time is now 23:11. Server port: 21. 220 You will be disconnected after 15 minutes of inactivity. La primer linea dice que es el usuario numero 1 de 50 permitodos. La segunda linea dice la hora actual y el puerto al que se estableció la conexión. La tercer linea dice que despues de 15 minutos de inactividad la conexión sera cerrada. Estas son algunas de las opciones predeterminadas con las que el servidor fue iniciada. Como hemos visto hasta ahora no usamos ningún archivo de configuración como es usual al iniciar algún servicio de red, Pure-ftpd no usa por default ningún archivo de configuración (aunque es posible con el script pure.config.pl y usando el archivo /etc/pureftpd.conf) las opciones con las que queremos que el servidor sea inicido se pasan como parametros al programa pure-ftpd, algo asi: # pure-ftpd -opción1 -opción2 -opción3 Estas son unas de las opciones mas usuales: -A Chroot para todos los usuarios. No pueden salir del directorio del FTP. -c 10 10 conexiones máximas al FTP. -B Ejecutar en segundo plano. -C 2 Permitir solamente 2 conexiones para una misma IP. -d Verbose log. -E No permitir usuario anonymous. -f ftp Logear a través de syslog. -H No resolver IP. -I 15 Si el usuario está 15 minutos inactivo, es desconectado -L 2000:8 Límite de recursividad. -m 3 Máxima carga por encima de la cual el servidor deja de funcionar. -s Antiwarez. -U 133:022 umask -u 100 minuid -k 90 Se podrá usar como máximo el 90% de la partición. -lpuredb:/etc/pureftpd.pdb Usaremos usuarios virtuales de FTP en vez de cuentas reales del sistema. -S hostname_o_ip,puerto Escuchamos en el puerto especificado de esa IP o Hostname, si el equipo tiene varias IPs. Para ver todas las opciones disponibles ver el archivo README en /usr/doc/pure-ftpd-1.0.20 Usuarios Virtuales en Pure-ftpd. Los usuarios virtuales es un simple mecanismo para almacenar una lista de usuarios con su contraseña, nombre, uid, directorio, etc. Es casi como /etc/passwd. Pero no es /etc/passwd. Es un archivo diferente, solo para FTP. Significa que puedes crear fácilmente cuentas solo para FTP. Además, los archivos de usuarios virtuales pueden almacenar información de quotas, ratios, ancho de banda, etc. Las cuentas de sistema no pueden hacer esto. Miles de cuentas pueden almacenar el mismo usuario de sistema,y pueden ser chrooted y tener su propio directorio HOME. Una recomendación antes de empezar con los usuarios virtuales, es crear un usuario de sistema. Por supuesto, puedes usar una cuenta ya existente como "nobody" (pero no root), aunque es recomendado hacer una cuenta dedicada para este fin. Y ahora crearemos un grupo "ftpgroup" y un usuario "ftpuser". # groupadd ftpgroup # useradd -g ftpgroup -d /dev/null -s /etc ftpuser Entonces, todo el mantenimiento de los usuarios virtuales puede ser hecho con el comando "pure-pw". También puedes editar los archivos a mano si asi lo deseas. Creación de usuarios Virtuales. Para agregar un nuevo usuario, usaremos la siguiente sintaxis: # pure-pw useradd [-f ] -u [-g ] -D/-d [-c ] [-t ] [-T ] [-n ] [-N ] [-q ] [-Q ] [-r [/][,[/]]...] [-R [/][,[/]]...] [-i [/][,[/]]...] [-I [/][,[/]]...] [-y ] [-z -] [-m] Bien creemos el usuario "pruebas", con su directorio home en /home/ftpusers/pruebas. La cuenta de sistema asociada al usuario virtual "pruebas" es "ftpuser". # pure-pw useradd pruebas -u ftpuser -d /home/ftpusers/pruebas Password: Enter it again: Entonces te preguntara la contraseña para el usuario pruebas. Con -d, pruebas sera enjaulado. Si quieres darle acceso a todo el sistema de archivos al usuario, usa -D en lugar de -d. No es necesario crear /home/ftpusers/pruebas si corres pure-ftpd con el parametro -j (--createhome). Con este parametro, el directorio home sera creado automaticamente cuando el usuario inicia sesion por primera vez. Con la opcion "-z" permite al usuario conectarse solo durante un rango de tiempo en el dia. Por ejemplo, con -z 0900-1800, pruebas solo podra conectarse al servidor ftp de 9 am a 18 pm. Alerta: un usuario que se conecto duranto una hora autorizada puede finalizar la sesion aun despues de estos horarios de autorizacion. -r y -R se usan para restringir desde donde se conecta el usuario. Pueden ser seguidas por un simple para IP/MASK (-r 192.168.1.0/24), multiples pares separados por coma (-r 192.168.1.0/24, 10.1.0.0/16, 127.0.0.1/32), una sola IP ( -r 192.168.1.1, 10.1.1.5), nombres de hosts ( -r bla.bla.bla.net, dominio.com), o cualquier combinacion de estas. -y es usado para restringir el numero de conexiones concurrentes que un usuario puede tener al mismo tiempo. '' o 0 siginifica ilimitado. Evita esta opcion en servidores con mucha carga. Mejor usa limites por-ip. Con esto hemos creado el archivo de usuarios virtuales en /etc/pureftpd.passwd el cual contiene algo asi: # cat pureftpd.passwd pruebas:$1$7A8JOUM0$jPo6Qdh/UhV9cgcJUhSZD0:5012:104::/home/ftpusers/pruebas/./:::::::::::: Para que esto surta efecto y el servidor pure-ftpd los considere deberemos ejecutar el comando "pure-pw mkdb": # pure-pw mkdb Y creara el archivo /etc/pureftpd.pdb El cual es un archivo PureDB. este es un archivo igual a pureftpd.passwd, pero en este archivo, las cuentas son indexadas para un acceso mas rapido, aun cuando haya miles de cuentas. Los archivos PureDB son archivos binarios, no trates de verlos o tu terminal pitara como el infierno. Ahora si podremos arrancar el servidor con la opcion para que use los usuarios virtuales leyendo el archivo /etc/pureftpd.pdb, asi: # pure-ftpd -j -lpuredb:/etc/pureftpd.pdb & Cambiando la informacion de los usuarios virtuales. Una vez que el usuario virtual ha sido creado, puedes editar su informacin. Por ejemplo quieres asignari un limite de ancho de banda, cambiar la quota, agregar su nombre completo, actualizar el ratio, etc. El comando "pure-pw usermod" trabaja similar a "pure-pw useradd" excepto que modifica una cuenta ya existente en lugar de crear una nueva. Por ejemplo, necesitas cambiar la quota a pruebas. pruebas debera ser limitado a 2 archivos y solo 10 Megabytes. # pure-pw usermod pruebas -n 2 -N 10 Por supuesto correremos el comando "pure-pw mkdb" para que este cambio tome efecto. y comprobaremos este cambio subiendo unos archivos. Supongamos que ya iniciamos sesion y tenemos dos archivos en nuestro home: ftp> ls 200 PORT command successful 150 Connecting to port 35871 -rw-r--r-- 1 5012 104 0 Jan 2 00:41 archivo.1 -rw-r--r-- 1 5012 104 0 Jan 2 00:41 archivo.2 226-Options: -l 226 2 matches total Y al querer subir un archivo de mas veremos esto: ftp> put archivo.3 local: archivo.3 remote: archivo.3 200 PORT command successful 150 Connecting to port 35872 550-Quota exceeded: archivo.3 won't be saved 550-2 files used (100%) - authorized: 2 files 550 0 Kbytes used (0%) - authorized: 10240 Kb ftp> Ahora comprobaremos el limite de archivo a subir, para esto solo tenemos un archivo y subiremos un archivo.2 con tamaño de 13.0 MB. ftp> ls 200 PORT command successful 150 Connecting to port 35875 -rw-r--r-- 1 5012 104 0 Jan 2 00:41 archivo.1 226-Options: -l 226 1 matches total ftp> put archivo.2 local: archivo.2 remote: archivo.2 200 PORT command successful 150 Connecting to port 35876 550-Quota exceeded: archivo.2 won't be saved 550-1 files used (50%) - authorized: 2 files 550 0 Kbytes used (0%) - authorized: 10240 Kb ftp> Reseteando Atributos a cuentas. Para desabilitar quotas de archivos, usa pure-pw usermod -n '' Para desabilitar quotas de tamaño, usa pure-pw usermod -N '' Para desabilitar ratios, usa pure-pw usermod -q '' -Q '' Para desabilitar limite de ancho de banda (download), usa pure-pw usermod -t '' Para desabilitar limite de ancho de banda (upload), usa pure-pw usermod -T '' Para desabilitar Filtrado por IP, usa pure-pw usermod <-i,-I,-r or -R> '' Para desabilitar restriccion de tiempo, usa pure-pw usermod -z '' Para desabilitar el numero de conexiones concurrentes, usa pure-pw usermod -y '' Eliminando Usuarios. Para eliminar un usuario de la base de datos de pure-ftpd (Archivo PureDB) es tan simple como correr el comando "pure-pw userdel", con esta sintaxis: # pure-pw userdel [-f ] [-m] Por ejemplo borraremos el usuario pruebas: # pure-pw userdel pruebas El contenido del directorio home de este usuario se mantendra, si se desea eliminar sera a mano si asi lo deseas. Cambiando contraseñas de usuarios. Para cambiar la contraseña de un usuario, usa el comando "pure-pw passwd": # pure-pw passwd [-f ] [-m] Por ejemplo: # # pure-pw passwd pruebas2 Password: Enter it again: Mostrando la informacion de las cuentas. Para revisar la informacion acerca de un usuario, leer el archivo /etc/pureftpd.passwd esta bien, pero no es tan facil de leer. Para esto usaremos el comando "pure-pw show" con esta sintaxis: # pure-pw show [-f ] Por ejemplo para ver la informacion del usuario pruebas2: # # pure-pw show pruebas2 Login : pruebas2 Password : $1$Dq8Vn7g0$B/cYZ4TxGSi1vd3Uh5soi1 UID : 5012 (ftpuser) GID : 104 (ftpgroup) Directory : /home/ftpusers/pruebas2/./ Full name : Download bandwidth : 0 Kb (unlimited) Upload bandwidth : 0 Kb (unlimited) Max files : 0 (unlimited) Max size : 0 Mb (unlimited) Ratio : 0:0 (unlimited:unlimited) Allowed local IPs : Denied local IPs : Allowed client IPs : Denied client IPs : Time restrictions : 0000-0000 (unlimited) Max sim sessions : 0 (unlimited) "/./" al final del directorio home significa que el usuario sera enjaulado (chroot()ed). Haciendo efectivo los cambios. Como ya se dijo antes para que los cambios de agregar usuarios, cambiar algun parametro al usuario, eliminar un usuario no seran considerados por pure-ftpd hasta que no se ejecute el comando "pure-pw mkdb". No hay necesidad de reiniciar el servidor pure-ftpd para hacer efectivos los cambios. Si quieres hacer efectivo un cambio automaticamente despues de usar el comando "pure-pw" con alguna opcion y automaticamente correr "pure-pw mkdb" despues. usa la opcion -m, por ejemplo: # pure-pw passwd pruebas2 -m Bien, ahora ya puedes trabajar con tus usuarios virtuales, como hemos visto cuando agregamos un usuario virtual a la DB de pure-ftpd se les asigna un user id (uid) y el group id (gid) se asigna automaticamente ya que el user ftpuser tiene por default el gid ftpgroup, esto es para que le asigne los permsisos a el directorio y asi puede accesarlos. Usuarios virtuales asignados a un usuario de sistema. Si quieres agregar un virtual user que es igual a un usuario de sistema, entonces tendras que asignarle el uid, y gid a ese usuario virtual para que use esos permisos y no tengas problemas de permisos, por ejemplo tenemos el usuario pruebas3, lo vemos en /etc/passwd pruebas3:x:1000:100:,,,:/home/pruebas3:/bin/bash Como vemos aqui el usuario pruebas3 tiene el uid 1000 y el gid 100 entonces tendremos que crear el usuario asi: # pure-pw useradd pruebas3 -u 1000 -g 100 -d /home/pruebas3 Password: Enter it again: Y lo vemos asi: # pure-pw show pruebas3 Login : pruebas3 Password : $1$odpRkxC0$vv6lT1zFWzWzuZ1ND.9b6. UID : 1000 (pruebas3) GID : 100 (users) Directory : /home/pruebas3/./ Full name : Download bandwidth : 0 Kb (unlimited) Upload bandwidth : 0 Kb (unlimited) Max files : 0 (unlimited) Max size : 0 Mb (unlimited) Ratio : 0:0 (unlimited:unlimited) Allowed local IPs : Denied local IPs : Allowed client IPs : Denied client IPs : Time restrictions : 0000-0000 (unlimited) Max sim sessions : 0 (unlimited) Bien con este documento ya se explico como tener un servidor FTP seguro, ahora para que lo afines a tus necesidades recuerda que todas las opciones se las pasas al programa como parametros, para ver un listado con su explicacion ver el archivo: /usr/doc/pure-ftpd-1.0.20/README Algunos de estos parametros los puedes usar por-usuario cuando haces uso de los usuarios virtuales y otros son generales para todo acceso. Si lo deseas puedes usar el script de arranque para el daemon pure-ftpd que lo puedes encontrar en: http://www.tuxjm.net/downloads/packages/Slackware-10.0/pure-ftpd/rc.pure-ftpd copiarlo a /etc/rc.d/ y darle permisos de ejecucion asi: # chmod 755 /etc/rc.d/rc.pure-ftpd y agregar esta entrada a tu archivo /etc/rc.d/rc.M # Start pure-ftpd standalone server. if [ -x /etc/rc.d/rc.pure-ftpd ]; then . /etc/rc.d/rc.pure-ftpd start fi Para más informacion ver la documentacion que acompaña al paquete. Autor: Jorge Armando Medina. email: jmedina@tuxjm.net Sitio Web: http://www.tuxjm.net Visita la pagina del Grupo de Usuarios Linux Tijuana en: http://www.linuxtj.org