Configuración Inicial de Seguridad en CentOS/Rocky Linux

Asegurar tu servidor CentOS o Rocky Linux inmediatamente después del despliegue es esencial para proteger contra accesos no autorizados, amenazas cibernéticas y brechas de seguridad. Esta guía completa proporciona instrucciones paso a paso para endurecer distribuciones basadas en RHEL, implementando mejores prácticas de seguridad específicas para sistemas CentOS, Rocky Linux, AlmaLinux y Red Hat Enterprise Linux.

Tabla de Contenidos

Requisitos Previos

Antes de comenzar el proceso de configuración de seguridad, asegúrate de tener:

  • Instalación fresca de CentOS Stream 8/9, Rocky Linux 8/9, AlmaLinux 8/9 o RHEL 8/9
  • Acceso root o usuario con privilegios sudo
  • Acceso SSH al servidor
  • Dirección IP del servidor o hostname
  • Comprensión básica de línea de comandos Linux y herramientas específicas de RHEL
  • Acceso a consola del servidor (vía panel del proveedor de hosting) en caso de bloqueo
  • Al menos 1GB RAM y 10GB de espacio en disco disponible

Entendiendo la Seguridad Basada en RHEL

Red Hat Enterprise Linux y sus derivados (CentOS, Rocky Linux, AlmaLinux) incluyen características de seguridad de nivel empresarial que los distinguen de las distribuciones basadas en Debian:

Características clave de seguridad de RHEL:

  • SELinux (Security-Enhanced Linux): Sistema de Control de Acceso Obligatorio (MAC) habilitado por defecto
  • firewalld: Gestor de firewall dinámico con zonas y reglas enriquecidas
  • dnf/yum: Gestor de paquetes con características de seguridad integradas y modularidad
  • Cumplimiento FIPS 140-2: Certificación de estándares de seguridad federal
  • Subsistema de auditoría: Auditoría completa del sistema habilitada por defecto

Diferencias en filosofía de seguridad:

  • Los sistemas basados en RHEL priorizan estabilidad y seguridad empresarial sobre características de última generación
  • SELinux proporciona una capa de seguridad adicional más allá del DAC tradicional (Control de Acceso Discrecional)
  • Las actualizaciones de paquetes son probadas exhaustivamente antes del lanzamiento, reduciendo cambios disruptivos
  • Ciclo de vida de soporte extendido (10+ años para RHEL/Rocky/Alma)

Paso 1: Actualizar Paquetes del Sistema

Actualizar todos los paquetes del sistema para parchear vulnerabilidades conocidas y problemas de seguridad.

# Actualizar metadatos del repositorio de paquetes
sudo dnf check-update

# Actualizar todos los paquetes instalados
sudo dnf upgrade -y

# O usar yum en sistemas antiguos
sudo yum update -y

# Limpiar caché de paquetes
sudo dnf clean all

Por qué esto importa: Las distribuciones basadas en Red Hat reciben actualizaciones de seguridad regulares a través de sus flujos de actualización. El comando dnf upgrade actualiza todos los paquetes incluyendo el kernel, lo que puede requerir un reinicio para tomar efecto.

Verificar actualizaciones de seguridad disponibles específicamente:

# Listar actualizaciones de seguridad disponibles
sudo dnf updateinfo list security

# Instalar solo actualizaciones de seguridad
sudo dnf upgrade --security -y

# Ver información detallada de actualizaciones de seguridad
sudo dnf updateinfo info

Verificar versión del kernel:

# Verificar kernel en ejecución actual
uname -r

# Listar kernels instalados
rpm -qa kernel

# Ver actualizaciones de kernel disponibles
dnf list kernel

Si se instaló un nuevo kernel, reinicia el servidor:

# Reiniciar sistema para cargar nuevo kernel
sudo reboot

Después del reinicio, reconecta y verifica:

# Confirmar que el nuevo kernel está en ejecución
uname -r

# Verificar tiempo de actividad del sistema
uptime

Paso 2: Crear un Usuario Administrativo No-Root

Ejecutar operaciones como root viola el principio de menor privilegio. Crea un usuario administrativo dedicado con acceso sudo.

# Crear nuevo usuario (reemplaza 'adminuser' con tu nombre de usuario preferido)
sudo useradd -m -s /bin/bash adminuser

# Establecer contraseña fuerte para el nuevo usuario
sudo passwd adminuser

Ingresa una contraseña fuerte que contenga mayúsculas, minúsculas, números y caracteres especiales.

# Agregar usuario al grupo wheel para privilegios sudo (específico de RHEL)
sudo usermod -aG wheel adminuser

# Verificar membresía de grupo del usuario
groups adminuser
id adminuser

Nota específica de RHEL: A diferencia de los sistemas basados en Debian que usan el grupo sudo, las distribuciones basadas en RHEL usan el grupo wheel para privilegios administrativos. Esto está configurado en /etc/sudoers.

Verificar configuración de sudo del grupo wheel:

# Verificar configuración de sudoers para el grupo wheel
sudo grep -E "^%wheel" /etc/sudoers

Deberías ver:

%wheel  ALL=(ALL)       ALL

Probar acceso sudo:

# Cambiar al nuevo usuario
su - adminuser

# Probar privilegios sudo
sudo whoami
# Debería mostrar: root

# Ver permisos sudo
sudo -l

Opcional: Configurar sudo sin contraseña para conveniencia (usar con precaución):

# Editar archivo sudoers usando visudo
sudo visudo

# Agregar esta línea para sudo sin contraseña (balance de seguridad)
adminuser ALL=(ALL) NOPASSWD: ALL

Paso 3: Configurar Autenticación con Clave SSH

La autenticación con clave SSH es significativamente más segura que la autenticación con contraseña y esencial para la seguridad adecuada del servidor.

Generar Par de Claves SSH (en tu máquina local)

Si no tienes un par de claves SSH:

# Generar clave Ed25519 (recomendado para sistemas modernos)
ssh-keygen -t ed25519 -C "[email protected]"

# O generar clave RSA de 4096 bits (para máxima compatibilidad)
ssh-keygen -t rsa -b 4096 -C "[email protected]"

Acepta la ubicación predeterminada y establece una frase de contraseña fuerte para la clave.

Copiar Clave Pública al Servidor

# Copiar clave pública a tu nuevo usuario administrativo
ssh-copy-id adminuser@your_server_ip

# Con puerto SSH personalizado
ssh-copy-id -p 2222 adminuser@your_server_ip

# Método manual si ssh-copy-id no está disponible
cat ~/.ssh/id_ed25519.pub | ssh adminuser@your_server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Verificar que la Autenticación con Clave Funciona

# Probar conexión con nuevo usuario usando autenticación con clave
ssh adminuser@your_server_ip

# Debería conectarse sin ingresar la contraseña del servidor
# (solo tu frase de contraseña de clave SSH si estableciste una)

Crítico: Mantén tu sesión SSH actual abierta mientras pruebas para evitar bloqueo.

Establecer Permisos Apropiados

Asegurar propiedad y permisos correctos en directorios SSH:

# En el servidor, como tu usuario administrativo
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# Verificar propiedad
ls -la ~/.ssh/

# Debería mostrar:
# drwx------ (700) para directorio .ssh
# -rw------- (600) para archivo authorized_keys

# Asegurar propiedad correcta
sudo chown -R adminuser:adminuser ~/.ssh

Configurar Contexto SELinux para Claves SSH

SELinux requiere contextos de seguridad apropiados para directorios SSH:

# Restaurar contextos SELinux predeterminados
restorecon -R -v ~/.ssh

# Verificar contexto SELinux
ls -Z ~/.ssh/
# Debería mostrar: contexto ssh_home_t

Paso 4: Endurecer la Configuración SSH

Modificar configuración del demonio SSH para implementar mejores prácticas de seguridad para sistemas basados en RHEL.

# Respaldar configuración SSH original
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d)

# Editar configuración SSH
sudo vi /etc/ssh/sshd_config
# O usar nano: sudo nano /etc/ssh/sshd_config

Aplicar estas configuraciones de endurecimiento de seguridad:

# Deshabilitar inicio de sesión root vía SSH
PermitRootLogin no

# Deshabilitar autenticación con contraseña (¡solo después de que la autenticación con clave funcione!)
PasswordAuthentication no

# Deshabilitar contraseñas vacías
PermitEmptyPasswords no

# Deshabilitar autenticación challenge-response
ChallengeResponseAuthentication no

# Deshabilitar autenticación keyboard-interactive
KbdInteractiveAuthentication no

# Permitir solo usuarios específicos
AllowUsers adminuser

# O permitir solo grupos específicos
AllowGroups wheel

# Deshabilitar reenvío X11 si no es necesario
X11Forwarding no

# Establecer intentos máximos de autenticación
MaxAuthTries 3

# Reducir tiempo de gracia de inicio de sesión
LoginGraceTime 30

# Sesiones concurrentes máximas
MaxSessions 5

# Usar algoritmos de intercambio de claves fuertes
KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group-exchange-sha256

# Usar cifrados fuertes
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr

# Usar algoritmos MAC fuertes
MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256

# Deshabilitar métodos de autenticación no utilizados
PubkeyAuthentication yes
GSSAPIAuthentication no
HostbasedAuthentication no
IgnoreRhosts yes

# Habilitar modo estricto
StrictModes yes

# Deshabilitar reenvío TCP si no es necesario (opcional)
AllowTcpForwarding no

# Deshabilitar reenvío de agente si no es necesario (opcional)
AllowAgentForwarding no

# Establecer intervalo de cliente activo para prevenir timeouts
ClientAliveInterval 300
ClientAliveCountMax 2

# Verbosidad de log para monitoreo de seguridad
LogLevel VERBOSE

# Usar separación de privilegios
UsePrivilegeSeparation sandbox

Probar sintaxis de configuración SSH:

# Verificar que la configuración no tiene errores de sintaxis
sudo sshd -t

# Si se encuentran errores, corrígelos antes de reiniciar

Reiniciar servicio SSH:

# Reiniciar demonio SSH para aplicar cambios
sudo systemctl restart sshd

# Verificar que el servicio SSH está en ejecución
sudo systemctl status sshd

# Verificar si SSH está escuchando
sudo ss -tlnp | grep sshd

Probar nueva configuración en una terminal separada antes de cerrar tu sesión actual:

# Abrir nueva terminal y probar conexión
ssh adminuser@your_server_ip

# Verificar que la conexión funciona con autenticación con clave
# Intentar inicio de sesión root (debería ser denegado)
ssh root@your_server_ip
# Debería fallar con "Permission denied"

Paso 5: Configurar Firewalld

Firewalld es la solución de firewall dinámico predeterminada para distribuciones basadas en RHEL, proporcionando gestión de red basada en zonas.

# Instalar firewalld (usualmente preinstalado)
sudo dnf install firewalld -y

# Iniciar y habilitar firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# Verificar estado de firewalld
sudo systemctl status firewalld
sudo firewall-cmd --state

Configurar reglas de firewall:

# Ver zona predeterminada
sudo firewall-cmd --get-default-zone

# Listar todas las zonas
sudo firewall-cmd --get-zones

# Ver zonas activas
sudo firewall-cmd --get-active-zones

# Establecer zona predeterminada a public (recomendado)
sudo firewall-cmd --set-default-zone=public

Agregar servicios esenciales:

# Agregar servicio SSH (¡crítico para evitar bloqueo!)
sudo firewall-cmd --permanent --add-service=ssh

# Agregar HTTP y HTTPS para servidores web
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# O usar números de puerto directamente
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp

# Recargar firewall para aplicar cambios
sudo firewall-cmd --reload

# Verificar reglas activas
sudo firewall-cmd --list-all

Salida esperada:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Configuración avanzada de firewalld:

# Permitir IP específica a todos los puertos
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" accept'

# Permitir IP específica a puerto específico
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.50" port port="22" protocol="tcp" accept'

# Bloquear IP específica
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.100" reject'

# Permitir rango de puertos
sudo firewall-cmd --permanent --add-port=8000-8100/tcp

# Habilitar masquerading (NAT)
sudo firewall-cmd --permanent --add-masquerade

# Reenviar puerto
sudo firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80

# Recargar después de cambios
sudo firewall-cmd --reload

# Listar todas las reglas
sudo firewall-cmd --list-all-zones

Conceptos de zonas de Firewalld:

  • drop: Paquetes entrantes descartados sin respuesta (más restrictivo)
  • block: Entrantes rechazados con mensaje icmp-host-prohibited
  • public: Para redes públicas no confiables (predeterminado para servidores)
  • external: Para redes externas con masquerading
  • dmz: Para sistemas DMZ con acceso limitado
  • work: Para redes de trabajo con más confianza
  • home: Para redes domésticas con mayor confianza
  • internal: Para redes internas
  • trusted: Todas las conexiones aceptadas (menos restrictivo)

Paso 6: Instalar y Configurar Fail2Ban

Fail2Ban protege contra ataques de fuerza bruta monitoreando logs y bloqueando direcciones IP maliciosas.

# Habilitar repositorio EPEL (Extra Packages for Enterprise Linux)
sudo dnf install epel-release -y

# Instalar Fail2Ban
sudo dnf install fail2ban fail2ban-firewalld -y

# Crear archivo de configuración local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Editar configuración local
sudo vi /etc/fail2ban/jail.local

Configurar Fail2Ban para sistemas basados en RHEL:

[DEFAULT]
# Bloquear hosts por 1 hora
bantime = 3600

# Monitorear intentos fallidos durante 10 minutos
findtime = 600

# Bloquear después de 5 intentos fallidos
maxretry = 5

# Backend (systemd para RHEL 8+)
backend = systemd

# Notificaciones por email (opcional)
destemail = [email protected]
sendername = Fail2Ban
action = %(action_mwl)s

# Usar firewalld para acciones de bloqueo
banaction = firewallcmd-ipset
banaction_allports = firewallcmd-ipset

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 7200

Crear política SELinux para Fail2Ban (si es necesario):

# Verificar denegaciones de SELinux
sudo ausearch -c 'fail2ban-server' --raw | audit2allow -M fail2ban
sudo semodule -i fail2ban.pp

Iniciar y habilitar Fail2Ban:

# Iniciar servicio Fail2Ban
sudo systemctl start fail2ban

# Habilitar Fail2Ban para iniciar en el arranque
sudo systemctl enable fail2ban

# Verificar estado de Fail2Ban
sudo systemctl status fail2ban

# Ver jails habilitadas
sudo fail2ban-client status

# Ver estado de jail SSH e IPs bloqueadas
sudo fail2ban-client status sshd

Comandos de gestión de Fail2Ban:

# Desbloquear una dirección IP
sudo fail2ban-client set sshd unbanip 203.0.113.50

# Bloquear una dirección IP manualmente
sudo fail2ban-client set sshd banip 203.0.113.100

# Ver IPs bloqueadas en firewalld
sudo firewall-cmd --direct --get-all-rules

# Recargar Fail2Ban
sudo fail2ban-client reload

# Ver logs de Fail2Ban
sudo tail -f /var/log/fail2ban.log

Configurar jails adicionales para servicios comunes:

# Editar jail.local para agregar más protecciones
sudo vi /etc/fail2ban/jail.local

# Agregar estas secciones para servicios adicionales:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3

[postfix]
enabled = true
port = smtp,465,submission
logpath = /var/log/maillog
maxretry = 5

[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission,465,sieve
logpath = /var/log/dovecot.log
maxretry = 3

Paso 7: Configurar SELinux

SELinux (Security-Enhanced Linux) es un sistema de control de acceso obligatorio que proporciona una capa de seguridad adicional más allá de los permisos tradicionales.

Verificar estado de SELinux:

# Ver estado de SELinux
sudo sestatus

# Verificar modo actual
getenforce

Modos de SELinux:

  • Enforcing: SELinux aplica activamente la política de seguridad (recomendado)
  • Permissive: SELinux registra violaciones pero no las aplica (para resolución de problemas)
  • Disabled: SELinux está completamente deshabilitado (no recomendado)

Mantener SELinux en modo enforcing (predeterminado en sistemas basados en RHEL):

# Asegurar que SELinux esté en enforcing
sudo setenforce 1

# Hacerlo persistente
sudo vi /etc/selinux/config

# Establecer:
SELINUX=enforcing
SELINUXTYPE=targeted

Tareas comunes de gestión de SELinux:

# Instalar herramientas de gestión de SELinux
sudo dnf install policycoreutils-python-utils setroubleshoot-server -y

# Ver denegaciones de SELinux
sudo ausearch -m AVC,USER_AVC -ts recent

# Generar reglas de permiso desde denegaciones
sudo ausearch -m AVC,USER_AVC -ts recent | audit2allow -M custom_policy
sudo semodule -i custom_policy.pp

# Ver módulos SELinux cargados
sudo semodule -l

# Verificar contexto de archivo
ls -Z /path/to/file

# Restaurar contextos de archivo predeterminados
sudo restorecon -Rv /path/to/directory

# Cambiar contexto de archivo
sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
sudo restorecon -Rv /web

# Ver opciones booleanas de SELinux
sudo getsebool -a

# Habilitar booleano de SELinux
sudo setsebool -P httpd_can_network_connect on

# Ver contextos de puerto de SELinux
sudo semanage port -l

# Agregar puerto a contexto SELinux
sudo semanage port -a -t http_port_t -p tcp 8080

Resolución de problemas de SELinux:

# Ver alertas de SELinux
sudo sealert -a /var/log/audit/audit.log

# Generar reporte legible por humanos
sudo sealert -a /var/log/audit/audit.log > /tmp/selinux-report.txt

# Establecer temporalmente a permissive para pruebas
sudo setenforce 0

# Regresar a enforcing después de corregir problemas
sudo setenforce 1

Importante: Nunca deshabilites SELinux en servidores de producción. Si encuentras problemas, usa modo permissive temporalmente para identificar problemas, luego crea políticas apropiadas.

Paso 8: Configurar Actualizaciones de Seguridad Automáticas

Configurar DNF Automatic para instalar actualizaciones de seguridad automáticamente.

# Instalar dnf-automatic
sudo dnf install dnf-automatic -y

# Editar configuración
sudo vi /etc/dnf/automatic.conf

Configurar actualizaciones automáticas:

[commands]
# Qué tipo de actualización realizar:
# default = todas las actualizaciones disponibles
# security = solo actualizaciones de seguridad
upgrade_type = security

# Si descargar actualizaciones
download_updates = yes

# Si aplicar actualizaciones
apply_updates = yes

[emitters]
# Emitir vía email
emit_via = email
email_from = root@localhost
email_to = [email protected]

# Emitir vía systemd
system_name = your-server-hostname

[email]
email_host = localhost

Habilitar actualizaciones automáticas:

# Habilitar e iniciar temporizador dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

# Verificar estado del temporizador
sudo systemctl status dnf-automatic.timer

# Listar todos los temporizadores
sudo systemctl list-timers

# Ver logs de dnf-automatic
sudo journalctl -u dnf-automatic.timer

Alternativa: Solo descargar actualizaciones automáticamente:

# Editar configuración para solo descargar
sudo vi /etc/dnf/automatic.conf

# Establecer:
apply_updates = no

# Usar temporizador de descarga en su lugar
sudo systemctl enable --now dnf-automatic-download.timer

Verificación manual de actualizaciones de seguridad:

# Verificar actualizaciones de seguridad
sudo dnf updateinfo list security

# Aplicar actualizaciones de seguridad
sudo dnf upgrade --security -y

# Ver historial de actualizaciones
sudo dnf history

Paso 9: Configurar Zona Horaria y NTP

La configuración correcta del tiempo es esencial para logging, autenticación y tareas programadas.

# Verificar zona horaria actual y estado del tiempo
timedatectl

# Listar zonas horarias disponibles
timedatectl list-timezones

# Establecer zona horaria (ejemplo: UTC)
sudo timedatectl set-timezone UTC

# O establecer a ubicación específica
sudo timedatectl set-timezone America/New_York

Configurar sincronización de tiempo NTP:

# Instalar chrony (predeterminado en RHEL 8+)
sudo dnf install chrony -y

# Habilitar e iniciar chronyd
sudo systemctl enable chronyd
sudo systemctl start chronyd

# Verificar estado de chrony
sudo systemctl status chronyd

# Ver fuentes de tiempo
chronyc sources -v

# Verificar estado de sincronización
chronyc tracking

Configurar chrony:

# Editar configuración de chrony
sudo vi /etc/chrony.conf

# Agregar o modificar servidores NTP:
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst

# Permitir acceso de cliente NTP desde red local (opcional)
allow 192.168.1.0/24

# Reiniciar chrony para aplicar cambios
sudo systemctl restart chronyd

Verificar sincronización de tiempo:

# Verificar tiempo del sistema
date

# Verificar sincronización NTP
timedatectl status

# Ver estadísticas de chrony
chronyc activity

# Forzar sincronización
sudo chronyc makestep

Paso 10: Deshabilitar Servicios Innecesarios

Reducir superficie de ataque deshabilitando servicios no requeridos para la función de tu servidor.

# Listar todos los servicios en ejecución
sudo systemctl list-units --type=service --state=running

# Listar todos los servicios habilitados
sudo systemctl list-unit-files --type=service --state=enabled

Servicios comunes a considerar deshabilitar en servidores:

# Deshabilitar Bluetooth
sudo systemctl disable bluetooth.service
sudo systemctl stop bluetooth.service

# Deshabilitar impresión CUPS
sudo systemctl disable cups.service
sudo systemctl stop cups.service

# Deshabilitar Avahi (a menos que uses mDNS/Zeroconf)
sudo systemctl disable avahi-daemon.service
sudo systemctl stop avahi-daemon.service

# Deshabilitar ModemManager
sudo systemctl disable ModemManager.service
sudo systemctl stop ModemManager.service

# Deshabilitar postfix si no usas correo
sudo systemctl disable postfix.service
sudo systemctl stop postfix.service

# Enmascarar servicios para prevenir que inicien
sudo systemctl mask bluetooth.service

Eliminar paquetes innecesarios:

# Listar paquetes instalados
rpm -qa

# Eliminar paquete específico
sudo dnf remove package_name -y

# Eliminar dependencias no utilizadas
sudo dnf autoremove -y

# Limpiar caché de paquetes
sudo dnf clean all

Deshabilitar protocolos de red innecesarios:

# Deshabilitar IPv6 si no se usa
sudo vi /etc/sysctl.conf

# Agregar estas líneas:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# Aplicar cambios
sudo sysctl -p

# Verificar que IPv6 está deshabilitado
ip a | grep inet6

Revisar y deshabilitar módulos del kernel:

# Listar módulos del kernel cargados
lsmod

# Deshabilitar módulo específico
echo "blacklist modulename" | sudo tee /etc/modprobe.d/blacklist-modulename.conf

# Módulos comunes a considerar deshabilitar:
# Almacenamiento USB (si no es necesario)
echo "install usb-storage /bin/true" | sudo tee /etc/modprobe.d/disable-usb-storage.conf

# Bluetooth
echo "install bluetooth /bin/true" | sudo tee /etc/modprobe.d/disable-bluetooth.conf

Paso 11: Implementar Medidas de Seguridad Adicionales

Configurar Límites del Sistema

# Editar límites del sistema
sudo vi /etc/security/limits.conf

# Agregar límites de recursos:
* soft nofile 65536
* hard nofile 65536
* soft nproc 32768
* hard nproc 32768
root soft nofile 65536
root hard nofile 65536

Endurecer Parámetros del Kernel

# Editar configuración de sysctl
sudo vi /etc/sysctl.d/99-security.conf

# Agregar parámetros del kernel relacionados con seguridad:
# Reenvío IP (deshabilitar a menos que sea enrutamiento)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# Deshabilitar enrutamiento de paquetes de origen
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# Deshabilitar aceptación de redirección ICMP
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# Deshabilitar aceptación de redirección ICMP segura
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# Habilitar verificación de dirección de origen
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Registrar paquetes marcianos
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# Ignorar solicitudes de ping ICMP
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Ignorar respuestas de error ICMP falsas
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Habilitar cookies TCP SYN (protección contra flood SYN)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# Deshabilitar anuncios de enrutador IPv6
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

# Aumentar límites de descriptor de archivo del sistema
fs.file-max = 2097152

# Deshabilitar volcados de núcleo
fs.suid_dumpable = 0
kernel.core_uses_pid = 1

# Habilitar ExecShield (protección contra desbordamiento de búfer)
kernel.exec-shield = 1
kernel.randomize_va_space = 2

Aplicar parámetros del kernel:

# Cargar nueva configuración de sysctl
sudo sysctl -p /etc/sysctl.d/99-security.conf

# Verificar configuración
sudo sysctl -a | grep net.ipv4.tcp_syncookies

Configurar Sistema de Auditoría

# Auditd está instalado por defecto en sistemas basados en RHEL
# Verificar que auditd está en ejecución
sudo systemctl status auditd

# Habilitar auditd
sudo systemctl enable auditd

# Ver configuración de auditoría
sudo vi /etc/audit/auditd.conf

# Agregar reglas de auditoría
sudo vi /etc/audit/rules.d/custom.rules

Agregar estas reglas de auditoría:

# Monitorear intentos de autenticación
-w /var/log/lastlog -p wa -k logins
-w /var/run/faillock/ -p wa -k logins

# Monitorear cambios en el entorno de red
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k network_modifications
-w /etc/hosts -p wa -k network_modifications
-w /etc/sysconfig/network -p wa -k network_modifications

# Monitorear cambios a archivos de seguridad
-w /etc/selinux/ -p wa -k selinux_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes

# Monitorear configuración SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes

# Monitorear configuración de firewall
-w /etc/firewalld/ -p wa -k firewall_changes

Cargar reglas de auditoría:

# Cargar reglas de auditoría personalizadas
sudo augenrules --load

# Ver reglas de auditoría cargadas
sudo auditctl -l

# Buscar logs de auditoría
sudo ausearch -k logins
sudo ausearch -k network_modifications

Configurar Políticas de Contraseñas

# Instalar biblioteca de calidad de contraseñas
sudo dnf install libpwquality -y

# Configurar requisitos de contraseñas
sudo vi /etc/security/pwquality.conf

Establecer requisitos de contraseñas fuertes:

# Longitud mínima de contraseña
minlen = 14

# Requerir al menos un dígito
dcredit = -1

# Requerir al menos un carácter en mayúscula
ucredit = -1

# Requerir al menos un carácter en minúscula
lcredit = -1

# Requerir al menos un carácter especial
ocredit = -1

# Número máximo de caracteres consecutivos
maxrepeat = 3

# Número máximo de misma clase de caracteres
maxclassrepeat = 4

# Número mínimo de clases de caracteres
minclass = 4

Configurar envejecimiento de contraseñas:

# Editar login.defs
sudo vi /etc/login.defs

# Establecer envejecimiento de contraseñas:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
PASS_MIN_LEN 14

Verificación

Después de completar todas las configuraciones de seguridad, verificar que todo funciona correctamente.

Verificación Completa de Seguridad

# Crear script de verificación de seguridad
cat << 'EOF' | sudo tee /usr/local/bin/security-check.sh
#!/bin/bash
echo "=== Estado de Seguridad del Sistema ==="
echo ""
echo "--- Actualizaciones de Paquetes ---"
dnf check-update | head -10
echo ""
echo "--- Configuración SSH ---"
sshd -t && echo "Config SSH: OK" || echo "Config SSH: ERROR"
echo ""
echo "--- Estado del Firewall ---"
firewall-cmd --state
firewall-cmd --list-all
echo ""
echo "--- Estado de Fail2Ban ---"
systemctl is-active fail2ban
fail2ban-client status
echo ""
echo "--- Estado de SELinux ---"
sestatus
echo ""
echo "--- Puertos Abiertos ---"
ss -tulnp
echo ""
echo "--- Intentos de Inicio de Sesión Recientes ---"
grep "Failed password" /var/log/secure | tail -10
echo ""
echo "--- Reglas de Auditoría ---"
auditctl -l | wc -l
echo ""
EOF

# Hacer script ejecutable
sudo chmod +x /usr/local/bin/security-check.sh

# Ejecutar verificación de seguridad
sudo /usr/local/bin/security-check.sh

Verificar Componentes Individuales

# Verificar seguridad SSH
sudo sshd -t
sudo systemctl status sshd

# Verificar firewall
sudo firewall-cmd --state
sudo firewall-cmd --list-all

# Verificar Fail2Ban
sudo systemctl status fail2ban
sudo fail2ban-client status sshd

# Verificar SELinux
sudo sestatus
sudo ausearch -m AVC -ts recent

# Verificar actualizaciones automáticas
sudo systemctl status dnf-automatic.timer

# Verificar sincronización de tiempo
chronyc tracking

# Verificar sistema de auditoría
sudo systemctl status auditd
sudo auditctl -l

Resolución de Problemas

Problemas de Conexión SSH Después del Endurecimiento

Problema: No se puede conectar vía SSH después de cambios de configuración.

Solución:

# Acceder vía consola y verificar estado SSH
sudo systemctl status sshd

# Verificar errores de configuración
sudo sshd -t

# Ver logs SSH
sudo journalctl -u sshd -n 50

# Verificar denegaciones de SELinux
sudo ausearch -m AVC -c sshd

# Permitir temporalmente todo SSH
sudo semanage permissive -a sshd_t

# Corregir y regresar a enforcing
sudo semanage permissive -d sshd_t

Firewalld Bloqueando Servicios

Problema: No se puede acceder a servicios después de habilitar firewalld.

Solución:

# Verificar reglas de firewall
sudo firewall-cmd --list-all

# Agregar servicio faltante
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

# Verificar si el puerto está abierto
sudo ss -tlnp | grep :80

# Ver logs de firewall
sudo journalctl -u firewalld -n 50

# Deshabilitar temporalmente firewall para pruebas
sudo systemctl stop firewalld

# Rehabilitar después de corregir
sudo systemctl start firewalld

SELinux Bloqueando Operaciones

Problema: El servicio falla debido a violaciones de política SELinux.

Solución:

# Verificar denegaciones de SELinux
sudo ausearch -m AVC -ts today

# Generar reglas de permiso
sudo ausearch -m AVC -ts today | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp

# Verificar contextos de archivo
ls -Z /path/to/file

# Restaurar contextos
sudo restorecon -Rv /path/to/directory

# Ver alertas detalladas
sudo sealert -a /var/log/audit/audit.log

# Establecer temporalmente permissive para dominio específico
sudo semanage permissive -a httpd_t

Fail2Ban No Bloqueando

Problema: Fail2Ban no está bloqueando atacantes.

Solución:

# Verificar estado de Fail2Ban
sudo systemctl status fail2ban

# Ver logs de Fail2Ban
sudo tail -f /var/log/fail2ban.log

# Probar patrones regex
sudo fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf

# Verificar denegaciones de SELinux para Fail2Ban
sudo ausearch -c fail2ban

# Bloquear manualmente IP para pruebas
sudo fail2ban-client set sshd banip 1.2.3.4

# Verificar firewalld para IPs bloqueadas
sudo firewall-cmd --direct --get-all-rules

Problemas de Sincronización de Tiempo

Problema: El tiempo del servidor es incorrecto.

Solución:

# Verificar estado de chronyd
sudo systemctl status chronyd

# Ver fuentes de tiempo
chronyc sources -v

# Forzar sincronización de tiempo
sudo chronyc makestep

# Verificar problemas de red
ping -c 4 0.pool.ntp.org

# Verificar que el firewall permite NTP (UDP 123)
sudo firewall-cmd --permanent --add-service=ntp
sudo firewall-cmd --reload

# Reiniciar chronyd
sudo systemctl restart chronyd

Mejores Prácticas

Calendario de Mantenimiento de Seguridad

Diario:

  • Monitorear logs de autenticación: sudo journalctl -u sshd -S today
  • Revisar actividad de Fail2Ban: sudo fail2ban-client status
  • Verificar uso de recursos: top, htop

Semanal:

  • Revisar actualizaciones de seguridad: sudo dnf updateinfo list security
  • Auditar reglas de firewall: sudo firewall-cmd --list-all-zones
  • Verificar denegaciones de SELinux: sudo ausearch -m AVC -ts week
  • Revisar logs de auditoría: sudo ausearch -ts week

Mensual:

  • Aplicar actualizaciones de seguridad: sudo dnf upgrade --security
  • Revisar cuentas de usuario y permisos
  • Auditar archivos authorized_keys de SSH
  • Verificar paquetes innecesarios
  • Revisar y rotar logs
  • Probar restauración de respaldos

Trimestral:

  • Auditoría completa de seguridad con Lynis u OpenSCAP
  • Revisar y actualizar políticas de seguridad
  • Rotar contraseñas y claves SSH
  • Probar procedimientos de recuperación ante desastres
  • Actualizar documentación

Herramientas de Seguridad Específicas de RHEL

# Instalar escáner de seguridad OpenSCAP
sudo dnf install openscap-scanner scap-security-guide -y

# Ejecutar escaneo de cumplimiento de seguridad
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_pci-dss \
  --results-arf /tmp/scan-results.xml \
  --report /tmp/scan-report.html \
  /usr/share/xml/scap/ssg/content/ssg-rl9-ds.xml

# Ver reporte en navegador
firefox /tmp/scan-report.html

Respaldo de Configuración

# Crear script de respaldo
cat << 'EOF' | sudo tee /usr/local/bin/backup-configs.sh
#!/bin/bash
BACKUP_DIR="/root/config-backups"
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p $BACKUP_DIR

tar -czf $BACKUP_DIR/configs-$DATE.tar.gz \
  /etc/ssh/sshd_config \
  /etc/firewalld/ \
  /etc/fail2ban/ \
  /etc/selinux/config \
  /etc/sysctl.d/ \
  /etc/security/ \
  /etc/audit/ \
  /etc/chrony.conf \
  /etc/dnf/automatic.conf

echo "Respaldo creado: $BACKUP_DIR/configs-$DATE.tar.gz"

# Mantener solo los últimos 10 respaldos
ls -t $BACKUP_DIR/configs-*.tar.gz | tail -n +11 | xargs rm -f
EOF

# Hacer ejecutable
sudo chmod +x /usr/local/bin/backup-configs.sh

# Ejecutar respaldo
sudo /usr/local/bin/backup-configs.sh

Aliases de Comandos de Monitoreo

# Agregar aliases útiles a .bashrc
cat << 'EOF' >> ~/.bashrc

# Aliases de monitoreo de seguridad
alias auth-log='sudo journalctl -u sshd -n 100'
alias fail-log='sudo tail -f /var/log/fail2ban.log'
alias fw-status='sudo firewall-cmd --list-all'
alias se-status='sudo sestatus'
alias ports='sudo ss -tulnp'
alias sec-check='sudo /usr/local/bin/security-check.sh'

EOF

source ~/.bashrc

Conclusión

Has implementado exitosamente un endurecimiento de seguridad completo para tu servidor basado en RHEL. Estas configuraciones establecen una base de seguridad robusta que aprovecha las características de seguridad de nivel empresarial de CentOS, Rocky Linux, AlmaLinux o Red Hat Enterprise Linux.

Logros clave:

  • Paquetes del sistema actualizados con los últimos parches de seguridad
  • Usuario administrativo no-root con acceso sudo configurado
  • SSH endurecido con autenticación con clave y configuración segura
  • Firewalld configurado para protección a nivel de red
  • Fail2Ban protegiendo activamente contra ataques de fuerza bruta
  • SELinux aplicando controles de acceso obligatorios
  • Actualizaciones de seguridad automáticas habilitadas
  • Servicios innecesarios deshabilitados
  • Parámetros de seguridad del kernel endurecidos
  • Logging de auditoría configurado para responsabilidad

Ventajas específicas de RHEL:

  • SELinux proporciona una capa adicional de control de acceso obligatorio
  • Firewalld ofrece gestión dinámica de firewall con zonas
  • Ciclo de vida de soporte extendido asegura seguridad a largo plazo
  • Certificaciones de seguridad de nivel empresarial (FIPS, Common Criteria)
  • Subsistema de auditoría robusto para requisitos de cumplimiento

Próximos pasos:

  • Configurar medidas de seguridad específicas de aplicaciones
  • Implementar sistemas de monitoreo y alertas
  • Establecer procedimientos de respaldo y recuperación ante desastres
  • Auditorías de seguridad regulares y escaneos de cumplimiento
  • Mantenerse informado sobre avisos de seguridad de RHEL

Recuerda que la seguridad es un proceso continuo. Mantente actualizado con las actualizaciones de seguridad, monitorea los logs regularmente y adapta las configuraciones a medida que surjan nuevas amenazas.

Recursos Adicionales

Guías Relacionadas

  • Cómo Conectarse a Tu Servidor vía SSH
  • Configuración de Firewall con firewalld (CentOS/Rocky)
  • SELinux: Configuración Básica y Modos
  • Cómo Configurar Usuarios y Permisos en Linux
  • Cómo Cambiar el Puerto SSH Predeterminado
  • Configuración de Fail2Ban para Protección contra Fuerza Bruta
  • Endurecimiento de Servidores Linux: Guía Completa