martes, 10 de julio de 2012

Creando un servidor FTP con vsftpd.

 Introducción.

Acerca del protocolo FTP.

FTP (File Transfer Protocol) o Protocolo de Transferencia de Archivos (o archivos informáticos) es uno de los protocolos estándar más utilizados en Internet siendo el más idóneo para la transferencia de grandes bloques de datos a través de redes que soporten TCP/IP. El servicio utiliza los puertos 20, y 21, exclusivamente sobre TCP. El puerto 20 es utilizado para el flujo de datos entre cliente, y servidor. El puerto 21 es utilizando para el envío de órdenes del cliente hacia el servidor. Prácticamente todos los sistemas operativos, y plataformas incluyen soporte para FTP, lo que permite que cualquier computadora conectada a una red basada sobre TCP/IP pueda hacer uso de este servicio a través de un cliente FTP.

Acerca del protocolo FTPS.

FTPS (también referido como FTP/SSL) es la forma de designar diferentes formas a través de las cuales se pueden realizar transferencias seguras de archivos a través de FTP utilizando SSL o TLS. Son mecanismos muy diferentes a los del protocolo SFTP (SSH File Transfer Protocol).

Existen dos diferentes métodos para realizar una conexión SSL/TLS a través de FTP. La primera y más antigua es a través del FTPS Implícito (Implicit FTPS), que consiste en cifrar la sesión completa a través de los puertos 990 (FTPS), y 998 (FTPS Data), sin permitir negociación con el cliente, el cual está obligado a conectarse directamente al servidor FTPS con el inicio de sesión SSL/TLS. El segundo método, que es el recomendado por el RFC 4217, y el utilizado por Vsftpd, es FTPS Explícito (Explicit FTPS o FTPES), donde el cliente realiza la conexión normal a través del puerto 21, y permitiendo negociar, de manera opcional, una conexión TLS.

Acerca de RSA.

RSA, acrónimo de los apellidos de sus autores, Ron Rivest, Adi Shamir, y Len Adleman, es un algoritmo para encriptar claves públicas, el cual fue publicado en 1977, y patentado 1983, en EE.UU., por el Instituto Tecnológico de Michigan (MIT). RSA es utilizado en todo el mundo para los protocolos destinados para el comercio electrónico.

Acerca de OpenSSL.

OpenSSL es una implementación libre, de código abierto, de los protocolos SSL (Secure Sockets Layer o Nivel de Zócalo Seguro), y TLS (Transport Layer Security, o Seguridad para Nivel de Transporte). Está basado sobre el extinto proyecto SSLeay, iniciado por Eric Young, y Tim Hudson, hasta que éstos comenzaron a trabajar para la división de seguridad de EMC Corporation.

Acerca de X.509.

X.509 es un estándar ITU-T (estandarización de Telecomunicaciones de la International Telecommunication Union ) para infraestructura de claves públicas (PKI, o Public Key Infrastructure). Entre otras cosas, establece los estándares para certificados de claves públicas, y un algoritmo, para validación de ruta de certificación. Este último se encarga de verificar que la ruta de un certificado sea válida bajo una infraestructura de clave pública determinada. Es decir, desde el certificado inicial, pasando por certificados intermedios, hasta el certificado de confianza emitido por una Autoridad Certificadora (CA, o Certification Authority).
 

Acerca de vsftpd.

Vsftpd (Very Secure FTP Daemon) es un equipamiento lógico utilizado para implementar servidores de archivos a través del protocolo FTP. Se distingue principalmente porque sus valores predeterminados son muy seguros, y por su sencillez en la configuración, comparado con otras alternativas como ProFTPD, y Wu-ftpd. Actualmente se presume que vsftpd podría ser quizá el servidor FTP más seguro del mundo.

Instalación a través de yum.

Si utiliza CentOS 5 o 6, o bien Red Hat™ Enterprise Linux 5 o 6, ejecute lo siguiente desde una terminal:



yum -y install vsftpd

 Procedimientos.

SELinux, y el servicio vsftpd.

SELinux controla varias funciones de el servicio vsftpd incrementando el nivel de seguridad de éste.

Para permitir que los usuarios anónimos puedan realizar procesos de escritura sobre el sistema de archivos, ejecute el siguiente mandato:



setsebool -P allow_ftpd_anon_write 1

Si se necesita permitir acceder con las cuentas de usuarios locales a sus directorio de inicio de éstos, se debe habilitar la política ftp_home_dir:



setsebool -P ftp_home_dir 1

Para hacer que SELinux permita acceder a los usuarios locales al resto del sistema de archivos, ejecute el siguiente mandato:



setsebool -P allow_ftpd_full_access 1

Para permitir que el servicio vsftpd pueda hacer uso de sistemas de archivos remotos a través de CIFS (Samba) o NFS, y que serán utilizados para compartir a través del servicio, ejecute cualquiera de los siguientes mandatos:



setsebool -P allow_ftpd_use_cifs 1
setsebool -P allow_ftpd_use_nfs 1



Nota.
Lo siguiente sólo aplica para CentOS 5 y Red Hat™ Enterprise Linux 5.
Para eliminar por completo la protección que brinda SELinux al servicio vsftpd, y que éste funcione normalmente sin esta valiosa protección, haciendo que todo lo anteriormente descrito en esta sección pierda sentido, ejecute el siguiente mandato:


setsebool -P ftpd_disable_trans 1
Esta política es inexistente en CentOS 6 y Red Hat™ Enterprise Linux 6.

Archivo /etc/vsftpd/vsftpd.conf.

Utilice un editor de texto, y modifique el archivo /etc/vsftpd/vsftpd.conf.



vim /etc/vsftpd/vsftpd.conf

A continuación analizaremos los parámetros a modificar o añadir, según se requiera para necesidades particulares.

Parámetro anonymous_enable.

Se utiliza para definir si se permitirán los accesos anónimos al servidor. Establezca como valor YES o NO de acuerdo a lo que se requiera.


anonymous_enable=YES

Parámetro local_enable.

Establece si se van a permitir los accesos autenticados de los usuarios locales del sistema. Establezca como valor YES o NO de acuerdo a lo que se requiera.



local_enable=YES

Parámetro write_enable.

Establece si se permite el mandato write (escritura) en el servidor. Establezca como valor YES o NO de acuerdo a lo que se requiera.



write_enable=YES

Parámetros anon_upload_enable y anon_mkdir_write_enable

El parámetro anon_upload_enable específica si los usuarios anónimos tendrán permitido subir contenido al servidor. Por lo general no es una función deseada, por lo que se acostumbra desactivar ésta.



anon_upload_enable=NO

El parámetro anon_mkdir_write_enable específica si los usuarios anónimos tendrán permitido crear directorios en el servidor. Al igual que la anterior, por lo general no es una función deseada, por lo que se acostumbra desactivar ésta.



anon_mkdir_write_enable=NO

Si se desea que los usuarios anónimos puedan subir archivos al servidor FTP, se deben dejar estos dos parámetros con valor YES, guardar el archivo /etc/vsftpd/vsftpd.conf y regresar al intérprete de mandatos para crear un directorio denominado /var/ftp/incoming, el cual debe pertenecer al usuario y grupo ftp.



mkdir /var/ftp/incoming
chown ftp:ftp /var/ftp/incoming

Se recomienda que /var/ftp/incoming esté asignado como una partición independiente al resto del sistema, o bien se le aplique cuota de disco al usuario ftp, porque de otro modo cualquiera podría fácilmente saturar el espacio de disco disponible, desencadenando una denegación de servicio en el servidor.

Parámetro ftpd_banner.

Este parámetro sirve para establecer el banderín de bienvenida que será mostrado cada vez que un usuario acceda al servidor. Puede establecerse cualquier frase breve que considere conveniente, pero sin signos de puntuación.



ftpd_banner=Bienvenido al servidor FTP de nuestra empresa

Estableciendo jaulas para los usuarios: parámetros chroot_local_user, y chroot_list_file.

De modo predeterminado los usuarios del sistema que se autentiquen tendrán acceso a otros directorios del sistema fuera de su directorio personal. Si se desea limitar a los usuarios a sólo poder utilizar su propio directorio personal, puede hacerse fácilmente con el parámetro chroot_local_user que habilitará la función de chroot(), y los parámetros chroot_list_enable, y chroot_list_file, para establecer el archivo con la lista de usuarios que quedarán excluidos de la función chroot().



chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

Con lo anterior, cada vez que un usuario local se autentique en el servidor FTP, sólo tendrá acceso a su propio directorio personal, y lo que éste contenga. Por favor, recuerde crear el archivo /etc/vsftpd/chroot_list, ya que de otro modo será imposible que funcione correctamente el servicio vsftpd.



touch /etc/vsftpd/chroot_list

Control del ancho de banda.

Parámetro anon_max_rate.

Se utiliza para limitar la tasa de transferencia, en bytes por segundo, para los usuarios anónimos, algo sumamente útil en servidores FTP de acceso público. En el siguiente ejemplo se limita la tasa de transferencia a 500 Kb por segundo para los usuarios anónimos:



anon_max_rate=524288

Parámetro local_max_rate.

Hace lo mismo que anon_max_rate, pero aplica para usuarios locales del servidor. En el siguiente ejemplo se limita la tasa de transferencia a 1 MB por segundo para los usuarios locales:


local_max_rate=1048576

Parámetro max_clients.

Establece el número máximo de clientes que podrán acceder simultáneamente hacia el servidor FTP. En el siguiente ejemplo se limitará el acceso a 20 clientes simultáneos.



max_clients=20

Parámetro max_per_ip.

Establece el número máximo de conexiones que se pueden realizar desde una misma dirección IP. Tome en cuenta que algunas redes acceden a través de un servidor intermediario (Proxy) o puerta de enlace, y debido a ésto podrían quedar bloqueados innecesariamente algunos accesos. En el siguiente ejemplo se limita el número de conexiones por IP simultáneas a un máximo de 10.


max_per_ip=10

Soporte SSL/TLS para VFSTPD.

Siendo que todos los datos enviados a través del protocolo FTP se hacen en texto simple (incluyendo nombres de usuario y claves de acceso), hoy en día es muy peligroso operar un servidor FTP sin SSL/TLS.

VSFTPD puede ser configurado fácilmente para utilizar los protocolos SSL (Secure Sockets Layer, o Nivel de Zócalo Seguro), y TLS (Transport Layer Security, o Seguridad para Nivel de Transporte) a través de un certificado RSA.
Acceda al sistema como el usuario root.
Acceda al directorio /etc/pki/tls/.



cd /etc/pki/tls/

El certificado se puede generar fácilmente utilizando el siguiente mandato, donde se generará un certificado con estructura X.509, algoritmo de ciframiento RSA de 1024 kb, sin Triple DES, el cual permita iniciar normalmente, sin interacción alguna, al servicio vsftpd, con una validez por 730 días (dos años) en el archivo /etc/pki/tls/certs/vsftpd.crt. Por favor, ejecute, desde la terminal, el siguiente mandato:



openssl req -x509 -nodes -days 730 -newkey rsa:1024 \
    -keyout private/vsftpd.key \
    -out certs/vsftpd.crt

Lo anterior solicitará se ingresen los siguientes datos:
  • Código de dos letras para el país.
  • Estado o provincia.
  • Ciudad.
  • Nombre de la empresa, o bien la razón social.
  • Unidad o sección responsable del certificado.
  • Nombre del anfitrión (FQDN), o bien dominio con comodín.
  • Dirección de correo electrónico de la persona responsable del certificado.
La salida devuelta sería similar a la siguiente:



You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or
a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

-----
Country Name (2 letter code) [GB]:MX
State or Province Name (full name) [Berkshire]:Distrito Federal
Locality Name (eg, city) [Newbury]:Mexico
Organization Name (eg, company) [My Company Ltd]:Empresa, S.A. de C.V.
Organizational Unit Name (eg, section) []:Direccion Comercial
Common Name (eg, your name or your server's hostname) []:*.dominio.org
Email Address []:webmaster@dominio.org

El archivo del certificado (vsftpd.crt), y el de la firma digital (vsftpd.key), deben tener permisos de sólo lectura para el usuario root.



chmod 400 certs/vsftpd.crt private/vsftpd.key

Regrese al directorio de inicio del usuario root.



cd

Edite el archivo /etc/vsftpd/vsftpd.conf:



vim /etc/vsftpd/vsftpd.conf

Añada al final de este archivo, todo el siguiente contenido:



# Especificar cualquier rango arbitrario, y estrecho, de puertos para 
# conexiones pasivas.
pasv_min_port=30300
pasv_max_port=30309
# Habilita el soporte de TLS/SSL
ssl_enable=YES
# Deshabilita o habilita utilizar TLS/SSL con usuarios anónimos
allow_anon_ssl=NO
# Obliga a utilizar TLS/SSL para todas las operaciones, es decir, 
# transferencia de datos, y autenticación de usuarios locales.
# Establecer el valor NO, hace que sea opcional utilizar TLS/SSL.
force_local_data_ssl=YES
force_local_logins_ssl=YES
# Se prefiere TLSv1 sobre SSLv2, y SSLv3
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# Rutas del certificado, y firma digital
rsa_cert_file=/etc/pki/tls/certs/vsftpd.crt
rsa_private_key_file=/etc/pki/tls/private/vsftpd.key
# Los desarrolladores de FileZilla decidieron con la versión 3.5.3 que
# eliminarían el soporte para el algoritmo de cifrado 3DES-CBC-SHA, 
# con el argumento de que este algoritmo es una de los más lentos. 
# Sin embargo con ésto rompieron compatibilidad con miles de 
# servidores FTP que utilizan FTPES. La solución temporal, mientras
# los desarrolladores de FileZilla razonan lo absurdo de su 
# decisión, es utilizar la siguiente opción:
ssl_ciphers=HIGH

Clientes recomendados para acceder a FTPES.

Entre los clientes recomendados para acceder a través de FTPES, está LFTP (compilado con la opción --with-openssl, y ejecutando con las opciones -e 'set ftp:ssl-force true' -e 'set ssl:verify-certificate no'). Ejemplo, asumiendo que se iniciará una conexión hacia el anfitrión 192.168.70.105:



lftp -e 'set ftp:ssl-force true' \
    -e 'set ssl:verify-certificate no' 192.168.70.105

Filezilla 3.3.x (configurar conexión como FTPES - FTP sobre TLS/SSL explícito), y WinSCP. Al momento de redactar este documento, las versiones mas recientes de clientes como FireFTP o gFTP, tienen roto el soporte para FTP sobre TLS/SSL (FTPS, y FTPES), por lo que por el momento es preferible evitarlos.

Si utiliza Filezilla, evite utilizar la versión 3.5.3, pues debido a una absurda decisión de sus desarrolladores, a ésta le fue eliminado el soporte para el algoritmo de cifrado SSL 3DES-CBC-SHA, rompiendo la compatibilidad con miles de servidores FTP que utilizan FTPES. La solución parcial a este problema es añadir la opción ssl_ciphers=HIGH en el archivo /etc/vsftpd/vsftpd.conf. La versión 3.5.2 funciona perfectamente, como ocurre con el resto de los clientes con soporte para FTPES. Filezilla dispone de versiones para GNU/Linux, Mac OS X, y Windows XP/Vista/7. La siguiente imagen ilustra la configuración que se requiere utilizar.
Configuración de cuenta FTPES en Filezilla.
Configuración de cuenta FTPES en Filezilla.

Luego de iniciada la conexión, la primera vez que Filezilla se conecte al servidor, mostrará una ventana con la información del certificado, y solicitará se acepte éste. Active la casilla que dice «Siempre confiar en el certificado en futuras sesiones» antes de hacer clic en el botón de «Aceptar.»
Dialogo de certificado de FTPES en Filezilla.
Dialogo de certificado de FTPES en Filezilla.

Iniciar, detener, y reiniciar el servicio vsftpd.

Para iniciar por primera vez el servicio vsftpd, ejecute el siguiente mandato:



service vsftpd start

Para reiniciar el servicio vsftpd, o bien hacer que los cambios hechos a la configuración surtan efecto, ejecute el siguiente mandato:



service vsftpd restart

Para detener el servicio vsftpd, ejecute el siguiente mandato:



service vsftpd stop

Agregar el servicio vsftpd al arranque del sistema.

Para hacer que el servicio de vsftpd esté activo con el siguiente inicio del sistema, en todos los niveles de ejecución (2, 3, 4, y 5), se utiliza lo siguiente:



chkconfig vsftpd on

Modificaciones necesarias en el muro cortafuegos.

Si se utiliza un cortafuegos con políticas estrictas, como por ejemplo Shorewall, es necesario abrir los puerto 20, y 21, por TCP (FTP-DATA, y FTP, respectivamente).
Si utiliza Shorewall, edite el archivo /etc/shorewall/rules:



vim /etc/shorewall/rules

Las reglas corresponderían a algo similar a lo siguiente, considerando que se abre el acceso para FTP, sin TLS/SSL, desde cualquier zona del muro cortafuegos:



#ACTION SOURCE DEST PROTO  DEST  SOURCE
#    PORT  PORT(S)1
ACCEPT all fw tcp 20,21
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Sí se va a utilizar FTPES, el muro cortafuegos debe estar abierto para todos los puertos especificados en el rango entre el valor del parámetro pasv_min_port, y el valor del parámetro pasv_max_port, establecidos en el archivo /etc/vsftpd/vsftpd.conf, debido a que la implementación de TLS/SSL Explícito de VSFTPD utiliza puertos aleatorios en dicho rango para realizar conexiones pasivas. Si, por ejemplo, eligió utilizar el rango de puertos del 30300 al 30309, establezca lo siguiente.



#ACTION SOURCE DEST PROTO  DEST  SOURCE
#    PORT  PORT(S)1
ACCEPT all fw tcp 20,21,30300:30309
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Al terminar de configurar las reglas para Shorewall, reinicie el muro cortafuegos, ejecutando el siguiente mandato:
service shorewall restart.

Autor: Joel Barrios Dueñas
Sitio de Red: http://www.alcancelibre.org/
 
Angel J. Reynoso
kp01
Cel.: 829-709-4870
areynoso@gts.com.do
http://www.gts.com.do
  
 

No hay comentarios:

Publicar un comentario