Herramientas de usuario

Herramientas del sitio


bloque2:ftp

Sistemas de Transferencia de Archivos y Conexión Remota

SSH

SSH es un protocolo seguro que nos permite conectarnos, loguearnos y administrar desde linea de comandos un sistema remoto. Funciona bajo un arquitectura cliente servidor, de modo que necesitamos habilitar un servidor SSH en el sistema que queremos administrar para que no permita conectarnos desde un cliente.

Se diseño inicialmente para sistemas basados en Unix, como reemplazo del protocolo Telnet por su falta de seguridad. Se utiliza generalmente para trabajar en sistemas remotos a través de una interfaz de linea de comandos y ejecutar instrucciones. También es utilizado por algunos protocolos de transferencia de archivos como SFTP o SCP.

Por defecto SSH utiliza el puerto 22, usa una encriptación de clave pública y la implementación más extendida es OpenSSH.

Los clientes más habituales para conectarnos mediante SSH:

  • Terminal de Windows o Linux
  • PowerShell de Windows
  • Putty para Windows

Para instalar un servidor SSH en nuestro sistema linux:

$ apt-get install openssh-server

Al instalar el servicio SSH, también se instalará un servicio de transferencia de archivos conocido como SSH FTP ó SFTP, y que funciona sobre el servicio SSH. Este servicio de transferencia funciona en el puerto 22, y no debemos confundirlo con el servicio FTP.

Para desinstalar:

$ apt-get purge openssh-server

El archivo de configuración de SSH se encuentra en: /etc/ssh/sshd_config. Si queremos utilizar otro puerto para conexiones al servidor modificaremos ese fichero:

# Descomentaremos la siguiente linea e indicaremos el puerto deseado
# Port 22
 
# Despues reiniciamos el servicio
$ systemctl restart sshd

Para conectarnos desde un cliente SSH:

# Conexión al puerto estandar 22
ssh usuario@ip_servidor
# Para conexiones en otros puertos
ssh -p puerto usuario@ip_servidor

FTP

Es un protocolo usado para la transferencia de ficheros entre un cliente y un servidor a través de una red. Utiliza dos conexiones diferentes: una para los datos y otra para los comandos. Los usuarios se puede conectar mediante un usuario y una contraseña. Es un protocolo muy antiguo, ya que se diseñó en 1971. En aquel momento las implicaciones de seguridad eran bastante distintas a las actuales, por lo que se ha mejorado con algunas implementaciones siendo lo más habitual utilizarlo junto al protocolo SSL/TLS.

Funcionamiento

Como hemos comentado, FTP utiliza dos conexiones para trabajar mantenidas en dos puertos diferentes, que inicialmente eran el 20 y el 21.

El cliente FTP se conecta por el puerto 21 al servidor FTP y se establece una Conexión de Control. Mediante esta conexión se envían diferentes señales: órdenes del cliente al servidor y respuestas por parte de éste. Estas órdenes FTP especifican parámetros para la conexión de datos (puerto de datos, modo de transferencia, etc.), para gestión de la estructura de archivos o subida o descarga de los mismos.

El Proceso de Transferencia de Datos debe esperar a que el servidor inicie la conexión al puerto de datos especificado (puerto 20 en modo activo o estándar) y transferir los datos en función de los parámetros que se hayan especificado.

Implicación en el despliegue Web

Para desplegar una aplicación web es necesario subir una cantidad de ficheros a nuestro servidor. Aunque existan paneles de control instalables en nuestros servidores que nos permiten realizar operaciones de transferencia de archivos desde nuestro navegador web, utilizar servicios de transferencia nos facilita la tarea de copia de grandes cantidades de archivos al mismo tiempo.

Además nos permiten hacer un control de seguridad limitando el espacio máximo permitido de uso, el control de usuarios, escriptar las transmisiones de datos, etc.

En caso de que trabajemos con un servidor virtual privado (VPS), que es la forma más habitual de contratar un servidor profesional, además necesitaremos de una forma de gestión remota que sea segura. Ahí es dónde entra en funcionamiento el protocolo SSH.

Acceso al servicio

Modos de conexión cliente

Modo Activo

Es el modo predeterminado para las conexiones FTP, de hecho fue el primero en desarrollarse. En este modo el servidor utilizará el puerto 20 para la transferencia de datos, mientras que transmitirá los comandos utilizando el puerto 21. El cliente en cambio utilizará un puerto aleatorio P superior al 1023 para la transferencia de comandos, y un puerto P+1 para la transferencia de datos.

  1. El cliente FTP comienza la conexión desde un puerto de control aleatorio P con destino al puerto 21 del servidor. Como hemos mencionado el puerto P será superior a 1023.
  2. El servidor responde desde el puerto de control.
  3. El servidor inicia entonces la conexión del canal de datos: puerto 20 para el servidor y puerto P+1 para el cliente.
  4. El cliente responde desde el puerto de datos estableciendo así la conexión.

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.

Esta última conexión es iniciada por el servidor en el puerto previamente negociado, y en ocasiones es bloqueada por el firewall del cliente al ser identificada como un intento de conexión externa no autorizada. Lo normal es que los cortafuegos del cliente rechacen estas conexiones aleatorias.

Modo Pasivo

El modo de FTP pasivo surge como consecuencia de los problemas de conexión del modo activo. Este modo mantiene los dos canales (control y datos) pero en este caso es el cliente el encargado de establecer las dos conexiones.

La secuencia de conexión del modo pasivo es la que sigue a continuación:

  1. El cliente FTP comienza la conexión dese un puerto de control aleatorio P con destino al puerto 21 del servidor.
  2. El servidor responde desde el puerto de control.
  3. El cliente inicia la conexión del canal de datos dese el puerto P+1 hacia el puerto Q del servidor.
  4. El servidor responde desde el puerto de datos estableciendo así la conexión.

Cuotas de disco

Las cuotas de disco permiten a los administradores controlar y limitar la cantidad de espacio en disco que usan los usuarios en los sistemas de archivos de servidores y estaciones de trabajo.

En el marco del alojamiento web, las cuotas de disco tienen una importancia fundamental para la administración del espacio en el servidor. El establecimiento de límites permite distribuir el espacio del disco duro entre los usuarios que comparten un sistema de hardware. Si un usuario sobrepasa el espacio que le fue asignado, se le informa de que ha infringido la cuota.

Usuarios

Existen dos tipos de usuarios:

  • Usuarios anónimos: usuarios que tienen acceso y permisos limitados por el sistema de archivos. Al conectarse al servidor FTP sólo deben introducir una contraseña simbólica, por ejemplo, cualquier dirección de correo. Es habitual desactivar el acceso de usuarios anónimos por motivos de seguridad.
  • Usuarios del sistema: aquellos que disponen de una cuenta en la máquina que ofrece el servicio FTP. Al conectarse al servidor FTP deben introducir su contraseña de sistema.
  • Usuarios virtuales: Este tipos de usuarios solo son permitidos por algunos tipos de servidores FTP. Son usuarios controlados (dados de alta en el servidor) pero que no pertenecen al sistema. Se emplean para separar el uso del servicio FTP del uso del sistema operativo.

Métodos de transferencia

FTP permite dos modos de transferencia de archivos que son relevantes dependiendo del tipo de información que deseamos transmitir.

  • Modo Binario: Se debe usar para transferir cualquier archivo binario: Archivos comprimidos, imágenes, videos, sonidos, documentos, etc. Se descomponen en bytes y se transfieres creando una copia exacta a nivel de bytes del archivo original.
  • Modo ASCII: El modo ASCII se recomienda cuando se quiere transferir ficheros de texto. Debido a que los distintos sistemas operativos Linux-Windows tienen diferentes formas de formatear los saltos de linea, al utilizar este tipo de transformación el sistema adaptará los ficheros a su formato adecuado.
  • Modo Automático: Dependiendo del cliente FTP que utilicemos a veces se nos permite, una selección automática del tipo de transferencia. Esta selección se basa en las extensiones o tipos de los ficheros.

Los ficheros de texto plano son aquellos que contienen cualquier contenido de caracteres legible, como lo es cualquier fichero de código fuente: .html, .php, .java, .css, etc.

Los archivos binarios son:

  • Imágenes (.jpg, .bmp, .png)
  • Audio (.mp3, .avi, .wma)
  • Video (.flv, .mkv, .mov, .mp4)
  • Archivos (.zip, .rar, .tar)
  • Otros (.exe, .doc, .xls, .pdf)

Protocolos Seguros

FTPS

File Transfer Protocol Over TLS/SSL. FTPS no utiliza SSH y no es nativo de ningún sistema operativo. Es una extensión del protocolo FTP que utiliza TLS/SSL para asegurar las comunicaciones entre hosts. Esto es muy similar a cómo se usa TLS/SSL para proteger el tráfico web básico.

Aunque existen utilidades de línea de comandos para FTPS, los usuarios de Windows lo utilizan más comúnmente a través de un cliente.

SFTP

SSH File Transfer Protocol es un protocolo que aprovecha la seguridad y autenticación proporcionada por SSH. Puede pensar en SFTP como simplemente FTP (Protocolo de transferencia de archivos) que usa un túnel SSH para asegurar las comunicaciones.

SFTP es una utilidad de transferencia de archivos una funcionalidad similar a FTPS. Aunque SFTP y SCP usan SSH para el transporte, ahí es donde terminan las similitudes. Con SFTP se pueden enumerar directorios, cambiar permisos y propietarios, eliminar y renombrar archivos e incluso crear enlaces simbólicos. Esto proporciona toda la funcionalidad de FTP con la seguridad de SSH.

Dado que es un subsistema de SSH, generalmente está disponible en cualquier sistema que tenga SSH.

SCP

Secure Copy Protocol es un protocolo basado en SSH. Proporciona una manera fácil, aunque limitada, de copiar archivos de forma segura de un sistema a otro. SCP se limita a transferir archivos.

No proporciona un método para eliminar, enumerar, renombrar u otras operaciones de archivos similares. Sin embargo, proporciona una utilidad fácil de usar para copiar de forma rápida y segura un archivo de un sistema a otro.

Tipos de Clientes FTP

Clientes con GUI

Son aplicaciones de escritorio que nos permiten conectarnos a servidores de transferencia de forma gráfica. Esto facilita mucho el trabajo ya que podemos utiliasr el ratón, navegar por un arbol de directorios, arrastrar y soltar archivos, etc. La gran mayoría permiten conectarnos utilizando diferentes protocolos: SCP, SFTP, FTPS,…

Cliente Filezilla

Algunos de los más utilizados son:

  • Filezilla: software libre, multiplataforma, gran comunidad de soporte, varios protocolos
  • WinSCP: software libre, sistemas Windows, varios protocolos
  • CyberDuck: Software libre, Windows y Mac, varios protocolos

Linea de comandos

Desde linea de comandos podemos conectarnos también tanto mediante FTP como SFTP:

fer@debian:~$ ftp 192.168.1.34
 
fer@debian:~$ sftp usuario@192.168.1.34
ComandoDescripcion
open [ip] Abre conexión
quit/exit/bye Termina FTP
pwdIndica la ruta del servidor
!pwdIndica la ruta del cliente
ls/dirLista el contenido del directorio del servidor
!ls/!dirLista el contenido del directorio del cliente
mkdirCrea un directorio en el servidor
!mkdirCrea un directorio en el cliente
get [archivo]Descarga el archivo al directorio del cliente
put [archivo]Sube el archivo al directorio de servidor
binaryEstablace modo binario de transferencia
asciiEstablece modo ascii de transferencia
delete [archivo]Elimina el archivo del servidor

Firewall

Tener un Firewall suficientemente configurado es uno de los aspectos más importantes en la seguridad de un sistema. El firewall UFW (Uncomplicated Firewall) es una herramienta que tenemos disponible en las distribuciones Debian o Ubuntu. Tiene una interfaz muy simple para administrar reglas en iptables.

Para instalarlo usaremos apt:

$ apt-get install ufw

Una vez instalado podemos encontrar su fichero de configuración en /etc/default/ufw. Las configuraciones que hagamos funcionarán tanto en ipv4 como en ipv6, asi que podemos buscar esa directiva:

IPV6=yes 

UFW no se activa al instalarse. El firewall por defecto tiene las siguientes configuraciones:

$ ufw default deny incoming
$ ufw default allow outgoing

Estas reglas no es necesario crearlas, ya que vienen de serie. El firewall deniega cualquier conexión entrante, y permite cualquier saliente.

Si estamos trabajando a través de SSH debemos abrir dicho puerto para no quedarnos aislados del servidor:

$ ufw allow ssh
 
# O indicando el puerto del servicio
$ ufw allow 22

Una vez hecho esto, podemos activar el firewall. También podemos desactivarlo si queremos hacer algunas configuraciones:

$ ufw enable
 
$ ufw disable
 
# Para restaurar el estado inicial (elimina todas las reglas y lo desactiva)
$ ufw reset

Las reglas que nosotros creamos en el firewall se almacenan en los ficheros /etc/ufw/user.rules y user6.rules. Para mostrar las reglas que hemos creado, podemos hacerlo de diferentes formas:

# Verificar el estado
$ ufw status
$ ufw status verbose
$ ufw status numbered

Otros ejemplos:

# Permitir servicios o direcciones
$ ufw allow http
$ ufw allow https
 
$ ufw allow from 203.0.113.4
 
# Permitir rangos de puertos
$ ufw allow 6000:6007/tcp
$ ufw allow 6000:6007/udp
 
# Denegar
$ ufw deny http
$ ufw deny from 203.0.113.4

Eliminar Reglas

Si queremos eliminar alguna regla podemos hacerlo del siguiente modo:

$ ufw allow 22
$ ufw allow 443/tcp
$ ufw deny 23/tcp
 
$ ufw delete allow 22
$ ufw delete allow 443/tcp
$ ufw delete deny 23/tcp

Otra forma es listar las reglas de forma numerada y eliminar la que necesite indicando su número:

$ ufw status numbered
 
$ ufw delete [numero]

Configurar servicio FTP

Para trabajar con el servidor FTP debemos abrir los puertos 20 y 21. Si pretendemos utilizar una conexión cifrada también debemos abrir el puerto 990. Y para permitir el modo pasivo debemos abrir un rango de puertos (atendiendo a la cantidad de usuarios que se van a conectar simultaneamente:

# Abrir puertos para FTP y TLS
$ ufw allow 20,21,990/tcp
# Abrir un rango de puertos para modo pasivo
$ ufw allow 40001:40100/tcp

Para trabajar con el servicio FTP over SSH, o SFTP, solo necesitamos el puerto SSH (22) que ya hemos abierto previamente para conectarnos mediante terminal remoto.

Administración de servidor vsFTPd

VeriSecure FTP daemon es un servidor FTP con licencia GPL que se caracteriza por ser muy ligero, rápido y seguro. Es el utilizado por algunas de las principales compañias de Linux como SUSE o RedHat para sus repositorios FTP.

$ apt-get install vsftpd

Una vez instalado permitirá conectarnos sin ningún tipo de cifrado con permisos de solo lectura.

Fichero de configuración

Para configurar el servidor modificaremos el fichero /etc/vsftpd.conf. Tenemos una referencia de sus opciones en https://linux.die.net/man/5/vsftpd.conf.

Cada vez que modifiquemos opciones del servidor debemos reiniciarlo para que los cambios tomen efecto:

$ systemctl restart vsftpd

También es recomendable hacer una copia de seguridad del fichero de configuración para restaurar las modificaciones que hagamos:

$ cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

Las siguientes opciones sirven para permitir las conexiones de usuarios y activar la escritura:

/etc/vsftpd.conf
# Impedir el logueo de usuarios anónimos
anonymous_enable=NO
#
# Permitir a los usuarios del sistema loguearse
local_enable=YES
#
# Permitir a los usuarios escribir, borrar o modificar
# Esto solo se permite en los directorios en los que tenga permisos
write_enable=YES
#
# Permisos por defecto de los ficheros subidos
local_umask=022

Configurar Modo Pasivo

En el fichero de configuración de vsftpd podemos limitar los puertos que pueden ser usados en el modo pasivo. Debemos tener en cuenta que si tenemos un firewall debemos tener abierto este rango de puertos.

/etc/vsftpd.conf
pasv_enable=Yes
#Deben coincidir con los puertos abiertos por el firewall
pasv_min_port=40001
pasv_max_port=40100

Controlar el acceso

Con la configuración anterior permitimos que los usuarios del sistema se puedan loguear con sus credenciales y puedan escribir en los directorios en los que tengan permisos. Pero podrán visualizar todo el sistema de archivos. A continuación se indican diferentes formas de limitar el acceso al sistema de archivos o directamente limitar el acceso al servidor.

Limitar acceso al servicio

Las siguientes opciones permiten crear un fichero con los nombres de los usuarios a los que se quiere permitir o denegar el acceso al servidor FTP:

/etc/vsftpd.conf
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

La opción userlist_deny modifica el comportamiento:

  • YES: Se impide el acceso a los usuarios de la lista /etc/vsftpd.userlist
  • NO: Se concede el acceso solo a los usuarios de la lista /etc/vsftpd.userlist

Directorio por defecto

Mientras no se especifique, los usuarios acceden inicialmente a su directorio personal HOME. Podemos modificar este comportamiento mediante:

/etc/vsftpd.conf
local_root="ruta_deseada"

Como puede interesarnos que cada usuario acceda a una ruta específica diferente para cada uno, podemos usar las siguiente directiva:

/etc/vsftpd.conf
user_sub_token=$USER
# Cada usuario accede a su propio directorio (creado previamente)
local_root=/srv/ftp/$USER

Enjaular usuarios

vsFTPd nos permite limitar el acceso a los usuarios a un directorio concreto sin que puedan salir de él. Esto seconoce como enjaular (chroot). Los usuarios se enjaulan siempre en su directorio raíz indicado en la directiva local_root

/etc/vsftpd.conf
# Descomentando la siguiene directiva activamos el enjaulamiento
chroot_local_user=YES

Al intentar conectarnos al servidor FTP veremos que no se nos permite. Esto ocurre porque no se permite enjaular a un usuario en un directorio sobre el que tiene permisos de escritura.

Para solucionar esto temporalmente en un entorno de pruebas podemos añadir la opcion:

La siguiente directiva nos permite enjaular usuarios en directorios sobre los que tienen permisos de escritura, algo que se desaconseja por motivos de seguridad. En los siguientes puntos se explica cómo hacerlo de forma segura.

/etc/vsftpd.conf
# Usar esta directiva solamente para pruebas (Se desaconseja)
allow_writeable_chroot=YES

Como hemos dicho, la directiva anterior la usaremos para realizar pruebas, pero nunca en una configuración definitiva.Vsftpd Faq.

Enjaular de forma segura

Para enjaular usuarios de forma segura1) en un directorio debemos tener en cuenta que no pueden tener permisos sobre el directorio en el que se enjaulan. Para ello debemos crear un directorio distinto a su directorio personal sobre el que puedan tener permiso de escritura. Podemos crear un directorio concreto para el servicio FTP:

Lo primero es volver a comentar la linea que descomentamos antes, ya que queremos enjaular de forma segura:

/etc/vsftpd.conf
#allow_writeable_chroot=YES

A continuación creamos la configuración de directorios y permisos:

# Creamos el directorio de enjaulamiento
$ mkdir /home/fer/ftp
# Hacemos que no pertenezca a nadie
$ chown nobody:nogroup /home/fer/ftp
# Quitamos los permisos de escritura para todos los usuarios
$ chmod a-w /home/fer/ftp
 
# Creamos un directorio en su interior para transferir archivos
$ mkdir /home/fer/ftp/archivos
# Nos aseguramos que el usuario es el propietario
$ chown fer:fer /home/fer/ftp/archivos

La idea es crear esa estructura de directorios para todos los usuarios que queramos que tengan acceso al servicio FTP. Esta estructura de directorios la podemos utilizar en diferentes contextos. Para un servidor web podemos crear: /var/www/fer/public_html.

Ahora en el fichero de configuración indicamos el enjaulamiento:

/etc/vsftpd.conf
chroot_local_user=YES
 
# Indicamos el directorio de enjaulamiento para todos los usuarios
user_sub_token=$USER
local_root=/home/$USER/ftp

La variable $USER es una variable del sistema que contiene el nombre del usuario actual. De este modo cada usuario, accede a su propia ruta.

Listas de usuarios enjaulados

Al activar la directiva chroot_local_user enjaularemos a todos los usuarios del sistema. Pero podemos indicar a qué usuarios queremos enjaular/liberar indicándolo sus nombres en el fichero vsftpd.chroot_list.

/etc/vsftpd.conf
# Solo se enjaulan los usuarios del fichero
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
 
# Solo están sin enjaular los usuarios del fichero
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

Impedir acceso al shell (terminal)

Otra forma de mantener la seguridad es crear usuarios para el servicio FTP que no tengan acceso a la linea de comandos (shell) de Linux. De este modo no podrán ejecutar comandos mediante SSH. Vamos a hacerlo con el shell nologin.

# Comprobamos que tengamos el shell nologin en el fichero /etc/shells
$ cat /etc/shells
 
# Si no está indicado lo añadimos (puedo hacerlo con el comando o cat, o con un editor)
$ cat >> /etc/shells
/sbin/nologin
 
# Modificamos el shell del usuario
$ usermod -s /sbin/nologin fer

Configuración personalizada de usuarios

La opción user_config_dir permite definir un directorio de configuraciones personalizadas para cada usuario. Si un fichero de ese directorio tiene el nombre de un usuario, se cargara la configuración contenida en él para ese usuario:

/etc/vsftpd.conf
#Indicamos el directorio de configuraciones de usuarios
user_config_dir=/etc/vsftpd
# Creamos un fichero para el usuario "usuario1" e indicamos sus opciones. Con cat o con un editor
$ cat > /etc/vsftpd/usuario1
local_root=/srv/ftp/usuario1
write_enable=NO

Al usuario “usuario1” y sólo a él, se le aplican las directivas incluidas en el fichero, que sobreescribirán a la que puedan encontrarse en el fichero general, incluidas las de enjaulamiento.

Cifrar las transferencias

La información enviada por el protocolo FTP no se encripta al ser enviada, ni siquiera las credenciales de login. Podemos encriptarla mediate SSL/TSL, y para ello comenzaremos por crear un certificado SSL mediante el servicio openSSL que ya tenemos instalado:

Generar certificado

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Donde:

  • req - gestiona la solicitud de certificados X.509 Certificate Signing Request (CSR).
  • x509 - modo X.509 de gestión de datos del certificado.
  • days - duración del certificado.
  • newkey - indica el procesador de claves del certificado.
  • rsa:2048 - procesador de claves RSA genera una clave primavada de 2048 bits.
  • keyout - indica la el archivo de almacenamiento de clave.
  • out - indica el fichero de almacenamiento del certificado.

Podemos ver que tanto el certificado como la clave se almacenarán en el mismo fichero: /etc/ssl/private/vsftpd.pem

Para crear el certificado se nos solicitarán unos datos, que serviran al cliente para identificar el certificado:

Generating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
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) [AU]: ES
State or Province Name (full name) [Some-State]: CyL
Locality Name (eg, city) []: Leon
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Centro Educativo
Organizational Unit Name (eg, section) []: Despliegue
Common Name (e.g. server FQDN or YOUR name) []: despliegueFTP
Email Address []: despliegue@ftp
. . .

Aplicar configuración

Una vez que lo tengamos generado y conozcamos su ubicación debemos comentar las siguientes lineas del fichero de configuración e indicar los valores correctos:

/etc/vsftpd.conf
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
 
. . .
 
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

TLS es más seguro que SSL, por lo que vamos a indicar en el fichero de configuración los detalles SSL añadiendo las siguientes lineas:

/etc/vsftpd.conf
# SSL configuration (TLS v1.2)
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

Y por último, una vez que tenemos habilitado SSL, vamos a forzar su uso siempre que sea posible:

/etc/vsftpd.conf
# Prevent anonymous users from using SSL
allow_anon_ssl=NO
 
# Force all non-anonymous logins to use SSL for data transfer
force_local_data_ssl=YES
 
# Force all non-anonymous logins to use SSL to send passwords
force_local_logins_ssl=YES
 
# Impedir reusar certificados por parte de los clientes
require_ssl_reuse=NO
 
# Usar certificados de al menos 128 bits
ssl_ciphers=HIGH

Cuotas de disco

Las cuotas nos permiten limitar el uso del disco por parte de los usuarios. Son muy útiles combinarlas con los servicios de transferencia de ficheros para evitar un uso descontrolado del espacio del sistema por parte de los usuarios.

$ apt-get install quota

Ahora debemos modificar el fichero /etc/fstab, que contiene las informaciones que conciernen al montaje de las particiones que hay en el sistema.

Añadimos a la 4ª columna las opciones que queremos (usrquota, y/o grpquota)

Debemos añadir en la columna pass de las particiones en las que nos interese gestionar las cuotas las opciones usrquota y/o grpquota en caso de que queramos gestionar la cuotas de usuarios y grupos respectivamente en las particiones indicadas. Separamos las opciones mediante comas ,.

En el ejemplo lo vamos a usar en el directorio personal de los usuarios /home y en el directorio de datos del servidor web /var. Si tan solo tenemos una particion para todo el sistema / lo añadiremos ahí.

Una vez modificado el fichero, aplicamos los cambios volviendo a montar las particiones modificadas:

$ mount -o remount /home /var
 
#Comprobamos los puntos de montaje con mount
$ mount

mount: muestra los puntos de montaje que soportan cuotas y qué tipo de cuotas

Ahora, debemos crear los ficheros que almacenarán las cuotas del directorio /home. Haremos el resto del proceso solo para este directorio. El comando quotacheck verifica los sistemas de archivos que soporten cuotas. Este comando crea, verifica o repara el control de cuotas en los sistemas que lo soporten.

# Crear el fichero de cuotas para el directorio /home
$ quotacheck -ugmv /home

Es conveniente ejecutar quotacheck periódicamente para que verifique inconsistencias y se corrijan a tiempo. Las opciones posibles son:

  • a - all, es decir verifica todos los sistemas de archivos por cuotas.
  • u - user, verifica por soporte de cuotas para usuarios.
  • g - group, verifica por soporte de cuotas para grupos.
  • m - no-remount, evita que el sistema se remonte como de solo lectura.
  • v - verboso, reporta lo que hace conforme progresa, son los mensajes que salen a la terminal.

La opcion a solo es necesaria si tengo cuotas en más de un punto de montaje. En este caso solo tenemos /home.

El resultado es similar al siguiente:

Una vez realizado esto, veré que tengo los ficheros referentes a las cuotas que tenga configuradas (usuario y/o grupo) en el directorio que he habilitado para cuotas. Los ficheros son: aquota.user y aquota.group.

Para arrancar el servicio:

# Arrancar el servicio
$ quotaon -ugv /home
 
# Parar el servicio
$ quotaoff -ugv /home

Una vez que hemos arrancado el servicio ya no hará falta volverlo a hacer. Ahora podemos establecer cuotas para los diferentes usuarios:

# Establecer una cuota para el usuario fer
$ setquota -u fer 10240 20480 100 200 /home
 
# Establecer una cuota de forma interactiva
$ edquota -u fer
 
# Comprobar cuotas de un usuario tamaño en (MB, GB, etc)
$ quota -u -s fer
 
# Comprobar todas las cuotas de usuarios en todas las particiones
$ repquota -a -s
 
# Modificar tiempo de gracia en segundos 
$ setquota -t 86400 86400 /home
 
# Modificar el tiempo de gracia global
$ edquota -t
 
# Modificar el tiempo de gracia global de un usuario
$ edquota -T -u fer

Al establecer cuotas se definen valor a los siguientes parámetros:

  • Bloques: Los bloques son unidades de tamaño de 1 Kb. Establecemos dos niveles:
    • Soft Limit: Límite en el cual el sistema te avisa de que sobrepasas.
    • Hard Limit: Límite que no permite ser sobrepasado.
  • Inodos: Representan la cantidad de archivos permitidos
    • Soft Limit: Límite de aviso.
    • Hard Limit: Límite que no permite ser sobrepasado.

En cuanto al tiempo de gracia, si no se indica nada se ofrecen 7 días desde que se supera el soft limit.

Servicio SSH FTP (SFTP)

El servicio SSH FTP está habilitado en el momento en que tengamos un servidor SSH. Podemos utilizarlo desde un cliente gráfico o desde linea de comandos con los comandos que usamos para el protocolo FTP. Para utilizar este servicio desde un cliente debo indicar que la conexión la realizo al puerto SSH: puerto 22.

Debemos entender que el servicio SFTP se basa en SSH, y es completamente independiente del servicio FTP: no es necesario tener un servidor FTP para usar SFTP.

Aun así, vamos a comentar algúnas opciones que pueden resultar interesantes. El fichero de configuración lo podemos encontrar en /etc/ssh/sshd_config. Siempre es recomendable hacer una copia del fichero de configuración, para poder restaurarla en caso de error.

Si en algún momento no soy capaz de realizar una configuración, puedo desinstalar el servidor ssh:

$ apt-get purge openssh-server

Control de Acceso

Para modificar las configuraciones de los usuarios debemos editar su fichero de configuración /etc/ssh/sshd_config.

Denegar el acceso por SSH

Esta configuración impide el acceso por SSH, por lo que tampoco podremos usar el servicio SSH FTP. Podemos denegar a usuarios concretos, o a todo un grupo:

/etc/ssh/sshd_config
# Denegar a usuarios concretos
DenyUsers    nombre-usuario
# Denegar a un grupo
DenyGroups    nombre-grupo

También puedo indicar a quién concedo el acceso

/etc/ssh/sshd_config
# Permitir a usuarios concretos
AllowUsers    nombre-usuario
# Permitir a usuarios concretos
AllowGroups    nombre-grupo

Permitir solo SFTP

Si queremos que el usuario “user1” solo pueda usar el servicio SFTP, y no se le permita conectarse mediante SSH:

/etc/ssh/sshd_config
Match User user1
ForceCommand internal-sftp
PasswordAuthentication yes

Enjaular usuarios

Del mismo modo que hemos hecho con el servicio FTP, puede ser interesante limitar el acceso al sistema a ciertos usuarios. Para ello podemos crear ciertos usarios que solo puedan utilizar este servicio con unas limitaciones. Para enjaular usuarios, SSH requiere que el directorio de enjaulamiento cumpla unas condiciones:

  • El directorio de enjaulamiento y sus directorios padres debe pertenecer al usuario y al grupo root
  • Ningún otro usuario puede tener permisos de escritura sobre el directorio de enjaulamiento

Para ello podemos crear un directorio para enjaular a todos los usuarios o un directorio diferente para cada usuario.

A continuación crearemos la estructura de directorios necesaria para enjaular a los usuarios user1 y user2:

$ mkdir -p /home/sftp/jaula_user1 /home/sftp/jaula_user2
$ chown root:root /home/sftp/jaula_user1
$ chown root:root /home/sftp/jaula_user2
$ chmod 755 /home/sftp/jaula_user1
$ chmod 755 /home/sftp/jaula_user2

Lo que acabo de hacer es:

  • Crear el directorio sftp en /home, para contener las jaular de los dos usuarios. El propietario debe ser root.
  • Crear los directorios jaula de los 2 usuarios dentro del directorio /home/sftp: jaula_user1 y jaula_user2. Estos directorios también deben pertenecer a root.
  • Asegurar que nadie más que root tiene permisos de escritura sobre los directorios jaulas. Si los hemos creado desde el usuario root, los permisos ya serán correctos.

Ahora ambos directorios de enjaulamiento (jaula_user1, jaula_user2) pertenecen a root y nadie más tiene permisos de escritura. Vamos a crear un directorio para que ambos usuarios puedan transferir ficheros.

$ mkdir /home/sftp/jaula_user1/ficheros /home/sftp/jaula_user2/ficheros
$ chown user1:user1 /home/sftp/jaula_user1/ficheros
$ chown user2:user2 /home/sftp/jaula_user2/ficheros

Lo que acabamos de hacer es:

  • Crear un directorio dentro de la jaula de cada usuario, en el que los usuarios tienen permisos de escritura.

Recordemos: Para que SSH nos permita enjaular a un usuario, no puede tener permisos sobre el directorio jaula (jaula_userX), pero si quiero que pueda subir ficheros, debe tener permisos en algún directorio dentro de la jaula.

Y ahora procedemos a editar el fichero de configuración. Debemos añadir las siguientes directivas por cada usuario que desee enjaular:

/etc/ssh/sshd_config
Match User user1
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /home/sftp/jaula_user1
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
  • ForceCommand internal-sftp: Fuerza al servidor SSH a usar SFTP para este usuario, impidiendo el acceso al terminal de comandos.
  • AllowAgentForwarding no, AllowTcpForwarding no, X11Forwarding no. Desactiva la redirección de puertos, el tunneling, y la redirección X11. La finalidad es limitar el acceso al servidor.

En caso de que tengamos más usuarios, repetiremos ese código para cada usuario dentro del fichero de configuración.

Una vez realizados los cambios, reiniciamos el servicio:

$ systemctl restart sshd

Configuración de grupo

Si preveemos que vamos a tener muchos usuarios para acceder a este servicio podemos crear un grupo de usuarios:

$ addgroup sftpusers
$ adduser user1 sftpusers
$ adduser user2 sftpusers

Ahora editamos el fichero de configuración pero añadiendo solo una sección para el grupo:

/etc/ssh/sshd_config
Match Group sftpusers
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /home/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Prácticas

  • Práctica 2: Configuración de Servicios de Transferencia de Archivos

© 2024 Fernando Valdeón

1)
Tal y como se indica en la documentación de vsFTPd: https://security.appspot.com/vsftpd/FAQ.txt
bloque2/ftp.txt · Última modificación: 2024/09/16 19:03 por 127.0.0.1