Páginas

sábado, 10 de marzo de 2018

Instalación y configuración de vsftpd

vsftpd servidor en Centos 6.9

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.

Modo activo

En modo Activo, el servidor siempre crea el canal de datos en su puerto 20, mientras que en el lado del cliente el canal de datos se asocia a un puerto aleatorio mayor que el 1024. Para ello, el cliente manda un comando PORT al servidor por el canal de control indicándole ese número de puerto, de manera que el servidor pueda abrirle una conexión de datos por donde se transferirán los archivos y los listados, en el puerto especificado.

Lo anterior tiene un grave problema de seguridad, y es que la máquina cliente debe estar dispuesta a aceptar cualquier conexión de entrada en un puerto superior al 1024, con los problemas que ello implica si tenemos el equipo conectado a una red insegura como Internet. De hecho, los cortafuegos que se instalen en el equipo para evitar ataques seguramente rechazarán esas conexiones aleatorias. Para solucionar esto se desarrolló el modo pasivo.

Modo pasivo

Fue creado como una alternativa al problema que representa el modo activo. A diferencia de éste último, el modo pasivo envía un mandato PASV en lugar del mandato PORT
a través del puerto de control del servidor. Éste devuelve como respuesta el número de puerto a través del cual debe conectarse el cliente para hacer la
transferencia de datos. El servidor puede elegir al azar cualquier puerto entre 1024 y 65535 o bien el rango de puertos determinado por el administrador del sistema. En el caso de Vsftpd, se puede definir un rango arbitrario de puertos para conexiones pasivas utilizando las opciones pasv_min_port y pasv_max_port. Éste es el método recomendado para servidores de acceso público.

Protocolo FTPS (FTP/SSL)

FTPS es la forma de designar diferentes maneras a través de las que se pueden realizar transferencias seguras de archivos mediante FTP utilizando SSL o TLS.

Aunque existen dos métodos para realizar una conexión SSL/TLS a través de FTP el utilizado por vsftpd es FTPS Explícito (FTPES), donde el cliente realiza la conexión normal por medio del puerto 21 y permitiendo negociar, de manera opciona, una conexión TLS.

RSA

RSA, acrónimo de los apellidos de sus autores, creado por Ron Rivest, Adi Shamir y Len Adleman, es un algoritmo para cifrar claves públicas Publicado por el MIT en 1977 y utilizado en todo el mundo para los protocolos destinados al comercio electrónico.

OpenSSL

Es una implementación libre de los protocoles SSL, (Secure Sockets Layer) y TLS (Transport Layer Security), continuación del proyecto SSLeay, iniciado por Eric Young y Tim Hudson.

Acerca de X.509

X.509 es un estándar ITU-T para infraestructura de claves públicas (PKI). Entre otras, establece los estándares para certificados de claves públicas y un algoritmo para validación de ruta de certificación.

vsftpd

vsftpd (Very Secure FTP Daemon) es utlizado para implementar servidores de archivos a través del protocolo FTP. Es sencillo y seguro.

Instalación de vsftpd

# yum -y install vsftpd

Configuración

/etc/vsftpd/chroot_list es el archivo que define la lista de usuarios a enajaular o no, (depende de la configuración).

Crear el archivo

# touch /etc/vsftpd/chroot_list


Iniciar el servicio

# service vsftpd start

Activar el servicio al arranque del sistema

# chkconfig vsftpd on


Abrir los puerto 20 y 21 (TCP). El primero FTP-DATA y el segundo FTP y el rango de puertos para conexiones pasivas que se defina.

Agregar las reglas de iptables

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 30300:30309 -j ACCEPT

# servicce iptables save

O agregue al archivo /etc/sysconfig/iptables lo siguiente

-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 30300:30309 -j ACCEPT

# service iptables restart

SELinux y el servicio vsftpd

Obtenga la lista de valores (booleanos) actuales de SELinux para ftp

# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off


Para establecer un valor específico por ejemplo, ftp_home_dir, teclee

# setsebool -P ftp_home_dir on

SELinux aumenta el nivel de seguridad de vsftpd

Ejecute lo siguiente para permitir que el servidor FTP pueda asociarse a cualquier puerto sin reservar al funcionar en modo pasivo:

# setsebool -P ftpd_use_passive_mode 1

Ejecute lo siguiente para permitir que los usuarios anónimos puedan realizar procesos de escritura sobre el sistema de archivos:

# setsebool -P allow_ftpd_anon_write 1

Si se necesita permitir el acceso utilizando las cuentas de usuarios del anfitrión local, a fin de que éstos puedan acceder a sus directorio de inicio, se debe habilitar la política ftp_home_dir

# setsebool -P ftp_home_dir 1

Ejecute lo siguiente para hacer que SELinux permita acceder a los usuarios locales al resto del sistema de archivos:

# setsebool -P allow_ftpd_full_access 1

Ejecute lo siguiente 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

setsebool -P allow_ftpd_use_cifs 1
setsebool -P allow_ftpd_use_nfs 1


# getsebool -a | grep ftp

allow_ftpd_anon_write --> on
allow_ftpd_full_access --> on
allow_ftpd_use_cifs --> on
allow_ftpd_use_nfs --> off
ftp_home_dir --> on
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> on
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off


Archivo de configuración de vsftpd.

Opción anonymous_enable

Define si se permitirán accesos anónimos al servidor.

anonymous_enable=YES

Opcion local_enable

Establece si se permiten accesos autenticados de los usuarios locales del sistema

local_enable=YES

Opción write_enable

Permite escritura en el servidor

write_enable=YES

Opción anon_upload_enable

Determina si los usuarios anónimos pueden subir contenido al servidor. No es una función deseada, por lo que se acostumbra a desactivarla.

Opción anon_upload_enable=NO


Opción anon_mkdir_write_enable

Igual que la anterior normalmente esta función no es deseada por lo que se desactiva

anon_mkdir_write_enable=NO

Opción ftpd_banner

Establece el banderín que será mostrado al acceder un usuario al servidor. La frase no debe contener signos de puntuación.

ftpd_banner=Bienvenido al servidor FTP

Establecer jaulas para los usuarios

Opciones chroot_local_user y chroot_list_file

Los usuarios del sistema que se autentiquen tendrán acceso a otros directorios del sistema fuera de su directorio personal. Para limitar a los usuarios a sólo utilizar su propio directorio, puede hacerse con la opción chroot_local_user que habilita la función chroot() y las opciones 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

Crear el archivo /etc/vsftpd/chroot_list si aún no lo ha hecho

# touch /etc/vsftpd/chroot_list

A partir de ahora cada vez que un usuario local se autentique en el servidor FTP sólo tendrá acceso a su directorio personal y lo que este contenga.

Si el usuario regular tiene acceso al intérprete de comandos del sistema (/bin/bash o /bin/sh) y privilegios de escritura sobre el directorio raíz de su propia jaula (su directorio de inicio) la función chroot() puede ser peligrosa. Los directorios de inicio de los usuarios involucrados deben tener permiso 755, propiedad de root y asignar al usuario /bin/false o /sbin/nologin como intérprete de comandos.

Modificar una cuenta de usuario regular para la cual se quiere dar acceso al servidor FTP utilizando chroot() con vsftpd

# chroot 755 /home/fulano
# chown root:root /home/fulano
# mkdir /home/fulano/uploads
# chown fulano:fulano /home/fulano/uploads
# usermod -s /sbin/nologin fulano

Opciones pasv_min_port y pasv_max_port

Establece el rango arbitrario de puertos utilizados para las conexiones pasivas. Cualquier rango de puertos es válido entre 1024 y 65535

pasv_min_port=30300
pasv_max_port=30309

Controlar el ancho de banda

Opción anon_max_rate

Utilizada para limitar la tasa de transferencia en bytes por segundo, para los usuarios anónimos, muy útil en servidores FTP de acceso público. En este caso 500 kb por segundo.

anon_max_rate=524288

Opción local_max_rate

Limita la tasa de transferencia en bytes por segundo para los usuarios locales del servidor. En este caso a 1 MB

local_max_rate=1048576

Opción max_clients

Establece el número máximo de clientes accediendo simultáneamente al servidor FTP. En este caso 20

max_clients=20

Opción max_per_ip

Evita que algunos accesos queden bloqueados, como en el caso de redes que acceden a través de un Proxy (servidor intermediario) o puerta de enlace.

max_per_ip=10

Soporte SSL/TLS  

Todos los datos enviados mediante el protocolo FTP lo hacen en texto simple (nombre de usuario y claves de acceso), lo cual es muy peligroso, vsftpd se puede configurar para utilizar los protocolos SSL y TLS a través de un certificado RSA.

Como usuario root acceda al directorio /etc/pki/tls

# cd /etc/pki/tls

Generar el certificado y firma digital

Utilizando una estructura X.509, algoritmo de cifrado RSA de 2048 bits, sin Triple DES que permite iniciar sin interacción alguna al servicio vsftpd, con una validez de 1825 días (5 años):


# openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \
> -keyout private/vsftpd.key \
> -out certs/vsftpd.crt

Ingrese 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


Generating a 2048 bit RSA private key

....+++

...........+++

writing new private key to 'private/vsftpd.key'

-----

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) [XX]:ES
State or Province Name (full name) []:Catalunya
Locality Name (eg, city) [Default City]:Barcelona
Organization Name (eg, company) [Default Company Ltd]:Empresa S.L. 
Organizational Unit Name (eg, section) []:Direccion Comercial
Common Name (eg, your name or your server's hostname) []:*.linux.bcn
Email Address []:webmaster@linux.bcn


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

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

# cd

Edite el archivo de configuración de vsftpd.conf

# vim /etc/vsftpd/vsftpd.conf

# 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 eliminar 
# el soporte para el algoritmo de cifrado 3DES-CBC-SHA, 
# agregue la siguiente línea para solucionarlo
ssl_ciphers=HIGH
# Filezilla además requiere desactivar la siguiente opción
require_ssl_reuse=NO

Aplicar los cambios

# service vsftpd restart
# service vsftpd restart
Apagando vsftpd:   [  OK  ]
Iniciando vsftpd para vsftpd: [  OK  ]

Asigne una contraseña al usuario fulano

$ ssh 192.168.0.1
carles@192.168.0.1's password: 
Last login: Fri Mar  9 19:52:01 2018 from 192.168.0.53

# passwd fulano

Cambiando la contraseña del usuario fulano.
Nueva contraseña: 
Vuelva a escribir la nueva contraseña: 
passwd: todos los tokens de autenticación se actualizaron exitosamente.

Cliente para acceder a FTPES

# yum -y install lftp

El mandato lftp con las opciones -e 'set ftp:ssl-force true' y -e set ssl:verify-certificate no' como argumentos y un nombre anfitrión o dirección IP como último argumento. Inicie una conexión hacia la dirección del servidor 192.168.0.1.

[carles@aldos ~]$ lftp -e 'set ftp:ssl-force true' -e 'set ssl:verify-certificate no' 192.168.0.1

En el intérprete de comandos de LFTP teclee el comando user seguido del nombre de usuario que quiera utilizar. En este caso fulano, le pedirá la contraseña.

lftp 192.168.0.1:~> user fulano
Clave:

Teclee el comando pwd

lftp fulano@192.168.0.1:~> pwd

Devolverá una salida similar a la siguiente

ftp://fulano@192.168.0.1

Cree una carpeta llamada prueba

lftp fulano@192.168.0.1:~> mkdir prueba

Lo anterior devuelve una salida como esta

mkdir ok, `prueba' creado           

Ejecute un ls

lftp fulano@192.168.0.1:/> ls

La salida es la siguiente

drwxr-xr-x    2 504      504   4096 Mar 09 20:41 prueba

Salir de lftp

lftp fulano@192.168.0.1:/> bye


Filezilla cliente FTP
# yum -y install filezilla


Red Hat System Administrator Guide
Protocolo de transferencia de archivos

Centos es genial!.