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
- Entendiendo la Seguridad Basada en RHEL
- Paso 1: Actualizar Paquetes del Sistema
- Paso 2: Crear un Usuario Administrativo No-Root
- Paso 3: Configurar Autenticación con Clave SSH
- Paso 4: Endurecer la Configuración SSH
- Paso 5: Configurar Firewalld
- Paso 6: Instalar y Configurar Fail2Ban
- Paso 7: Configurar SELinux
- Paso 8: Configurar Actualizaciones de Seguridad Automáticas
- Paso 9: Configurar Zona Horaria y NTP
- Paso 10: Deshabilitar Servicios Innecesarios
- Paso 11: Implementar Medidas de Seguridad Adicionales
- Verificación
- Resolución de Problemas
- Mejores Prácticas
- Conclusión
- Recursos Adicionales
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ía de Seguridad de Red Hat Enterprise Linux
- Documentación de Rocky Linux
- Benchmark CIS Rocky Linux
- Wiki del Proyecto SELinux
- Documentación de Firewalld
- Actualizaciones de Seguridad de RHEL
- Manual de Usuario de OpenSCAP
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


