Políticas de Contraseñas y Detección de Ataques en Linux

CompTIABeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá técnicas esenciales para mejorar la seguridad de un sistema Linux implementando y aplicando políticas de contraseñas robustas. Configurará reglas a nivel de sistema para forzar la complejidad de las contraseñas, requiriendo una longitud mínima y una combinación de diferentes tipos de caracteres, como letras mayúsculas, minúsculas y dígitos. También configurará políticas de envejecimiento de contraseñas para garantizar que las credenciales se cambien regularmente, reduciendo el riesgo asociado con contraseñas comprometidas mediante la modificación de archivos de configuración centrales del sistema.

Más allá de establecer la política, se asegurará de que estos requisitos de contraseñas seguras se apliquen a las nuevas cuentas de usuario. El laboratorio luego cambia de medidas de seguridad proactivas a detección reactiva, enseñándole cómo monitorear los registros de autenticación del sistema. Al analizar estos registros, podrá identificar actividades sospechosas, como intentos de inicio de sesión fallidos repetidos, que pueden ser un indicador de un ataque de fuerza bruta u otros intentos de acceso no autorizado.

Configurar la Política de Contraseñas Local de Linux para Complejidad y Antigüedad

En este paso, aprenderá a fortalecer la seguridad de un sistema Linux configurando una política de contraseñas robusta. Una política de contraseñas fuerte es un control de seguridad fundamental que aplica dos aspectos críticos: complejidad y antigüedad (aging). Las reglas de complejidad aseguran que las contraseñas no sean fácilmente adivinables al requerir una mezcla de tipos de caracteres, mientras que las reglas de antigüedad obligan a los usuarios a cambiar sus contraseñas periódicamente, reduciendo el riesgo de credenciales comprometidas. Utilizará utilidades estándar de Linux para modificar archivos de configuración a nivel de sistema y aplicar estas políticas.

Primero, exploremos la complejidad de las contraseñas. En los sistemas modernos basados en Debian como Ubuntu, la calidad de la contraseña 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. Utilice el comando cat para ver el contenido del archivo de configuración. Usaremos grep para filtrar las líneas comentadas y las líneas vacías para que la salida sea más limpia.

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

Es posible que vea algunas configuraciones predeterminadas o que el archivo esté vacío de configuraciones activas. Ahora, vamos a aplicar una política más estricta. Necesitamos editar este archivo con privilegios de administrador, por lo que usaremos sudo con el editor nano.

sudo nano /etc/security/pwquality.conf

Agregue las siguientes líneas al archivo para aplicar nuestra nueva política. Estas configuraciones requieren que la contraseña tenga al menos 10 caracteres de longitud y contenga al menos un dígito, una letra mayúscula y una letra minúscula.

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

Analicemos estas opciones:

  • minlen = 10: Establece la longitud mínima aceptable para la contraseña en 10 caracteres.
  • dcredit = -1: Requiere al menos un dígito. El número negativo significa "al menos uno".
  • ucredit = -1: Requiere al menos un carácter en mayúscula.
  • lcredit = -1: Requiere al menos un carácter en minúscula.

Después de agregar estas líneas, guarde el archivo y salga de nano presionando Ctrl+X, luego Y, y Enter.

Ahora, pasemos a configurar la antigüedad de la contraseña (password aging). Estas configuraciones definen la vida útil máxima y mínima de una contraseña. Los valores predeterminados para las cuentas de usuario nuevas se almacenan en /etc/login.defs.

Use grep para encontrar las configuraciones relevantes en este archivo.

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

Verá los valores predeterminados, que a menudo se establecen en un número muy alto para PASS_MAX_DAYS, deshabilitando efectivamente la expiración.

##       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 expiración de 9000 días. Abra el archivo con sudo nano.

sudo nano /etc/login.defs

Busque la línea PASS_MAX_DAYS y cambie su valor de 99999 a 9000. También puede establecer PASS_MIN_DAYS en 7 para evitar 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

Guarde el archivo y salga de nano. Estas configuraciones en /etc/login.defs se aplican a los usuarios creados después de este cambio. Para aplicar la política a un usuario existente, como nuestro usuario labex, usamos el comando chage.

Primero, verifique la información de antigüedad actual para el usuario labex.

sudo chage -l labex

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

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, use chage con la bandera -M para establecer el número máximo de días en 9000 para el usuario labex.

sudo chage -M 9000 labex

Verifique el cambio revisando nuevamente la información de antigüedad del usuario.

sudo chage -l labex

Ahora verá que la fecha de Password expires se ha actualizado, y el número máximo de días se establece en 9000, aplicando exitosamente la política de antigüedad.

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

Ahora ha configurado con éxito tanto las políticas de complejidad como las de antigüedad de contraseñas en su sistema Linux.

Aplicar Contraseñas Seguras para Nuevas Cuentas de Usuario

En este paso, verificará que las políticas de complejidad y caducidad de contraseñas que configuró en el paso anterior se están aplicando a las nuevas cuentas de usuario. La mejor manera de probar esto es crear un nuevo usuario e intentar establecer una contraseña que viole las reglas. Esto demostrará cómo el módulo pam_pwquality y la configuración predeterminada del sistema trabajan juntos para proteger las nuevas cuentas desde el momento en que se crean.

Usaremos el comando adduser, que es un script interactivo y fácil de usar para crear usuarios en sistemas basados en Debian. Crearemos un nuevo usuario llamado testuser.

sudo adduser testuser

El sistema le pedirá inmediatamente que establezca una contraseña para el nuevo usuario. Aquí es donde se probará nuestra política.

Primero, intentemos establecer una contraseña simple y débil que viole nuestra política. Cuando se le solicite la nueva contraseña, escriba password y presione 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:

Debido a que password viola nuestras reglas (es demasiado corta y no contiene letras mayúsculas ni dígitos), el sistema la rechazará. Veamos el motivo que proporciona.

BAD PASSWORD: The password contains less than 1 digits

El sistema la rechaza, señalando la falta de dígitos. Viola varias políticas, pero esta es la primera que informa.

El sistema le pedirá de nuevo. Ahora, intentemos una contraseña que cumpla con el requisito de longitud pero que aún viole las reglas de complejidad. Escriba 12345 y presione Enter.

BAD PASSWORD: The password contains less than 1 uppercase letters
New password:

Consejos: Si accidentalmente crea un usuario, puede usar sudo deluser testuser para eliminar el usuario e intentarlo de nuevo.

El sistema la rechaza de nuevo. Esta vez, es porque la contraseña carece de un dígito. También carece de una letra mayúscula, por lo que no cumple con nuestros requisitos de complejidad. Ahora, proporcionemos una contraseña que cumpla con todos nuestros criterios. Cuando se le solicite, escriba StrongPass2025 y presione Enter. Se le pedirá que la vuelva a escribir para confirmarla.

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

¡Éxito! El sistema aceptó la contraseña robusta. Ahora le pedirá información adicional sobre el usuario. Simplemente puede presionar Enter en cada solicitud 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 ha sido creado. Puede verificar que el usuario existe usando el comando id.

id testuser

Esto mostrará el ID del usuario, el ID del grupo y las membresías de grupo.

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

A continuación, confirmemos que la política de caducidad de contraseñas que establecimos en /etc/login.defs se aplicó automáticamente a este nuevo usuario. Use el comando chage para ver la información de caducidad para testuser.

sudo chage -l testuser

La salida mostrará que el Maximum number of days between password change (Número máximo de días entre cambios de contraseña) está configurado 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

Finalmente, para mantener nuestro sistema limpio, eliminemos el usuario de prueba. El comando deluser eliminará la cuenta de usuario.

sudo deluser testuser

El sistema confirmará que el usuario ha sido eliminado.

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

Ha creado con éxito un nuevo usuario, ha probado la aplicación de la política de contraseñas y ha verificado que se aplicaron las reglas de caducidad predeterminadas.

Monitorizar Registros de Autenticación para Intentos de Inicio de Sesión Fallidos

En este paso, aprenderá a monitorizar los registros de autenticación del sistema para detectar posibles amenazas de seguridad, como ataques de fuerza bruta. Una parte clave de la administración del sistema es revisar regularmente los registros en busca de actividad sospechosa. Los intentos de inicio de sesión fallidos son un indicador crítico de intentos de acceso no autorizados. Simulará un inicio de sesión fallido y luego utilizará comandos estándar de Linux para encontrar y analizar las entradas de registro correspondientes.

En sistemas basados en Debian como Ubuntu, los eventos de autenticación (tanto exitosos como fallidos) se registran típicamente en el archivo /var/log/auth.log. Este archivo requiere privilegios de administrador para leerse.

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

su labex

El sistema le pedirá una contraseña. Escriba cualquier contraseña incorrecta, como wrongpassword, y presione Enter.

Password:
su: Authentication failure

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

su labex

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

sudo tail /var/log/auth.log

Verá varias líneas nuevas relacionadas con sus intentos fallidos de su. La salida se verá similar a esta, mostrando la marca de tiempo, el proceso (su) y el mensaje de fallo.

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 eficiente es usar grep para filtrar palabras clave específicas. Busquemos todas las líneas que contengan "authentication failure".

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

Este comando mostrará solo las líneas que coinciden con el patrón, lo que facilita la detección de los intentos fallidos que acaba de crear.

Ahora, creemos un script de shell simple para automatizar este proceso de monitorización. Este script verificará el registro en busca de fallos y presentará un resumen. En su directorio ~/project, cree un nuevo archivo llamado log_monitor.sh usando nano.

nano log_monitor.sh

Ingrese el siguiente script de Bash en el editor. Este script utiliza grep con la opción -c para contar el número de intentos de inicio de sesión fallidos y luego imprime 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 "--------------------------------"

Guarde el archivo y salga de nano presionando Ctrl+X, luego Y, y Enter.

A continuación, haga que su nuevo script sea ejecutable usando el comando chmod.

chmod +x log_monitor.sh

Finalmente, ejecute su script de monitorización para ver el resultado.

./log_monitor.sh

Dado que generó inicios 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 ha aprendido a simular, detectar y crear un script de monitorización básico para intentos de autenticación fallidos, una habilidad crucial para mantener la seguridad del sistema.

Resumen

En este laboratorio, aprendió a mejorar la seguridad del sistema Linux configurando una política de contraseñas locales robusta. Modificó el archivo /etc/security/pwquality.conf para aplicar reglas de complejidad de contraseñas utilizando el módulo pam_pwquality. Esto implicó establecer una longitud mínima de contraseña y requerir la inclusión de al menos un dígito, una letra mayúscula y una letra minúscula para proteger contra credenciales fácilmente adivinables.

Además, exploró cómo garantizar que estas políticas de contraseñas seguras se apliquen al crear nuevas cuentas de usuario. El laboratorio también cubrió la habilidad crítica de monitorizar los registros de autenticación del sistema para detectar y analizar eventos de seguridad, como intentos repetidos de inicio de sesión fallidos, que pueden indicar un ataque potencial.