Lista esencial para endurecer sistemas operativos Linux.

Marvin G. Soto
11 min readMay 17, 2021

--

Creditos de Imagen: boraarat.com

En primera instancia, aclarar que esta lista no es la receta perfecta, es solo una recopilacion de lo que seria una receta fundamental. La mayoría de administradores de sistemas Linux asume que Linux es completamente seguro por defecto y la pura verdad es que esa es una suposición falsa.

Existen muchas guias de endurecimiento de sistemas en Internet, esta reune las que considero mas esenciales. En otro articulo espero referirme a las auditorias de sistemas Linux.

No está de más aclarar que las implicaciones negativas de no fortalecer su sistema operativo Linux son demasiado graves, así que un poco de tiempo desde la implementación, nos puede ahorrar grandes complicaciones futuras.

El ecosistema alrededor del núcleo del sistema operativo Linux ofrece muchas distribuciones, cada una diferente desde la perspectiva de la línea de comandos o de los paquetes que establece por defecto, o de la ubicación de ellos en el sistema de archivos, no obstante, el principio de esta propuesta es la misma.

Como un aporte desinteresado, les compartiré entonces los pasos que este servidor sigue para asegurar sus sistemas Linux. El texto es un poco técnico, pues su público meta son las personas que son usuarios familiarizados con Linux, incluidos los administradores de sistemas, aunque confieso que se ha presentado como una especie de paso a paso… con pasitos!. ¡Aquí vamos entonces!

Paso No 1: Documente la información del equipo que va a endurecer.

Cada vez que configure un nuevo sistema Linux, cree un documento que resuma los elementos de esta lista de verificación. Incluye allí datos como: Nombre de la persona que está haciendo el endurecimiento, Fecha de puesta en escena, Número de activo o algún identificador, Nombre de la máquina, Dirección IP, Dirección MAC, Servicio que presta.

Paso No 2: Protección del BIOS

Generalmente protejo el acceso al BIOS del host con una contraseña para que el usuario final no pueda cambiar y anular la configuración de seguridad en el BIOS. Considero importante mantener esta área protegida de cualquier cambio.

Igualmente, a nivel del BIOS, debe deshabilitar el arranque desde dispositivos de medios externos (USB/CD/DVD). Recuerde que, si omite este cambio en la configuración, cualquier persona con acceso al equipo puede usar un dispositivo USB u óptico que contenga un sistema operativo y podría acceder a los datos de su sistema operativo.

Igualmente, considere que las tarjetas madre más recientes tienen un servidor web interno al que puede acceder de forma remota. Asegúrese de cambiar la contraseña de administración predeterminada o inhabilítela si es posible.

Paso No 3: Cifrado de disco duro

La mayoría de las distribuciones del sistema operativo Linux permiten cifrar los discos antes de ejecutar la instalación. La encriptación del disco es importante en caso de acceso no privilegiado o robo. Esta acción atiende al principio de confidencialidad de la información.

Paso No 4: Protección de disco (disponibilidad)

Para equipos con servicios críticos o vitales, las copias de seguridad deben transferirse fuera del sitio en caso de desastre. Igualmente, en ambientes virtuales la toma de instantáneas es muy importante. Estas copias o instantáneas adquieren relevancia en caso de un sistema dañado, errores en la actualización del sistema operativo, o bien ante el impacto de un evento de seguridad. Los repositorios de sistemas o datos en sistemas críticos deben separarse en diferentes particiones, especialmente la partición raíz (/), la de arranque (/boot) del sistema, el directorio de aplicaciones de terceros (/usr), el directorio de usuarios (/home), el directorio de archivos temporales del sistema (/tmp), el directorio de logs o servicios (/var) y finalmente el de componentes opcionales (/opt).

La división de discos nos brinda la oportunidad de mejorar el rendimiento y agregar seguridad en caso de un errores o eventos en el sistema.

Paso No 5: Bloquear el directorio de arranque

El directorio de arranque contiene archivos importantes relacionados con el núcleo de Linux, o las configuraciones de arranque, así como las imágenes de Linux. Debemos asegurarnos que este directorio esté bloqueado con permisos de solo lectura siguiendo los siguientes pasos simples.

Primero, abra el archivo “fstab”.

Luego, agregue esta última línea en el archivo:

Acto seguido establecemos algunos permisos para proteger la configuración de arranque, entre ellas establecer como propietario y como grupo del archivo grub.cfg a root, además de establecer permisos de solo lectura y escritura solo para root también.

Si su sistema no ha migrado a SystemD, también debería requerir autenticación para el modo de usuario único.

sed -i "/SINGLE/s/sushell/sulogin/" /etc/sysconfig/init
sed -i "/PROMPT/s/yes/no/" /etc/sysconfig/init

Paso No 6: Desactive el uso de los puertos USB

Dependiendo de cuán crítico sea su sistema, a veces es necesario deshabilitar el uso de dispositivos USB. Hay varias formas de denegar el uso de almacenamiento USB; aquí les comparto una muy popular.

Abrimos el archivo “blacklist.conf” con el comando: nano /etc/modprobe.d/blacklist.conf

Cuando se abra el archivo, agregue la siguiente línea al final del archivo (guardar y cerrar):

Ahora iremos a editar el archivo rc.local: nano /etc/rc.local al cual le agregaremos las siguientes dos líneas:

Paso No 7: Actualización del sistema

La tarea primaria que debes ejecutar después del primer arranque del nuevo sistema es actualizarlo. Para ello abres una terminal de comando y ejecutas los siguientes comandos (el ejemplo es con derivados de Debian):

Paso No 8: Verifique los paquetes instalados

Una vez que finalice el proceso de actualización debes ser muy estricto con mantener la menor cantidad de aplicaciones y servicios instalados –especialmente en servidores-, así como eliminar los paquetes innecesarios después de actualizar. Puedes valerte de los siguientes comandos para esas tareas:

Igualmente recuerde deshabilitar los servicios innecesarios. Esto sin duda reducirá la superficie de ataque. Puede valerse del comando systemctl, systemctl status para ver que servicios se estan ejecutando en el sistema.

Paso No 9: Compruebe si hay puertos abiertos

Identificar conexiones abiertas a Internet es una misión crítica. En mi caso utilizo el siguiente comando para detectar cualquier puerto abierto oculto:

Si no está instalado pueden instalarlo con el comando:

Paso No 10: SSH seguro.

SSH es seguro, pero también no está de más socarle un poquito más las tuercas. si puede deshabilitarlo genial! SSH, ese es un problema resuelto. Sin embargo, si requiere utilizarlo debemos cambiar la configuración predeterminada del servicio.

El archivo de configuración típicamente está en /etc/ssh/sshd_config, asi que lo vamos a editar:

Mis consejos serian:

· Cambie el número de puerto predeterminado 22 a otro, p. Ej. 99, 2222.
· Asegúrese de que root no pueda iniciar sesión de forma remota a través de SSH: PermitRootLogin no
· Permitir a algunos usuarios específicos: AllowUsers [nombre de usuario]

La lista puede seguir y seguir, pero esto debería ser suficiente para empezar. Si quiere más seguridad, algunas opciones adicionales que debe asegurarse de que existan en el archivo son:

Protocol2
IgnoreRhosts yes
HostbasedAuthentication no
PermitEmptyPasswords no
X11Forwarding no
MaxAuthTries 5
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
ClientAliveInterval 900
ClientAliveCountMax 0
UsePAM yes

Finalmente, configure los permisos en el archivo sshd_config para que solo los usuarios con privilegios de root puedan cambiar su contenido:

chown root:root /etc/ssh/sshd_config
chmod 600 /etc/ssh/sshd_config

Paso No 11: Habilite SELinux

Security Enhanced Linux es un mecanismo de seguridad del Kernel para respaldar la política de seguridad de control de acceso. El SELinux tiene tres modos de configuración:

Deshabilitado: Apagado
Permisivo: Imprime advertencias
Cumplimiento: la política se aplica

Usando un editor de texto, abra el archivo de configuración: nano /etc/selinux/config

Y asegúrese de que se cumpla la política: SELINUX=enforcing

Paso No 12: Parámetros de red

Asegurar las actividades de la red de su host Linux es una tarea esencial. No asuma siempre que su firewall se encargará de todo. A continuación, se muestran algunas características importantes a tener en cuenta para proteger su red de host:

· Deshabilite el reenvío de IP, configurando el parámetro net.ipv4.ip_forward en 0 en “/etc/sysctl.conf”

· Desactive los redireccionamientos de envío de paquetes configurando los parámetros:

net.ipv4.conf.all.send_redirects
net.ipv4.conf.default.send_redirects

Ambos en 0 en el archivo “/etc/sysctl.conf”

· Desactive la aceptación de redireccionamiento ICMP configurando los parámetros:

net.ipv4.conf.all.accept_redirects
net.ipv4.conf.default.accept_redirects

Ambos en 0 en el archivo “/etc/sysctl.conf”

· Habilite la protección contra mensajes de error incorrectos configurando el parámetro:

net.ipv4.icmp_ignore_bogus_error_responses

En 1 en el archivo “/etc/sysctl.conf”

Además, les recomiendo encarecidamente usar el Firewall de Linux aplicando las reglas de iptable y filtrando todos los paquetes entrantes, salientes y reenviados. La configuración de las reglas de iptables llevará algún tiempo, pero vale la pena.

Paso No 13: Políticas de contraseñas

¡No reutilice contraseñas! Las contraseñas antiguas se almacenan en el archivo “/etc/security/opasswd”.

Le explico muy rápidamente como usar el módulo PAM (Plugable authentication module) para administrar las políticas de seguridad de Linux. Para lo cual me voy a valer de una distribución de Debian.

  1. Primero abra el archivo “/etc/pam.d/common-password” usando un editor de texto y agregue las siguientes dos líneas:
auth sufficient pam_unix.so likeauth nullok
password sufficient pam_unix.so remember=5

Esta línea, No permitirá que los usuarios reutilicen las últimas 5 contraseñas.

2. También recomiendo forzar la complejidad de las contraseñas, para hacerlas más robustas.

Para nuestra fortuna el módulo PAM ofrece un pam_cracklib que protegerá nuestro sistema operativo de ataques de diccionario y de fuerza bruta.

Para realizar esta mejora, abra el archivo /etc/pam.d/system-auth usando su editor de texto predilecto y agregue la siguiente línea:

/lib/security/$ISA/pam_cracklib.so retry = 3 minlen = 8 lcredit = -1 ucredit = -2 dcredit = -2 ocredit = -1

Linux aplicará un hash a la contraseña para evitar guardarla en texto sin cifrar, por lo que debe asegurarse de definir un algoritmo de hash de contraseña seguro, algo así como SHA512.

3. Sugiero además, bloquear la cuenta después de 5 o menos intentos fallidos. Para que esto suceda, debe abrir el archivo “/etc/pam.d/password-auth” y agregar las siguientes líneas:

auth required pam_env.so
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=604800
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=604800
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=604800
auth required pam_deny.so

Suave que necesitamos un paso adicional. Vamos a aplicar el cambio en otro archivo necesario. Se trata del archivo “/etc/pam.d/system-auth”, así que ábralo y asegúrese de agregarlas siguientes líneas:

auth required pam_env.so
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=604800
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=604800
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=604800
auth required pam_deny.so

Ahora sí, luego de 5 intentos fallidos, solo un administrador puede desbloquear la cuenta. Para ello usara el siguiente comando:

/usr/sbin/faillock — user <userlocked> — reset

4. Otra buena práctica es configurar la contraseña para que caduque después de 90 días al menos; para realizar esta tarea, debe:

Ir al archivo “/etc/login.defs” y establezca el parámetro PASS_MAX_DAYS en 90

Ahora con el comando “chage” (Change age), procedemos a cambiar en el usuario activo o en el usuario que desee alterar; ejecutando el siguiente comando:

chage - maxdays 90 <usuario>

5. El siguiente consejo que les ofrezco, es para mejorar las políticas de contraseñas y se trata de que restrinjamos el acceso al comando “su” (Super User), configurando los parámetros de la librería pam_wheel.so en “/etc/pam.d/su”.

Lo que haremos es modificar la siguiente línea:

auth required pam_wheel.so use_uid

6. ¡Muy bien! Ultimo consejo. Vamos a deshabilitar en la política de contraseñas las cuentas del sistema para usuarios que no sean root.

Lo haremos con el siguiente script (usando el Shell de bash):

#!/bin/bash
for user in `awk -F: '($3 < 500) {print $1 }' /etc/passwd`; do
if [ $user != "root" ]
then
/usr/sbin/usermod -L $user
if [ $user != "sync" ] && [ $user != "shutdown" ] && [ $user != "halt" ]
then /usr/sbin/usermod -s /sbin/nologin $user
fi
fi
done

Si notan, el sistema crea los ID de usuarios y grupos a partir del número 1000. Aquí les dejo evidencia de mi máquina para este laboratorio del usuario que me he creado:

Usaremos ese control del sistema como base para filtrar a simples usuarios de usuarios privilegiados, estableciendo 500 como un numero elegido, considerando un numero de servicios razonable.

Paso No 14: Permisos y verificaciones

Ok. En este tema la lista es larga. Establecer una sana gestión de permisos es una de las tareas más importantes y críticas para lograr el objetivo de seguridad en sistema operativo Linux.

1. Vamos a empezar con el usuario y propietario del grupo de “/etc/anacrontab”, “/etc/crontab” y “/etc/cron.*”. estos tres archivos controlan la ejecución de tareas en el sistema. Para gestionar esta tarea vamos a correr como super usuario los siguientes comandos:

chown root:root /etc/anacrontab
chmod og-rwx /etc/anacrontab
chown root:root /etc/crontab
chmod og-rwx /etc/crontab
chown root:root /etc/cron.hourly
chmod og-rwx /etc/cron.hourly
chown root:root /etc/cron.daily
chmod og-rwx /etc/cron.daily
chown root:root /etc/cron.weekly
chmod og-rwx /etc/cron.weekly
chown root:root /etc/cron.monthly
chmod og-rwx /etc/cron.monthly
chown root:root /etc/cron.d
chmod og-rwx /etc/cron.d

2. Estableceremos ahora permisos en “/var/spool/cron” para “root crontab”

chown root: root <crontabfile>
chmod og-rwx <crontabfile>

3. Seguiremos con el usuario/propietario del grupo y los permisos del archivo “passwd”

chmod 644 /etc/passwd
chown root:root/etc/passwd

4. Le toca el turno al usuario/propietario del grupo y los permisos en el archivo “group”

chmod 644 /etc/group
chown root:root/etc/group

5. Es el turno del usuario/propietario del grupo y los permisos en el archivo “shadow”

chmod 600 /etc/shadow
chown root:root/etc/shadow

6. Finalmente configuraremos usuario/propietario del grupo y los permisos del archivo “gshadow”

chmod 600 /etc/gshadow
chown root:root/etc/gshadow

Paso No 15: Endurecimiento adicional dirigido a los procesos

Para terminar, incluyo algunos consejos adicionales que deben tenerse en cuenta al reforzar un sistema operativo Linux.

1. Debemos restringir el volcado de núcleo mediante :

Agregando 0 al archivo “/etc/security/limits.conf”

Agregando fs.suid_dumpable = 0 al archivo “/etc/sysctl.conf”

2. Configuremos Exec Shield mediante:

kernel.exec-shield = 1 en el archivo “/etc/sysctl.conf”

3. Habilitamos la colocación aleatoria de regiones de memoria virtual mediante el siguiente cambio:

kernel.randomize_va_space = 2 en el archivo “/etc/sysctl.conf”

En cierre, quisiera hacer como cláusula de descargo que este documento es técnico como se ha podido notar, lo que evidencia mi interés de apoyar a los administradores de sistemas Linux a construir su paso a paso del endurecimiento básico del sistema.

Por supuesto que hay mucho más para hacer, pero como he dicho… esta lista no es la receta perfecta, es solo mi receta fundamental.

--

--

Marvin G. Soto
Marvin G. Soto

Written by Marvin G. Soto

Pensador, innovador, luchador, enamorado de su profesión, apasionado por las letras… de dificil renunciar y lejano a rendirse…

No responses yet