Hardening de Servidores
Reforzando la seguridad en un servidor
Hay varios puntos sobre los que poder actuar para reforzar la seguridad de un servidor, algunos dependiendo de si el servidor está auto-alojado o está en la nube, se podrán o no aplicar.
- Seguridad Física
- Seguridad en la Red
- Seguridad sobre los Servicios
- Reducir la "superficie de exposición"
Seguridad Física
En cuanto se dispone de acceso físico a un elemento informático los niveles de seguridad se reducen drásticamente.
Por ello debemos proteger un equipo siempre pensando que en algún momento alguien podría tener acceso físico al mismo y evitar de la mejor manera posible su acceso y manipulación.
Acceso físico restringido
Debería ser obvio que para acceder a un servidor, la ubicación del mismo debería un lugar al que sólo los responsables del mismo tengan acceso, se tenga un control continuo y detallado de quién y cuando se accede a él.
Securizar la BIOS/UEFI
Otro punto muy importante es proteger contra cualquier cambio de las opciones del firmware de la BIOS o de la UEFI del servidor mediante una contraseña que evite cualquier alteración en su configuración.
Podemos evitar que se puedan conectar dispositivos externos como USB's o incluso realizar arranques PXE e iniciar cualquier SO con un simple portátil conectado a la red del propio equipo.
Anulación del uso de USB
Además desde la propia configuración del SO, debemos evitar que se puedan usar dispositivos externos al servidor, por ejemplo para evitar fugas de datos o que se pueda cargar cualquier software desde ellos.
Es tan sencillo como editar/crear el fichero /etc/modprobe/no-usb.conf
e incluir en él las siguientes líneas:
blacklist usb_storage
Después actualizaremos "initramfs" (Initial RAM FileSystem) mediante el comando: update-initramfs -u
Protección del directorio /boot
Una medida extra de seguridad es evitar cualquier cambio del kernel de nuestro servidor sin nuestro control o aceptación.
La forma más sencilla de realizar esto es dejar modo read-only
desde el fichero /etc/fstab
el punto de montaje de /boot
.
Cuando queramos realizar una nueva actualización o cambio sobre el kernel podemos editar el fichero para permitir el modo de escritura sobre este directorio.
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=XYZ0-ABCE /boot ext4 defaults,noatime,ro 0 2
Separación de Particiones y FileSystem
Para evitar posibles pérdidas de datos, tener un mayor control sobre cada uno de los directorios importantes del S.O. o bloqueos del Sistema Operativo al llenarse una partición, es recomendable tener separados los directorios considerados como "importantes" en el sistema de ficheros de GNU/Linux
Por orden de importancia serían:
/
/boot
/usr
/var
/tmp
/home
/opt
Proteger GRUB
No debemos permitir que se pueda acceder al menú de inicio de Grub y se modifiquen sus opciones para evitar que cualquier pueda tener acceso como root
de una forma tan sencilla, para ellos securizamos Grub, tal y como explicamos en un artículo anterior:
Cifrado de los discos
Tenemos que prever también que se pueda dar el caso de que los discos del sistema puedan ser robados o simplemente clonados sin nuestro conocimiento. Para evitar que sean accesibles los datos almacenados en ellos se recomienda el cifrado de los mismos.
Desactivar teclas de Reinicio
Debemos desactivar las teclas que permiten el reinicio del sistema:CTRL
+ ALT
+ SUPR
ó CTRL
+ ALT
+ DEL
Podemos editar este comportamiento mediante el comando:systemctl edit ctrl-alt-del.target
Editaremos el fichero y lo dejaremos con el siguiente contenido:
[Service]
ExecStart=
Recargaremos los cambios y haremos un mask para que sea imposible usar ese servicio (→ /dev/null)
systemctl daemon-reload
systemctl mask ctrl-alt-del.target
Seguridad en la Red
Actualmente la parte de la red, es nuestra mayor superficie de exposición a cualquier tipo de ataque, debemos ser extremadamente cuidadosos con todos los accesos que permitimos y lo que exponemos hacia la red.
Revisar y Desactivar Servicios
A mayor cantidad de servicios, mayores puntos de ataque y posibilidades de fallos por malas configuraciones o vulnerabilidades de un producto.
Revisaremos todos los servicios que se ejecutan y desactivaremos o eliminaremos todos aquellos que no son necesarios para dar el servicio requerido: Menos es más en seguridad
Revisión de Puertos
Otra tarea importante es monitorizar los puertos abiertos y conexiones que tiene nuestro servidor, podemos hacer uso de las herramientas netstat
o ss
que nos permiten ver que servicios y en que puertos están escuchando:
# Usando Netstat
netstat -tunl
# Usando SS
ss -tunl
Nota: Yo uso como regla nemotécnica la palabra "tunel" (sin la e) para acordarme de los parámetros a usar.
Podemos usar los parámetros --punta
para netstat y ss y nos detallará los puertos abiertos, la conexión establecida, IP de origen y destino y puertos usados.
Mejorar la seguridad de SSH
En el artículo sobre SSH Hardening ya hablamos sobre ello y además sobre como usar la herramienta ssh-audit
para ver como reforzar la seguridad de ssh:
Ademas podemos incluir como acciones extras para reforzar la conexión el uso de:
- DenyHost
- Fail2Ban
- Deshabilitar login de root
- SSH sin contraseña y solo permitir mediante clave publica-privada
- Sólo permitir uso del protocolo
SSH-2
- Tener en cuenta la posibilidad de cambiar el puerto
22
por defecto por otro - Incluir un
Banner
en la conexión SSH eliminando información sobre SO y versión.
####################################################################
# #
# mmmm mmmm m m mm # " m #
# #" " #" " # # ## m m mmm# mmm mm#mm #
# "#mmm "#mmm #mmmm# # # # # #" "# # # #
# "# "# # # #mm# # # # # # # #
# "mmm#" "mmm#" # # # # "mm"# "#m## mm#mm "mm #
# #
####################################################################
# YOU ARE ENTERING INTO A SECURED AREA! #
# Your IP, Login time, Username has been noted #
# and has been sent to the server administrator! #
# This service is restricted to authorized user only. #
# All activities on this system are logged. #
# Unanthorized access will be fully investigated #
# and reported to the appropiate law enforcement agencies. #
####################################################################
Desactivar IPv6
Si no estas usando el protocolo IPv6 en un servidor, puedes desactivarlo editando el fichero /etc/sysctl.conf
Para ello incluye las siguiente líneas en el fichero:
```
# Deshabilitar IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```
Y luego aplicaremos los cambios con el comando: sysctl -p
Tras los cambios, verificaremos que ya no está en uso: ip addr show
Sondas IDS e IPS
Es importante contar con el apoyo del grupo o departamento dedicado a la ciberseguridad de la empresa para que podamos enviarles datos y logs hacia sus sondas IDS e IPS para detecciones tempranas de ataques o movimientos laterales entre equipos.
Seguridad sobre los Servicios
Tal y como se ha comentado en el apartado anterior, se deben desactivar todos los servicios no necesarios.
Modo no gráfico
Un servidor no necesita disponer de modo gráfico para ser administrado, debemos eliminar todo el software asociado a aplicaciones y servicios gráficos.
Además forzaremos a que el sistema siempre inicie en modo no-gráfico:
RsysLog
Debemos tener una copia "extra" de los logs importantes del sistema y de los servicios en ejecucion, en otra ubicación para evitar que los originales puedan ser alterados y podamos encontrar trazas de lo sucedido en caso de que un servidor fuese comprometido.
Mantenimiento del Software Instalado
Mantener el software actualizado evita vulnerabilidades sobre el servidor.
En el caso de servidores Debian, es importante tener configurado el respositorio de seguridad para disponer de los últimos parches de seguridad.
Fichero /etc/apt/sources.list
deb http://security.debian.org/debian-security/ bookworm-security main non-free-firmware
Reducir la superficie de exposición
Si disponemos de servicios a los que se puede "consultar" por la versión en ejecución es interesante no devolver la versión del software, sobre todo para evitar ataques de dia cero
.
Evitar mostrar version contra Zero-Days
Por ejemplo si usamos un servidor web ya sea como servidor de estáticos, o como proxy-inverso, evitar mostrar la versión del mismo puede evitar que se realicen pruebas de ataques contra la versión exacta que se tenga instalada y si sufrimos un ataque será más fácil de detectar ya que se tendrían que realizar varios ataques hasta dar con la vulnerabilidad Zero Day
que esté buscando el atacante.
- En
NGINX
se puede facilmente incluyendo en su configuración la directiva:server_tokens off;
- En
Apache
usaremos en el fichero de configuración:/etc/apache2/conf-enabled/security.conf
en la sección ServerTokens incluiremos:ServerSignature Off
Ping-ICMP
El no responder al ping
(Protocolo ICMP) puede ser una buena opción para evitar detectar un equipo en una primera "ojeada" o para evitar ataques de inundación por ping
y denegaciones de servicio.
Esto lo podemos realizar de tres formas:
- Bloquear ping en parametros de inicio del Kernel
- Bloquear ping con IPTABLES
- Bloquear ping con UFW
Esto no evita que tu sistema pueda ser reconocido o localizado mediante escaneos mediante nmap
, para ello necesitariamos de otras herramientas como scanlogd
(una herramienta para detectar escaneos de puertos) o soluciones completas SIEM (Security Information & Event Management) como por ejempo SPLUNK
para detectar estas actividades.
SELINUX y AppArmor para Aplicaciones de terceros
Hay que tener un control de calidad y auditoría sobre el software que se instala en los servidores de aplicaciones, ya sea de nuestros propios desarrolladores, como de software de terceros por muy confiables que sean.
Siempre hay que usar la mayor restricción posible de conexión, acceso a rutas del Sistema Operativo, uso de librería, etc.
El uso de SELinux o de AppArmor puede dar mucho trabajo inicial para el ajuste y control de aplicaciones en ejecución pero una vez realizado el "trabajo fino" nos evitará quebraderos de cabeza.
WAF y Servidores de Aplicaciones
Si nuestros servidores realizan tareas como servidor de aplicaciones, debemos tener en cuenta que será requisito indispensable el disponer de un WAF (Firewall de Aplicaciones WEB) para supervisar, filtrar o bloquear el tráfico HTTP hacia y desde las aplicaciones web.
Auditorías propias y Externas
Debemos de realizar cada cierto tiempo auditorías a nuestros sistemas, ya sean tanto realizadas a nivel interno, como con especialistas externos (Pentester) que nos permitan ir detectando y corrigiendo las vulnerabilidades detectadas.
Como primer acercamiento para ello disponemos de herramientas completas que nos ayudan a ello:
Software de Compilación
Un servidor de producción nunca debe llevar ninguna herramienta que permita la compilación de código alguno en ella.
En caso de por ejemplo necesitar compilar algo específico para ese servidor, por tratarse de un hardware especial, se deberá compilar y probar en otra máquina diferente y desplegar en ella unicamente los binarios y librerías necesarias.