Políticas de contraseñas y detección de ataques en Linux

CiberseguridadBeginner
Practicar Ahora

Introducción

En este laboratorio aprenderás técnicas esenciales para mejorar la seguridad de un sistema Linux mediante la implementación y aplicación de políticas de contraseñas sólidas. Configurarás reglas para todo el sistema que exigirán contraseñas complejas, con una longitud mínima y una combinación de distintos tipos de caracteres, como letras mayúsculas, letras minúsculas y dígitos. También configurarás políticas de caducidad para garantizar que las credenciales se cambien con regularidad y reducir así los riesgos asociados a contraseñas comprometidas mediante la modificación de archivos de configuración fundamentales del sistema.

Además de establecer la política, comprobarás que estos requisitos estrictos se apliquen a las cuentas de usuario nuevas. Después pasarás de las medidas de seguridad preventivas a la detección reactiva, aprendiendo a supervisar los registros de autenticación del sistema. Al analizar estos registros, podrás identificar actividades sospechosas, como repetidos intentos fallidos de inicio de sesión, que pueden indicar un ataque de fuerza bruta u otros intentos de acceso no autorizado.

Configurar la política local de contraseñas de Linux para la complejidad y la caducidad

En este paso aprenderás a reforzar la seguridad de un sistema Linux mediante la configuración de una política de contraseñas sólida. Una política de contraseñas robusta es un control de seguridad fundamental que regula dos aspectos esenciales: la complejidad y la caducidad. Las reglas de complejidad garantizan que las contraseñas no sean fáciles de adivinar al exigir una combinación de distintos tipos de caracteres, mientras que las reglas de caducidad obligan a los usuarios a cambiar sus contraseñas periódicamente, reduciendo el riesgo asociado a credenciales comprometidas. Utilizarás herramientas estándar de Linux para modificar los archivos de configuración de todo el sistema y aplicar estas políticas.

Primero, exploremos la complejidad de las contraseñas. En sistemas modernos basados en Debian, como Ubuntu, la calidad de las contraseñas se gestiona mediante el módulo pam_pwquality. Su configuración se almacena en el archivo /etc/security/pwquality.conf.

Comencemos examinando la configuración predeterminada. Usa el comando cat para ver el contenido del archivo de configuración. Utilizaremos grep para filtrar las líneas comentadas y vacías, de modo que la salida sea más clara.

grep -vE '^#|^$' /etc/security/pwquality.conf

Es posible que veas algunos valores predeterminados o que el archivo no contenga ninguna configuración activa. Ahora aplicaremos una política más estricta. Como necesitamos editar este archivo con privilegios administrativos, utilizaremos sudo junto con el editor nano.

sudo nano /etc/security/pwquality.conf

Añade las siguientes líneas al archivo para aplicar nuestra nueva política. Estos ajustes exigen que la contraseña tenga al menos 10 caracteres, incluya como mínimo un dígito, una letra mayúscula y una letra minúscula, y que estas comprobaciones también se realicen cuando un administrador establezca la contraseña de otro usuario.

minlen = 10
dcredit = -1
ucredit = -1
lcredit = -1
enforce_for_root

Veamos qué significa cada opción:

  • minlen = 10: establece en 10 caracteres la longitud mínima aceptable de la contraseña.
  • dcredit = -1: exige al menos un dígito. El número negativo significa «al menos uno».
  • ucredit = -1: exige al menos un carácter en mayúscula.
  • lcredit = -1: exige al menos un carácter en minúscula.
  • enforce_for_root: impide que un administrador omita una comprobación de calidad fallida. Es necesario porque sudo adduser establece la contraseña del usuario nuevo con privilegios de root.

Después de añadir estas líneas, guarda el archivo y sal de nano pulsando Ctrl+X, luego Y y, por último, Enter.

Ahora configuremos la caducidad de las contraseñas. Estos ajustes definen el periodo de validez máximo y mínimo de una contraseña. Los valores predeterminados para las cuentas de usuario nuevas se almacenan en /etc/login.defs.

Usa grep para localizar los ajustes relevantes en este archivo.

grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs

Verás los valores predeterminados, que suelen establecer un número muy alto para PASS_MAX_DAYS, desactivando de hecho la caducidad.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   99999
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   0
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   7

Vamos a aplicar una política de caducidad de 9000 días. Abre el archivo con sudo nano.

sudo nano /etc/login.defs

Busca la línea PASS_MAX_DAYS y cambia su valor de 99999 a 9000. También puedes establecer PASS_MIN_DAYS en 7 para impedir que los usuarios cambien su contraseña con demasiada frecuencia.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   9000
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   7
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   14

Guarda el archivo y sal de nano. Estos ajustes de /etc/login.defs se aplican a los usuarios creados después de realizar este cambio. Para aplicar la política a un usuario existente, como nuestro usuario labex, utilizaremos el comando chage.

Primero, consulta la información actual de caducidad del usuario labex.

sudo chage -l labex

La salida mostrará que la contraseña nunca caduca.

Last password change                                    : Jul 22, 2023
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

Ahora utiliza chage con la opción -M para establecer en 9000 el número máximo de días para el usuario labex.

sudo chage -M 9000 labex

Comprueba el cambio consultando de nuevo la información de caducidad del usuario.

sudo chage -l labex

Ahora verás que la fecha indicada en Password expires se ha actualizado y que el número máximo de días se ha establecido en 9000, lo que confirma que la política de caducidad se aplicó correctamente.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 7

Ya has configurado correctamente las políticas de complejidad y caducidad de contraseñas en tu sistema Linux.

Aplicar contraseñas seguras a las cuentas de usuario nuevas

En este paso comprobarás que las políticas de complejidad y caducidad configuradas anteriormente se aplican a las cuentas de usuario nuevas. La mejor forma de probarlo es crear un usuario e intentar establecer una contraseña que infrinja las reglas. Así demostrarás cómo el módulo pam_pwquality y la configuración predeterminada del sistema colaboran para proteger las cuentas nuevas desde el momento de su creación.

Utilizaremos el comando adduser, un script interactivo y fácil de usar para crear usuarios en sistemas basados en Debian. Vamos a crear un usuario nuevo llamado testuser.

sudo adduser testuser

El sistema te pedirá inmediatamente que establezcas una contraseña para el usuario nuevo. Aquí es donde se pondrá a prueba nuestra política.

Primero, intenta establecer una contraseña sencilla y débil que infrinja la política. Cuando se te solicite la nueva contraseña, escribe password y pulsa Enter.

Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
New password:

Como password infringe nuestras reglas —es demasiado corta y no contiene letras mayúsculas ni dígitos—, el sistema la rechazará. El mensaje exacto puede variar, pero comenzará con BAD PASSWORD y volverá a solicitarte una contraseña nueva.

BAD PASSWORD: The password fails the dictionary check
New password:

La contraseña incumple varias reglas y el sistema muestra uno de los motivos del rechazo antes de volver a solicitarla.

La advertencia por sí sola no implica un rechazo, a menos que el comando vuelva a solicitar una contraseña nueva. El ajuste enforce_for_root que añadiste en el paso anterior garantiza que el proceso privilegiado adduser no pueda aceptar la contraseña débil.

Consejo: si creas un usuario por accidente, puedes utilizar sudo deluser testuser para eliminarlo y volver a intentarlo.

Ahora proporciona una contraseña que cumpla todos los criterios. Cuando se te solicite, escribe N7vQ2mR9xK4p y pulsa Enter. Se te pedirá que la escribas de nuevo para confirmarla.

New password:
Retype new password:
passwd: password updated successfully

¡Correcto! El sistema ha aceptado la contraseña segura. A continuación, solicitará información adicional sobre el usuario. Puedes pulsar Enter en cada pregunta para aceptar los valores predeterminados.

Changing the user information for testuser
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

El usuario testuser ya está creado. Puedes verificar que existe mediante el comando id.

id testuser

Esto mostrará el ID del usuario, el ID del grupo y las pertenencias a grupos.

uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)

A continuación, confirma que la política de caducidad definida en /etc/login.defs se haya aplicado automáticamente a este usuario nuevo. Utiliza el comando chage para consultar la información de caducidad de testuser.

sudo chage -l testuser

La salida mostrará que Maximum number of days between password change está establecido en 9000, exactamente como lo configuramos.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 14

Por último, para mantener limpio el sistema, eliminemos el usuario de prueba. El comando deluser eliminará la cuenta.

sudo deluser testuser

El sistema confirmará que el usuario se ha eliminado.

Removing user `testuser' ...
Warning: group `testuser' has no more members.
Done.

Has creado correctamente un usuario nuevo, probado la aplicación de la política de contraseñas y verificado que las reglas de caducidad predeterminadas se aplicaran.

Supervisar los registros de autenticación para detectar intentos de inicio de sesión fallidos

En este paso aprenderás a supervisar los registros de autenticación del sistema para detectar posibles amenazas de seguridad, como los ataques de fuerza bruta. Una parte fundamental de la administración de sistemas consiste en revisar periódicamente los registros en busca de actividades sospechosas. Los intentos fallidos de inicio de sesión son un indicador importante de posibles accesos no autorizados. Simularás un inicio de sesión fallido y, después, utilizarás comandos estándar de Linux para localizar y analizar las entradas correspondientes.

En sistemas basados en Debian, como Ubuntu, los eventos de autenticación —tanto correctos como fallidos— suelen registrarse en el archivo /var/log/auth.log. Para leer este archivo se necesitan privilegios administrativos.

Primero, generemos un intento fallido de inicio de sesión. Podemos hacerlo de forma segura utilizando el comando su (cambio de usuario) para intentar cambiar a nuestra propia cuenta, labex, pero proporcionando deliberadamente una contraseña incorrecta.

su labex

El sistema te solicitará una contraseña. Escribe cualquier contraseña incorrecta, como wrongpassword, y pulsa Enter.

Password:
su: Authentication failure

Hagámoslo una vez más para crear un patrón de fallos.

su labex

Vuelve a introducir una contraseña incorrecta. Ahora que hemos generado algunos datos en los registros, examinemos el archivo de autenticación. Utilizaremos el comando tail con sudo para ver las últimas líneas de /var/log/auth.log, donde se registran los eventos más recientes.

sudo tail /var/log/auth.log

Verás varias líneas nuevas relacionadas con los intentos fallidos de su. La salida será similar a esta e incluirá la marca de tiempo, el proceso (su) y el mensaje de error.

Jul 22 16:45:01 labex-vm su[12345]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:01 labex-vm su[12345]: FAILED SU (to labex) labex on /dev/pts/0
Jul 22 16:45:15 labex-vm su[12346]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:15 labex-vm su[12346]: FAILED SU (to labex) labex on /dev/pts/0

Buscar manualmente en los registros puede llevar mucho tiempo. Un método más eficaz consiste en utilizar grep para filtrar palabras clave concretas. Busquemos todas las líneas que contengan "authentication failure".

sudo grep "authentication failure" /var/log/auth.log

Este comando mostrará únicamente las líneas que coincidan con el patrón, lo que facilitará la identificación de los intentos fallidos que acabas de generar.

Ahora vamos a crear un script de shell sencillo para automatizar este proceso de supervisión. El script comprobará si hay fallos en el registro y mostrará un resumen. En tu directorio ~/project, crea un archivo nuevo llamado log_monitor.sh utilizando nano.

nano log_monitor.sh

Introduce el siguiente script de Bash en el editor. Utiliza grep con la opción -c para contar el número de intentos fallidos de inicio de sesión y, a continuación, muestra un mensaje de estado.

#!/bin/bash

LOG_FILE="/var/log/auth.log"
FAILURE_COUNT=$(sudo grep -c "authentication failure" $LOG_FILE)

echo "--- Authentication Log Monitor ---"
if [ "$FAILURE_COUNT" -gt 0 ]; then
  echo "WARNING: Found $FAILURE_COUNT failed login attempts."
else
  echo "OK: No failed login attempts found."
fi
echo "--------------------------------"

Guarda el archivo y sal de nano pulsando Ctrl+X, luego Y y, por último, Enter.

A continuación, haz que el script sea ejecutable mediante el comando chmod.

chmod +x log_monitor.sh

Por último, ejecuta el script de supervisión para ver el resultado.

./log_monitor.sh

Como has generado intentos de inicio de sesión fallidos, el script los detectará y mostrará un mensaje de advertencia con el recuento exacto.

--- Authentication Log Monitor ---
WARNING: Found 2 failed login attempts.
--------------------------------

Ahora sabes cómo simular y detectar intentos de autenticación fallidos, así como crear un script básico para supervisarlos, una capacidad esencial para mantener la seguridad del sistema.

Resumen

En este laboratorio aprendiste a mejorar la seguridad de un sistema Linux mediante la configuración de una política local de contraseñas sólida. Modificaste el archivo /etc/security/pwquality.conf para aplicar reglas de complejidad mediante el módulo pam_pwquality. Esto implicó establecer una longitud mínima para las contraseñas y exigir al menos un dígito, una letra mayúscula y una letra minúscula, con el fin de proteger las cuentas frente a credenciales fáciles de adivinar.

También aprendiste a garantizar que estas políticas de contraseñas seguras se apliquen al crear cuentas de usuario nuevas. Además, el laboratorio abordó la supervisión de los registros de autenticación del sistema para detectar y analizar eventos de seguridad, como repetidos intentos fallidos de inicio de sesión, que pueden indicar un posible ataque.