
Herramienta automatizada de auditoría de seguridad para Linux que verifica más de 130 elementos del benchmark CIS en sistemas basados en RHEL, generando informes XML detallados sobre la configuración del sistema, políticas criptográficas y endurecimiento de servicios.
CIS - Red Hat Enterprise Linux 8 Benchmark v3.0.0CIS - Red Hat Enterprise Linux 8 Benchmark v3.0.0 (No es el conjunto completo del documento:).elementos:
1. Configuración Inicial
1.6 Configurar política criptográfica del sistema
1.6.1 Asegúrese de que la política criptográfica del sistema no esté configurada como heredada (legacy)
1.6.2 Asegúrese de que la política criptográfica del sistema deshabilite el soporte de hash sha1 y firmas
1.6.3 Asegúrese de que la política criptográfica del sistema deshabilite cbc para ssh
1.6.4 Asegúrese de que la política criptográfica del sistema deshabilite macs de menos de 128 bits
1.7 Configurar Banners de Advertencia de Línea de Comandos
1.7.1 Asegúrese de que el mensaje del día esté configurado correctamente
1.7.2 Asegúrese de que el banner de inicio de sesión local esté configurado correctamente
1.7.3 Asegúrese de que el banner de inicio de sesión remoto esté configurado correctamente
1.7.4 Asegúrese de que el acceso a /etc/motd esté configurado
1.7.5 Asegúrese de que el acceso a /etc/issue esté configurado
1.7.6 Asegúrese de que el acceso a /etc/issue.net esté configurado
2. Servicios
2.1 Configurar Sincronización de Tiempo
2.1.1 Asegúrese de que la sincronización de tiempo esté en uso
2.1.2 Asegúrese de que chrony esté configurado
2.1.3 Asegúrese de que chrony no se ejecute como usuario root
2.2 Configurar Servicios de Propósito Especial
2.2.1 Asegúrese de que los servicios autofs no estén en uso
2.2.2 Asegúrese de que los servicios del daemon avahi no estén en uso
2.2.3 Asegúrese de que los servicios del servidor dhcp no estén en uso
2.2.4 Asegúrese de que los servicios del servidor dns no estén en uso
2.2.5 Asegúrese de que los servicios dnsmasq no estén en uso
2.2.6 Asegúrese de que los servicios del servidor de archivos samba no estén en uso
2.2.7 Asegúrese de que los servicios del servidor ftp no estén en uso
2.2.8 Asegúrese de que los servicios del servidor de acceso a mensajes no estén en uso
2.2.9 Asegúrese de que los servicios del sistema de archivos en red no estén en uso
2.2.10 Asegúrese de que los servicios del servidor nis no estén en uso
2.2.11 Asegúrese de que los servicios del servidor de impresión no estén en uso
2.2.12 Asegúrese de que los servicios rpcbind no estén en uso
2.2.13 Asegúrese de que los servicios rsync no estén en uso
2.2.14 Asegúrese de que los servicios snmp no estén en uso
2.2.15 Asegúrese de que los servicios del servidor telnet no estén en uso
2.2.16 Asegúrese de que los servicios del servidor tftp no estén en uso
2.2.17 Asegúrese de que los servicios del servidor proxy web no estén en uso
2.2.18 Asegúrese de que los servicios del servidor web no estén en uso
2.2.19 Asegúrese de que los servicios xinetd no estén en uso
2.2.20 Asegúrese de que los servicios del servidor X window no estén en uso
2.2.21 Asegúrese de que los agentes de transferencia de correo estén configurados para modo solo local
2.2.22 Asegúrese de que solo los servicios aprobados estén escuchando en una interfaz de red
4. Acceso, Autenticación y Autorización
4.1 Configurar planificadores de trabajos
4.1.1 Configurar cron.
4.1.1.1 Asegúrese de que el daemon cron esté habilitado y activo
4.1.1.2 Asegúrese de que los permisos en /etc/crontab estén configurados
4.1.1.3 Asegúrese de que los permisos en /etc/cron.hourly estén configurados
4.1.1.4 Asegúrese de que los permisos en /etc/cron.daily estén configurados
4.1.1.5 Asegúrese de que los permisos en /etc/cron.weekly estén configurados
4.1.1.6 Asegúrese de que los permisos en /etc/cron.monthly estén configurados
4.1.1.7 Asegúrese de que los permisos en /etc/cron.d estén configurados
4.1.1.8 Asegúrese de que crontab esté restringido a usuarios autorizados
4.1.2 Configurar at
4.1.2.1 Asegúrese de que at esté restringido a usuarios autorizados
4.2 Configurar Servidor SSH
4.2.1 Asegúrese de que los permisos en /etc/ssh/sshd_config estén configurados
4.2.2 Asegúrese de que los permisos en los archivos de clave privada del host SSH estén configurados
4.2.3 Asegúrese de que los permisos en los archivos de clave pública del host SSH estén configurados
4.2.4 Asegúrese de que el acceso sshd esté configurado
4.2.5 Asegúrese de que el Banner de sshd esté configurado
4.2.6 Asegúrese de que los Cifrados de sshd estén configurados
4.2.7 Asegúrese de que ClientAliveInterval y ClientAliveCountMax de sshd estén configurados
4.2.8 Asegúrese de que DisableForwarding de sshd esté habilitado
4.2.9 Asegúrese de que HostbasedAuthentication de sshd esté deshabilitado
4.2.10 Asegúrese de que IgnoreRhosts de sshd esté habilitado
4.2.11 Asegúrese de que KexAlgorithms de sshd esté configurado
4.2.12 Asegúrese de que LoginGraceTime de sshd esté configurado
4.2.13 Asegúrese de que LogLevel de sshd esté configurado
4.2.14 Asegúrese de que los MACs de sshd estén configurados
4.2.15 Asegúrese de que MaxAuthTries de sshd esté configurado
4.2.16 Asegúrese de que MaxSessions de sshd esté configurado
4.2.17 Asegúrese de que MaxStartups de sshd esté configurado
4.2.18 Asegúrese de que PermitEmptyPasswords de sshd esté deshabilitado
4.2.19 Asegúrese de que PermitRootLogin de sshd esté deshabilitado
4.2.20 Asegúrese de que PermitUserEnvironment de sshd esté deshabilitado
4.2.21 Asegúrese de que UsePAM de sshd esté habilitado
4.2.22 Asegúrese de que crypto_policy de sshd no esté configurado
4.3 Configurar escalación de privilegios
4.3.1 Asegúrese de que sudo esté instalado
4.3.2 Asegúrese de que los comandos sudo usen pty
4.3.3 Asegúrese de que exista el archivo de registro de sudo
4.3.4 Asegúrese de que los usuarios deban proporcionar contraseña para escalación
4.3.5 Asegúrese de que la reautenticación para escalación de privilegios no esté deshabilitada globalmente
4.3.6 Asegúrese de que el tiempo de espera de autenticación de sudo esté configurado correctamente
4.3.7 Asegúrese de que el acceso al comando su esté restringido
4.4 Configurar Módulos de Autenticación Enchufables (PAM)
4.4.2 Configurar authselect
4.4.2.1 Asegúrese de que el perfil authselect activo incluya módulos pam
4.4.2.2 Asegúrese de que el módulo pam_faillock esté habilitado
4.4.2.3 Asegúrese de que el módulo pam_pwquality esté habilitado
4.4.2.4 Asegúrese de que el módulo pam_pwhistory esté habilitado
4.4.2.5 Asegúrese de que el módulo pam_unix esté habilitado
4.4.3 Configurar argumentos de módulos enchufables
4.4.3.1.1 Asegúrese de que el bloqueo por intentos fallidos de contraseña esté configurado
4.4.3.1.2 Asegúrese de que el tiempo de desbloqueo de contraseña esté configurado
4.4.3.1.3 Asegúrese de que el bloqueo por intentos fallidos de contraseña incluya la cuenta root
4.4.3.2.1 Asegúrese de que el número de caracteres cambiados en la contraseña esté configurado
4.4.3.2.2 Asegúrese de que la longitud de la contraseña esté configurada
4.4.3.2.3 Asegúrese de que la complejidad de la contraseña esté configurada (Manual)
4.4.3.2.4 Asegúrese de que el número de caracteres consecutivos iguales en la contraseña esté configurado
4.4.3.2.5 Asegúrese de que el número máximo de caracteres secuenciales en la contraseña esté configurado
4.4.3.2.6 Asegúrese de que la verificación del diccionario de contraseñas esté habilitada
4.4.3.2.7 Asegúrese de que la calidad de la contraseña sea aplicada para el usuario root
4.4.3.3.1 Asegúrese de que el historial de contraseñas recordadas esté configurado
4.4.3.3.2 Asegúrese de que el historial de contraseñas sea aplicado para el usuario root
4.4.3.3.3 Asegúrese de que pam_pwhistory incluya use_authtok
4.4.3.4.1 Asegúrese de que pam_unix no incluya nullok
4.4.3.4.2 Asegúrese de que pam_unix no incluya remember
4.4.3.4.3 Asegúrese de que pam_unix incluya un algoritmo de hash de contraseña fuerte
4.4.3.4.4 Asegúrese de que pam_unix incluya use_authtok
4.5 Cuentas de Usuario y Entorno
4.5.1 Configurar parámetros del conjunto de contraseñas shadow
4.5.1.1 Asegúrese de que el algoritmo de hash de contraseña fuerte esté configurado
4.5.1.2 Asegúrese de que la política de expiración de contraseñas sea de 180 días o menos
4.5.1.3 Asegúrese de que los días de advertencia de expiración de contraseña sean 7 o más
4.5.1.4 Asegúrese de que el bloqueo de contraseña inactiva sea de 30 días o menos
4.5.1.5 Asegúrese de que la fecha del último cambio de contraseña de todos los usuarios esté en el pasado
4.5.2 Configurar cuentas root y del sistema y entorno
4.5.2.1 Asegúrese de que el grupo predeterminado para la cuenta root sea GID 0
4.5.2.2 Asegúrese de que el umask del usuario root esté configurado
4.5.2.3 Asegúrese de que las cuentas del sistema estén aseguradas
4.5.2.4 Asegúrese de que la contraseña de root esté establecida
4.5.3 Configurar entorno predeterminado del usuario
4.5.3.1 Asegúrese de que nologin no esté listado en /etc/shells
4.5.3.2 Asegúrese de que el tiempo de espera del shell predeterminado del usuario esté configurado
4.5.3.3 Asegúrese de que el umask predeterminado del usuario esté configurado
5. Registro y Auditoría
5.1 Configurar Registro
5.1.1 Configurar rsyslog
5.1.1.1 Asegúrese de que rsyslog esté instalado
5.1.1.2 Asegúrese de que el servicio rsyslog esté habilitado
5.1.1.4 Asegúrese de que los permisos predeterminados de archivo de rsyslog estén configurados
5.1.1.5 Asegúrese de que el registro esté configurado
5.1.1.6 Asegúrese de que rsyslog esté configurado para enviar registros a un host de registro remoto
5.1.1.7 Asegúrese de que rsyslog no esté configurado para recibir registros de un cliente remoto
6. Mantenimiento del Sistema
6.1 Permisos de Archivos del Sistema
6.1.1 Asegúrese de que los permisos en /etc/passwd estén configurados
6.1.2 Asegúrese de que los permisos en /etc/passwd- estén configurados
6.1.3 Asegúrese de que los permisos en /etc/opasswd estén configurados
6.1.4 Asegúrese de que los permisos en /etc/group estén configurados
6.1.5 Asegúrese de que los permisos en /etc/group- estén configurados
6.1.6 Asegúrese de que los permisos en /etc/shadow estén configurados
6.1.7 Asegúrese de que los permisos en /etc/shadow- estén configurados
6.1.8 Asegúrese de que los permisos en /etc/gshadow estén configurados
6.1.9 Asegúrese de que los permisos en /etc/gshadow- estén configurados
6.1.10 Asegúrese de que los permisos en /etc/shells estén configurados
6.1.11 Asegúrese de que los archivos y directorios escribibles globalmente estén asegurados
6.1.12 Asegúrese de que no existan archivos o directorios sin propietario o sin grupo
6.1.13 Asegúrese de que los archivos SUID y SGID sean revisados
6.1.14 Auditar permisos de archivos del sistema
6.2 Configuración de Usuarios y Grupos Locales
6.2.1 Asegúrese de que las cuentas en /etc/passwd usen contraseñas shadow
6.2.2 Asegúrese de que los campos de contraseña de /etc/shadow no estén vacíos
6.2.3 Asegúrese de que todos los grupos en /etc/passwd existan en /etc/group
6.2.4 Asegúrese de que no existan UIDs duplicados
6.2.5 Asegúrese de que no existan GIDs duplicados
6.2.6 Asegúrese de que no existan nombres de usuario duplicados
6.2.7 Asegúrese de que no existan nombres de grupo duplicados
6.2.8 Asegúrese de la integridad de la ruta root
6.2.9 Asegúrese de que root sea la única cuenta con UID 0
6.2.10 Asegúrese de que los directorios home de los usuarios interactivos locales estén configurados
6.2.11 Asegúrese de que el acceso a los archivos de puntos de usuarios interactivos locales esté configurado

$ date
Tue Aug 6 04:00:37 UTC 2024
$ python3 -V
Python 3.6.8
$ sudo python3 main.py
===========================================================
Linux Security Audit Tool 1.0.1 (2024.08.06)
by password123456
===========================================================
[+][2024-08-06 04:01:14] Start Security Audit.
---------------------------------------------------------
Hostname: buddy2
OS: Rocky Linux 8.8 (Green Obsidian)
IP Address: [ens192] 172.16.13.51
MAC Address: [ens192] 00:50:56:a6:76:b8
[+] 1.Initial Setup
---------------------------------------------------------
1.6.Configure system wide crypto policy
[pass] 1.6.1 : Ensure system wide crypto policy is not set to legacy
[fault] 1.6.2 : Ensure system wide crypto policy disables sha1 hash and signature support
[pass] 1.6.3 : Ensure system wide crypto policy disables cbc for ssh
[manual] 1.6.4 : Ensure system wide crypto policy disables macs less than 128 bits
1.7.Configure Command Line Warning Banners
[pass] 1.7.1 : Ensure message of the day is configured properly
[fault] 1.7.2 : Ensure local login warning banner is configured properly
[pass] 1.7.3 : Ensure remote login warning banner is configured properly
[pass] 1.7.4 : Ensure access to /etc/motd is configured
[pass] 1.7.5 : Ensure access to /etc/issue is configured
[pass] 1.7.6 : Ensure access to /etc/issue.net is configured
...
[*] RESULT
---------------------------------------------------------
output=/home/buddy/1722884474_buddy2_audit.xml
---------------------------------------------------------
[+][2024-08-06 04:01:57] End Security Audit.
$ cat 1722884474_buddy2_audit.xml
<?xml version="1.0" encoding="UTF-8"?>
<results>
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:14</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.8 (Green Obsidian)</os_name>
<os_version>8.8</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:76:b8</mac_address>
<item_no>1.6.1</item_no>
<item_title>Ensure system wide crypto policy is not set to legacy</item_title>
<result>pass</result>
<result_code>0</result_code>
<raw_data>
<![CDATA[
[ok] Not Found: /etc/crypto-policies/config --> ^[ \t]*(\bLEGACY\b)
# cat /etc/crypto-policies/config
...
DEFAULT
]]>
</raw_data>
</items>
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:14</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.8 (Green Obsidian)</os_name>
<os_version>8.8</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:76:b8</mac_address>
<item_no>1.6.2</item_no>
<item_title>Ensure system wide crypto policy disables sha1 hash and signature support</item_title>
<result>fault</result>
<result_code>1</result_code>
<raw_data>
<![CDATA[
[vul] Found: /etc/crypto-policies/state/CURRENT.pol
- found: ^[ \t]*(hash|sign)[ \t]*=[ \t]*([^\n\r#]+)?-sha1\b --> `ECDSA-SHA1,RSA-PSS-SHA1,RSA-SHA1` near at line: 13
# cat /etc/crypto-policies/state/CURRENT.pol
...
11: mac = AEAD HMAC-SHA2-256 HMAC-SHA1 UMAC-128 HMAC-SHA2-384 HMAC-SHA2-512
12: protocol =
13: sign = ECDSA-SHA3-256 ECDSA-SHA2-256 ECDSA-SHA3-384 ECDSA-SHA2-384 ECDSA-SHA3-512 ECDSA-SHA2-512 EDDSA-ED25519 EDDSA-ED448 RSA-PSS-SHA2-
256 RSA-PSS-SHA2-384 RSA-PSS-SHA2-512 RSA-SHA3-256 RSA-SHA2-256 RSA-SHA3-384 RSA-SHA2-384 RSA-SHA3-512 RSA-SHA2-512 ECDSA-SHA2-224 RSA-PSS-S
HA2-224 RSA-SHA2-224 ECDSA-SHA1 RSA-PSS-SHA1 RSA-SHA1
14: arbitrary_dh_groups = 1
15: min_dh_size = 2048
[vul] Found: /etc/crypto-policies/state/CURRENT.pol
- found: ^[ \t]*sha1_in_certs[ \t]*=[ \t]*(0|1)$ --> `1` near at line: 18
# cat /etc/crypto-policies/state/CURRENT.pol
...
16: min_dsa_size = 2048
17: min_rsa_size = 2048
18: sha1_in_certs = 1
19: ssh_certs = 1
20: ssh_etm = 1
]]>
</raw_data>
</items>
...
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:38</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.7 (Green Obsidian)</os_name>
<os_version>8.7</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:4a:80</mac_address>
<item_no>6.1.10</item_no>
<item_title>Ensure permissions on /etc/shells are configured</item_title>
<result>pass</result>
<result_code>0</result_code>
<raw_data>
<![CDATA[
[ok] -rw-r--r-- 1 root root 44 Sep 10 20:51 /etc/shells
- permissions: 644
- owner:group: root:root
]]>
</raw_data>
</items>
</results>
La misión fue implementar esta herramienta usando casi un 100% de código Python puro. Sin embargo, hubo casos específicos donde el uso de comandos de shell era inevitable.
Casos inevitables:
find que con código Python nativo.Este script evita el patrón común de código Python > subprocess para ejecutar comandos de shell > analizar salida siempre que sea posible, y está construido con más del 90% de código Python puro.
pass, fault, manual, error) como los datos brutos del sistema para verificación.Los datos de auditoría en bruto en los registros pueden parecer desordenados, dependiendo de tu perspectiva.Siéntete libre de revisar el código base y adaptarlo a tus requisitos específicos.