Seleccionar página

1. Introducción al ejercicio

En este ejercicio vamos a securizar un servidor desplegado en máquina virtual con Ubuntu Server 18.04.1 LTS sobre el software de virtualización VirtualBox 6.0.4 con una configuración de 4GB de memoria RAM y un disco duro de 30 GB. Esta máquina a su vez tiene la configuración de red en modo Adaptador puente, para que reciba una dirección IP del router de nuestro domicilio.

En este caso los datos del usuario y la máquina son los siguientes:

  • Usuario: cristian
  • Nombre de equipo: mcsi
  • Dirección IP: 192.168.0.84

Si ejecutamos el comando whoami, hostnamectl e ip addr, podremos listar dichos parámetros como se ve en la Ilustración 1.

lustración 1: Datos básicos de la máquina

Para comprobar que la máquina tiene conexión a internet podemos realizar un ping a una dirección como google.com:

Ilustración 2: Comprobación conectividad de red con ping

2. Actualización del sistema

Para poder mantener al día el software y los paquetes del sistema operativo, es necesario actualizar los mismos con el gestor de paquetes de Ubuntu, denominado apt.

Este gestor de paquetes tiene integrada la verificación de la integridad de los paquetes descargados, pero recientemente fue descubierta una vulnerabilidad denominada CVE-2019-34621, que permite el redireccionamiento de las peticiones APT a un servidor mirror que puede estar controlado por tercero malicioso, y que podría instalarnos en nuestra máquina paquetes infectados.

Para evitar dicha vulnerabilidad, se ha de desactivar el redireccionamiento de HTTP en apt con los siguientes comandos:

sudo apt -o Acquire::http::AllowRedirect=false update
sudo apt -o Acquire::http::AllowRedirect=false install apt

Una vez ejecutadas sendas instrucciones, ya podemos actualizar los paquetes del sistema con las siguientes instrucciones:

sudo apt update && sudo apt upgrade

Con esto ya tendremos las ultimas versiones de los paquetes del sistema.

3. Securización de contraseñas

Con la finalidad de establecer unas políticas de contraseñas de seguridad robustas, es necesario la utilización del modulo PAM. En este caso vamos a establecer una longitud mínima de contraseña de 8 caracteres, según recomienda la publicación 800-63B2 del NIST, la cual debe de contener una mayúscula y un número, y forzar el cambio periódico cada 3 meses imposibilitando utilizar una de las tres últimas contraseñas ya usadas.

Para ello, primeramente instalaremos libpam-cracklib y seguidamente editaremos el fichero /etc/pam.d/common-password como superusuario como se indica en la Ilustración 3.

Ilustración 3: Forzado de contraseña robusta

Con la línea:

passsword requisite pam_cracklib.so try_first_pass retry=3 minlen=8 ucredit=1 dcredit=1 remember=3 

Estamos forzando una contraseña robusta como hemos definido anteriormente. Ahora, para hacer caducar esa contraseña a los 3 meses, debemos de editar el fichero /etc/login.defs y escribir esto:

PASS_MAX_DAYS 100
PASS_MIN_DAYS 0
PASS_WARN_AGE 7

Con estas instrucciones le estamos indicando al sistema que la contraseña debe ser cambiada cada 100 días y que debe ser notificado un mensaje de aviso 7 días antes de que expire dicha contraseña.

Con todos estos cambios ya tendremos cierta robusteza en las contraseñas. Podemos comprobar dicho comportamiento intentando cambiar la contraseña de la siguiente forma:

Ilustración 4: Intento de cambio de contraseña

4. Configuración cortafuegos

Antes de aplicar cualquier regla al cortafuegos, vamos a comprobar que puertos tenemos a la escucha actualmente en la máquina. Para ello vamos a ejecutar el comando netstat -antp:

Ilustración 5: Puertos a la escucha

Como podemos observar tenemos a la escucha el puerto SSH 22 tanto en IPv4 como IPv6, el puerto 80 en IPv6 y el puerto 53 referente a DNS en IPv4 para localhost. Las reglas que vienen instaladas por defecto las podemos listar con el comando iptables -L:

Ilustración 6: Reglas de iptables por defecto

Teniendo en cuenta todos estos puertos, vamos a bloquear todo el tráfico, a excepción del puerto 80 correspondiente al servidor web y el puerto 22 del SSH. Para bloquear todo el trafico ejecutamos las siguientes instrucciones:

Ilustración 7: Bloqueo de todo el tráfico de red

Una vez que tenemos todo el tráfico bloqueado, permitiremos el trafico de la interfaz de loopback para poder realizar conexiones desde el servidor y aceptaremos los paquetes que sean parte de conexiones previamente aceptadas con:

Ilustración 8: Permitir tráfico local y conexiones previas

Ahora permitiremos el trafico HTTP y DNS de salida desde el servidor:

Ilustración 9: Permitir tráfico de salida DNS y HTTP

A continuación, únicamente permitiremos el tráfico SSH desde el cliente del administrador, para ello ejecutamos la siguientes reglas:

Ilustración 10: Permitir el tráfico SSH desde la IP 192.168.0.54

Por último, permitiremos el trafico HTTP por el puerto 80 desde todos los destinos. Para ello ejecutamos las siguientes reglas:

Ilustración 11: Permitir tráfico HTTP (80) desde todos los orígenes

Con todo esto, ya habríamos bloqueado todo el tráfico entrante a excepción del puerto 22 desde la IP del administrador de la máquina y el puerto 80 para todo el mundo. Para guardar las reglas y que se mantengan durante el reinicio, instalamos iptables-persistent y ejecutamos iptables-save > /etc/iptables/rules.

5. Reducir información

Si abrimos una sesión SSH hasta nuestro servidor, se nos arroja información del servidor, aunque el usuario no tenga privilegios. En la Ilustración 12 podemos ver la versión del sistema operativo y la carga de la máquina:

Ilustración 12: Versión del sistema operativo

Para poder editar dicha información y que no sea mostrada por defecto, quitamos los permisos de ejecución del script encargado de generar dicha información y volcamos un mensaje personalizado con estas dos instrucciones:

chmod -x /etc/update-motd.d/*
echo "Bienvenido al sistema" > /etc/motd

Cuando nos logueemos en el sistema, veremos algo como esto:

Ilustración 13: Reducida la información del sistema al inicio de sesión SSH

Referencias:

https://nvd.nist.gov/vuln/detail/CVE-2019-3462

https://pages.nist.gov/800-63-3/sp800-63b.html