Hardening de Servidores

CiberSeguridad 23 de jul. de 2024

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
La Ruta del SysAdmin. Estructura de Directorios
FHS. El Estándar de Jerarquía de Directorios. FHS son las siglas de Filesystem Hierarchy Standard, es el estándar de jerarquía para los sistemas de archivos de los sistemas Linux y otros derivados de UNIX. Antes de comenzar a avanzar en el conocimiento de GNU/Linux, es importante que comprendas va…

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:

Securizando GRUB
En un artículo previo, hemos visto que si tenemos acceso físico a un equipo podemos conseguir acceso a él como superusuario, mediante GRUB. Acceso root desde GRUBSi por alguna causa se necesita acceder a un equipo como superusuario, no es necesario conocer la clave del usuario root, siempre y cuand…

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:

SSH Hardening y Auditoría
Conexiones SSH Cliente-Servidor Hoy en día todas las conexiones entre equipos GNU/Linux se realizan mediante el protocolo ssh Secure Shell para conectarse de modo seguro entre un cliente y un servidor. SSH es un protocolo y mecanismo para autenticar a un usuario remoto, transferir las peticiones d…

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:

Niveles de Ejecución en GNU/Linux
Hay que conocer los runlevel de Linux ! Cuando se administran servidores Linux, el uso del entorno gráfico, no suele ser necesario tenerlo activado, ya que consume recursos innecesarios. Desde que tenemos systemclt (ya hace tiempo), ya no podemos cambiar los niveles de ejecución de una manera fáci…

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.

AppArmor
Introducción a AppArmor Apparmor es un sistema de control obligatorio de acceso MAC (Mandatory Access Control) basado en la interfaz LSM (Linux Security Modules) o módulos de seguridad de Linux.En la práctica, el núcleo pregunta a AppArmor antes de cada llamada del sistema para saber si un proceso…

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:

Vuls: Escáner de vulnerabilidades sin agente para Linux/FreeBSD
Nos ponemos el “sombrero azul” No todo es disfrutar de la shell escribiendo scripts en vim para un administrador de GNU/Linux, siempre hay que estar preparado y revisar la vulnerabilidades que se publican para tener, en la medida de lo posible, los servidores y equipos lo más robustamente asegurado…

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.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux