Guía Maestra de Hardening: Windows y Linux

De la teoría a la trinchera. Un compendio exhaustivo de estrategias de seguridad para blindar tus sistemas, reducir la superficie de ataque y resistir desde ransomware hasta intrusiones dirigidas.

En el panorama actual de la ciberseguridad, no basta con tener un antivirus. El hardening (o bastionado) es el proceso crítico de configurar un sistema para hacerlo resistente a ataques, eliminando vectores de entrada innecesarios y reforzando las defensas internas. Esta guía recoge los procedimientos que aplico en entornos reales: desde pymes con un solo servidor Windows hasta infraestructuras Linux en producción.

¿Por qué es vital el bastionado?

Un sistema configurado por defecto es un sistema vulnerable. SMBv1 activo, RDP expuesto en el puerto 3389, SSH aceptando contraseñas root, IPv6 sin filtrar... son la alfombra roja perfecta para el ransomware. WannaCry infectó 200.000 sistemas en 150 países en 2017 explotando exactamente eso: sistemas sin bastionar. El hardening no es opcional; es la diferencia entre operar y sufrir un incidente.

Windows

Políticas y Registro

GPOs, directivas locales y modificaciones de registro para control centralizado de seguridad.

Windows

Firewall y Protocolos

Firewall de Windows Defender, desactivación de SMBv1 y protocolos de resolución vulnerables.

Linux

SSH y Acceso Remoto

Bastionado del demonio SSH, autenticación por claves, Fail2ban y restricción de usuarios.

Linux

Firewall y Kernel

UFW, iptables, parámetros sysctl para hardening del kernel de red y protección IPv6.

Windows

Active Directory

Tiering model, LAPS, Protected Users, auditoría de eventos y bastionado de GPOs corporativas.

Universal

Auditoría y Borrado

Sysinternals, Lynis, auditpol, Event Viewer y borrado seguro de datos irrecuperable.

1. Windows: Gestión de Cuentas y Contraseñas

El primer vector de compromiso en un sistema Windows siempre son las cuentas: contraseñas débiles, cuentas de administrador activas con nombres predecibles, y ausencia de bloqueo por intentos fallidos. Empieza por aquí.

Políticas de contraseñas y bloqueo de cuentas (cmd)
# Longitud mínima: 12 caracteres net accounts /minpwlen:12 # Expiración: 90 días net accounts /maxpwage:90 # Historial: no reutilizar las últimas 10 contraseñas net accounts /uniquepw:10 # Bloqueo tras 5 intentos fallidos, desbloqueo a los 30 min net accounts /lockoutthreshold:5 net accounts /lockoutduration:30 net accounts /lockoutwindow:30
Deshabilitar la cuenta Administrador integrada y renombrarla
# Deshabilitar la cuenta "Administrador" por defecto net user Administrador /active:no # Crear cuenta admin con nombre no predecible net user GestorSistema P@ssW0rd!Larga /add net localgroup Administradores GestorSistema /add # Verificar cuentas activas en el sistema net user
Verificar actualizaciones críticas instaladas
# Listar parches instalados (ordenados por fecha) wmic qfe list brief /format:table | sort # Forzar búsqueda de actualizaciones ahora usoclient StartScan
Principio de Mínimo Privilegio (PoLP)

Ningún usuario debería tener más permisos de los estrictamente necesarios para su trabajo. Los administradores deberían tener dos cuentas: una para el trabajo diario (usuario estándar) y otra de administración solo para tareas que lo requieran. Usar la cuenta de admin para el correo y la navegación es la primera causa de compromiso en pymes.

2. Windows: Firewall de Windows Defender

El Firewall de Windows, bien configurado mediante netsh advfirewall o PowerShell, es una defensa eficaz. El problema es que muchos administradores lo dejan en modo permisivo o simplemente lo desactivan. Error crítico.

Configuración base del Firewall vía netsh
# Activar el firewall en los tres perfiles (dominio, privado, público) netsh advfirewall set allprofiles state on # Bloquear todo el tráfico entrante por defecto netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound # Ver el estado actual del firewall netsh advfirewall show allprofiles state
Gestión de reglas con PowerShell (recomendado)
# Bloquear un puerto entrante específico (ej: Telnet 23) New-NetFirewallRule -DisplayName "Bloquear Telnet" ` -Direction Inbound -Protocol TCP -LocalPort 23 ` -Action Block -Profile Any # Permitir solo RDP desde una IP de gestión concreta New-NetFirewallRule -DisplayName "RDP Gestion" ` -Direction Inbound -Protocol TCP -LocalPort 5044 ` -RemoteAddress 192.168.1.10 -Action Allow # Bloquear WinRM si no se usa (evitar movimiento lateral) Disable-NetFirewallRule -DisplayName "Windows Remote Management (HTTP-In)" # Listar todas las reglas habilitadas de entrada Get-NetFirewallRule -Direction Inbound -Enabled True | Select DisplayName, Action
Precaución al bloquear el tráfico de entrada

Si aplicas blockinbound en un servidor remoto sin antes asegurarte de que tienes una regla explícita que permite tu IP de gestión, te quedarás sin acceso. Prueba siempre los cambios de firewall en una ventana de sesión diferente, y ten preparado un script de reversión con una tarea programada que restaure la configuración si no la confirmas en 5 minutos.

3. Windows: Deshabilitar SMBv1 y Protocolos de Resolución Inseguros

SMBv1 es el protocolo que explotó WannaCry. Está activo por defecto en versiones de Windows anteriores a Server 2019. Deshabilitarlo es la medida de hardening de mayor impacto en un entorno Windows.

Deshabilitar SMBv1 (PowerShell — requiere reinicio)
# Verificar si SMBv1 está activo Get-SmbServerConfiguration | Select EnableSMB1Protocol # Deshabilitar SMBv1 en el servidor Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force # Deshabilitar también el cliente SMBv1 Set-SmbClientConfiguration -EnableSMB1Protocol $false -Force # Eliminar la característica del sistema (Windows 10/Server 2016+) Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
Deshabilitar LLMNR y NetBIOS (vectores de envenenamiento de red)
# Deshabilitar LLMNR vía registro (evita ataques Responder) reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\DNSClient" ` /v EnableMulticast /t REG_DWORD /d 0 /f # Deshabilitar NetBIOS sobre TCP/IP para todos los adaptadores # (vía WMI — ejecutar como Administrador) $adapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=True" $adapters | ForEach-Object { $_.SetTcpipNetbios(2) } # Deshabilitar servicio WPAD (evita ataques de proxy) reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Wpad" ` /v WpadOverride /t REG_DWORD /d 1 /f
¿Qué son LLMNR y NetBIOS y por qué son peligrosos?

LLMNR (Link-Local Multicast Name Resolution) y NetBIOS son protocolos de resolución de nombres legacy que se usan cuando DNS falla. Un atacante en la misma red puede responder a esas consultas haciéndose pasar por el servidor legítimo (ataque Responder), capturando hashes NTLMv2 que luego descifra offline. Deshabilitarlos elimina este vector completamente.

4. Windows: Hardening del Protocolo RDP

El escritorio remoto es uno de los vectores favoritos de ataque. Escanear el puerto 3389 con Shodan devuelve millones de resultados. No basta con activarlo; hay que blindarlo y, si es posible, hacerlo invisible.

Cambiar el puerto RDP vía PowerShell y activar NLA
# Cambiar el puerto RDP (reiniciar el servicio después) $portvalue = 5044 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' ` -Name "PortNumber" -Value $portvalue # Forzar NLA (SecurityLayer = 2, UserAuthentication = 1) Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' ` -Name "SecurityLayer" -Value 2 Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' ` -Name "UserAuthentication" -Value 1 # Actualizar la regla del firewall al nuevo puerto New-NetFirewallRule -DisplayName "RDP Custom Port" ` -Direction Inbound -Protocol TCP -LocalPort $portvalue -Action Allow # Deshabilitar la regla del puerto original Disable-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)" # Reiniciar el servicio de Terminal Services Restart-Service -Name TermService -Force

5. Windows: Hardening de PowerShell y Scripting

PowerShell es la herramienta favorita de los atacantes en entornos Windows —living off the land— porque viene instalado, es muy potente y, por defecto, registra poco. Hay que cambiar eso.

Activar el registro completo de PowerShell (via GPO o registro)
# Habilitar ScriptBlock Logging (registra todo el código ejecutado) $path = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' New-Item -Path $path -Force | Out-Null Set-ItemProperty -Path $path -Name "EnableScriptBlockLogging" -Value 1 # Habilitar Module Logging (registra qué módulos se importan) $path2 = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging' New-Item -Path $path2 -Force | Out-Null Set-ItemProperty -Path $path2 -Name "EnableModuleLogging" -Value 1 # Habilitar Transcription (guarda todas las sesiones en un fichero de texto) $path3 = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription' New-Item -Path $path3 -Force | Out-Null Set-ItemProperty -Path $path3 -Name "EnableTranscripting" -Value 1 Set-ItemProperty -Path $path3 -Name "OutputDirectory" -Value "C:\PSLogs"
Forzar Constrained Language Mode en equipos de usuario
# Activar Constrained Language Mode vía variable de entorno (persistente) [Environment]::SetEnvironmentVariable( "__PSLockdownPolicy", "4", [System.EnvironmentVariableTarget]::Machine ) # Verificar el modo activo en la sesión actual $ExecutionContext.SessionState.LanguageMode # Debe devolver: ConstrainedLanguage
Política de ejecución de scripts
# Restringir ejecución a scripts firmados (entornos corporativos) Set-ExecutionPolicy AllSigned -Scope LocalMachine -Force # En equipos de usuario: bloquear completamente Set-ExecutionPolicy Restricted -Scope LocalMachine -Force # Ver la política actual Get-ExecutionPolicy -List

6. Windows: Auditoría de Eventos con auditpol

Sin registro no hay forense. Sin forense no sabes qué pasó durante un incidente. La auditoría de Windows viene desactivada o en modo mínimo por defecto. Actívala antes de que la necesites.

Configurar políticas de auditoría con auditpol
# Ver configuración actual de auditoría auditpol /get /category:* # Auditar inicios/cierres de sesión (detectar brute force, sesiones raras) auditpol /set /subcategory:"Logon" /success:enable /failure:enable auditpol /set /subcategory:"Logoff" /success:enable # Auditar gestión de cuentas (creación, borrado, cambio de privilegios) auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable auditpol /set /subcategory:"Security Group Management" /success:enable /failure:enable # Auditar acceso a objetos y ficheros críticos auditpol /set /subcategory:"Object Access" /success:enable /failure:enable # Auditar cambios en políticas de seguridad auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable # Auditar uso de privilegios elevados auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable # Auditar ejecución de procesos (detectar malware) auditpol /set /subcategory:"Process Creation" /success:enable
Aumentar el tamaño de los logs de seguridad
# Ampliar el log de seguridad a 512 MB (defecto: 20 MB — insuficiente) wevtutil sl Security /ms:524288000 # Ver el tamaño actual wevtutil gl Security | findstr /i "maxSize" # Configurar retención de eventos (no sobreescribir —archivar primero) wevtutil sl Security /rt:false /ms:524288000

7. Linux: Bastionado Completo de SSH

En Linux, el corazón de la seguridad remota reside en /etc/ssh/sshd_config. Una configuración por defecto en un servidor expuesto es equivalente a dejar la llave en la cerradura. Las configuraciones siguientes son el mínimo aceptable para cualquier servidor en producción.

/etc/ssh/sshd_config — Configuración reforzada
# ── Acceso y autenticación ────────────────────────────── # Prohibir acceso como root (OBLIGATORIO) PermitRootLogin no # Desactivar autenticación por contraseña — solo por clave PasswordAuthentication no ChallengeResponseAuthentication no UsePAM yes # Permitir solo usuarios explícitamente definidos AllowUsers deploy@192.168.1.0/24 admin@10.0.0.5 # ── Protocolo y cifrado ───────────────────────────────── Protocol 2 # Algoritmos de cifrado modernos (eliminar algoritmos débiles) Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512 # ── Sesiones y timeouts ──────────────────────────────── LoginGraceTime 30 MaxAuthTries 3 MaxSessions 5 ClientAliveInterval 300 ClientAliveCountMax 2 # ── Seguridad adicional ──────────────────────────────── X11Forwarding no AllowAgentForwarding no AllowTcpForwarding no PermitEmptyPasswords no PrintLastLog yes Banner /etc/ssh/banner.txt
Generar par de claves SSH ed25519 (más seguro que RSA)
# En el cliente — generar clave con passphrase ssh-keygen -t ed25519 -C "admin@empresa" -f ~/.ssh/id_ed25519 # Copiar la clave pública al servidor ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 admin@192.168.1.100 # Verificar que la autenticación por clave funciona antes de # deshabilitar la autenticación por contraseña ssh -i ~/.ssh/id_ed25519 admin@192.168.1.100 # Reiniciar el demonio SSH para aplicar cambios systemctl restart sshd # Verificar que la configuración no tiene errores antes de reiniciar sshd -t

8. Linux: Firewall con UFW

UFW (Uncomplicated Firewall) es el frontend más cómodo para iptables en distribuciones basadas en Debian/Ubuntu. La regla de oro: todo bloqueado por defecto, solo se abre lo estrictamente necesario.

Configuración base de UFW para servidor
# Instalar UFW si no está disponible apt install ufw -y # Política por defecto: denegar todo entrante, permitir todo saliente ufw default deny incoming ufw default allow outgoing # Abrir solo los puertos necesarios ufw allow 2222/tcp comment 'SSH puerto personalizado' ufw allow 443/tcp comment 'HTTPS' ufw allow 80/tcp comment 'HTTP (para redirección a HTTPS)' # Permitir SSH solo desde IP de administración ufw allow from 192.168.1.10 to any port 2222 proto tcp # Limitar intentos de conexión (rate limiting — 6 intentos / 30 seg) ufw limit ssh # Activar UFW ufw enable # Ver estado detallado ufw status verbose
Reglas avanzadas con iptables (para configuraciones complejas)
# Bloquear escaneos de puertos (protección básica contra Nmap -sS) iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # Protección contra SYN flood iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT # Log de paquetes descartados (para auditoría) iptables -A INPUT -j LOG --log-prefix "UFW DROPPED: " --log-level 4 # Guardar las reglas de forma permanente iptables-save > /etc/iptables/rules.v4

9. Linux: Fail2ban — Protección contra Fuerza Bruta

Fail2ban monitoriza los logs del sistema y banea automáticamente las IPs que superan un umbral de intentos fallidos. Es la defensa más efectiva contra ataques de diccionario a SSH, aunque no reemplaza la autenticación por clave.

Instalación y configuración de Fail2ban
# Instalar apt install fail2ban -y # Copiar la configuración por defecto (no editar jail.conf directamente) cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
/etc/fail2ban/jail.local — Configuración recomendada
[DEFAULT] # Tiempo de baneo: 1 hora (en segundos) bantime = 3600 # Ventana de tiempo para contar intentos: 10 minutos findtime = 600 # Intentos fallidos antes del baneo maxretry = 5 # IP que NUNCA se banean (tu IP de gestión, localhost) ignoreip = 127.0.0.1/8 192.168.1.10 # Backend de logging backend = systemd [sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 86400 ; 24 horas para SSH
Gestión y monitoreo de Fail2ban
# Iniciar y habilitar el servicio systemctl enable fail2ban systemctl start fail2ban # Ver estado de todas las jails fail2ban-client status # Ver IPs baneadas en la jail de SSH fail2ban-client status sshd # Desbanear una IP manualmente (si te has baneado tú mismo) fail2ban-client set sshd unbanip 192.168.1.50 # Ver el log de acciones en tiempo real tail -f /var/log/fail2ban.log

10. Linux: Hardening del Kernel con sysctl

Los parámetros del kernel en /etc/sysctl.conf (o /etc/sysctl.d/*.conf) permiten reforzar la pila de red, deshabilitar funciones peligrosas y proteger contra ataques a nivel de sistema operativo. Estos son los parámetros que aplico en todos mis servidores.

/etc/sysctl.d/99-hardening.conf
# ── Protección de red ─────────────────────────────────── # Deshabilitar IP forwarding (a menos que sea un router) net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # Protección contra IP spoofing (validación de ruta de origen) net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # Rechazar paquetes con rutas de origen registradas net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # No aceptar redirecciones ICMP (evita ataques man-in-the-middle) net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 # Protección SYN flood con SYN cookies net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 # Deshabilitar respuesta a broadcasts (evita Smurf attacks) net.ipv4.icmp_echo_ignore_broadcasts = 1 # Ignorar respuestas ICMP malformadas net.ipv4.icmp_ignore_bogus_error_responses = 1 # ── IPv6 ──────────────────────────────────────────────── # Deshabilitar IPv6 si no se usa net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 # ── Memoria y kernel ──────────────────────────────────── # Deshabilitar Magic SysRq (acceso de emergencia al kernel) kernel.sysrq = 0 # Restringir dmesg a root (ocultar info del kernel a usuarios) kernel.dmesg_restrict = 1 # Restringir acceso a ptrace (dificultar análisis de procesos a atacantes) kernel.yama.ptrace_scope = 1 # Aleatorización de espacio de direcciones (ASLR) kernel.randomize_va_space = 2
Aplicar los parámetros sin reiniciar
# Aplicar todos los ficheros de sysctl.d sysctl --system # O aplicar un fichero concreto sysctl -p /etc/sysctl.d/99-hardening.conf # Verificar un parámetro concreto sysctl net.ipv4.tcp_syncookies

11. Linux: Gestión de Usuarios y Permisos de Ficheros

Un sistema Linux mal configurado en cuanto a usuarios y permisos es tan peligroso como uno sin firewall. El objetivo: ningún daemon innecesario corriendo como root, permisos mínimos en ficheros críticos, y cuentas de sistema no interactivas cerradas.

Auditar y deshabilitar cuentas de sistema innecesarias
# Ver todas las cuentas con shell de login (posibles vectores de acceso) grep -v '/nologin\|/false' /etc/passwd # Bloquear cuentas de sistema que no deberían tener login usermod -s /usr/sbin/nologin www-data usermod -s /usr/sbin/nologin nobody usermod -s /usr/sbin/nologin daemon # Expirar una cuenta que no se debe usar (la bloquea permanentemente) chage -E 0 nombre_usuario # Ver estado de una cuenta (fechas de expiración, etc.) chage -l nombre_usuario
Permisos correctos en ficheros críticos del sistema
# Ficheros de contraseñas: solo root debe leer shadow chmod 640 /etc/shadow chmod 644 /etc/passwd chown root:shadow /etc/shadow # Directorios de configuración críticos chmod 700 /root chmod 750 /etc/sudoers.d # Fichero sudoers: nunca editar directamente, usar visudo visudo # Añadir: %admin ALL=(ALL) NOPASSWD: /usr/bin/apt — solo si es necesario # Buscar ficheros con SUID activado (potencial escalada de privilegios) find / -perm /4000 -type f -ls 2>/dev/null # Buscar ficheros con escritura global (world-writable) — riesgo alto find / -type f -perm -o+w -not -path '/proc/*' -not -path '/sys/*' 2>/dev/null # umask seguro para nuevos ficheros (022 crea 644 para ficheros, 755 para dirs) echo "umask 027" >> /etc/profile
Configuración de sudoers segura
# /etc/sudoers (editar con visudo) # Requerir contraseña siempre (deshabilitar NOPASSWD global) Defaults timestamp_timeout=5 Defaults requiretty Defaults logfile="/var/log/sudo.log" # Evitar que sudo conserve el entorno del usuario Defaults env_reset Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # Conceder sudo a grupos específicos, no a usuarios individuales %sudo ALL=(ALL:ALL) ALL

En entornos con Active Directory, el hardening del directorio es la pieza central de toda la estrategia de seguridad. Un AD comprometido significa que el atacante controla toda la organización. Estas son las medidas fundamentales.

El modelo de Tiering (Nivel) de privilegios

Microsoft recomienda separar los privilegios en tres niveles: Tier 0 (controladores de dominio, AD DS), Tier 1 (servidores de aplicaciones) y Tier 2 (equipos de usuario). Un administrador de Tier 0 nunca debe usar su cuenta en un equipo Tier 2 —si ese equipo se compromete, el atacante obtiene las credenciales del DC. Esta separación es la protección más eficaz contra el movimiento lateral.

Configurar LAPS (Local Administrator Password Solution)
# LAPS genera contraseñas de administrador local únicas por equipo # y las almacena en un atributo de AD protegido. # Instalar el módulo LAPS (PowerShell) Install-Module -Name LAPS -Repository PSGallery # Extender el esquema de AD con los atributos LAPS Update-LapsADSchema # Conceder permiso al equipo para escribir su propia contraseña Set-LapsADComputerSelfPermission -Identity "OU=Equipos,DC=empresa,DC=com" # Leer la contraseña de un equipo (solo cuentas con permiso) Get-LapsADPassword -Identity "EQUIPO-01" -AsPlainText
Grupo Protected Users — protección de cuentas privilegiadas
# Protected Users es un grupo de seguridad de AD que aplica # restricciones automáticas a sus miembros: # - No almacena credenciales en caché (sin WDigest, sin NTLM) # - No permite delegación Kerberos # - Las tickets Kerberos expiran en 4 horas (no renovables) # Añadir administradores al grupo Protected Users Add-ADGroupMember -Identity "Protected Users" -Members "AdminDominio","AdminTier0" # Verificar miembros del grupo Get-ADGroupMember -Identity "Protected Users" | Select Name, SamAccountName
GPOs de hardening clave para entornos corporativos
# Configuraciones GPO recomendadas (vía GPMC o LGPO): # 1. Deshabilitar NTLM en toda la red (forzar Kerberos) # Ruta: Computer > Windows Settings > Security Settings > # Local Policies > Security Options # "Network security: Restrict NTLM: NTLM authentication in this domain" # Valor: Deny all # 2. Habilitar Windows Defender Credential Guard # Ruta: Computer > Admin Templates > System > Device Guard # "Turn On Virtualization Based Security" = Enabled # Platform Security Level = Secure Boot and DMA Protection # 3. Deshabilitar LM y NTLMv1 # "Network security: LAN Manager authentication level" # Valor: "Send NTLMv2 response only. Refuse LM & NTLM" # 4. Forzar actualización de LAPS cada 30 días vía GPO # Ruta: Computer > Admin Templates > LAPS # "Password Settings" = Enabled, Length: 20, Complexity: all, Age: 30 # 5. Bloquear macros de Office en documentos de internet # Ruta: User > Admin Templates > Microsoft Office > Security Settings # "Block macros from running in Office files from the Internet"

13. Herramientas de Auditoría y Monitoreo

Las herramientas correctas en las manos correctas reducen el tiempo de detección de un incidente de días a minutos. Estas son las que uso en auditorías reales.

Para entornos Windows

Sysinternals: comandos de auditoría esenciales
# Autoruns — ver todo lo que se inicia automáticamente autorunsc.exe -a * -o autoruns_output.csv -accepteula # Process Explorer — árbol completo de procesos con hashes VirusTotal procexp.exe /accepteula # TCPView — conexiones de red activas en tiempo real tcpview.exe /accepteula # PsList — listar todos los procesos (útil en entornos sin GUI) pslist.exe /accepteula # PsLoggedOn — ver qué usuarios están conectados (local y remoto) psloggedon.exe /accepteula \\SERVIDOR-01

Para entornos Linux

Lynis — auditoría completa del sistema
# Instalar apt install lynis -y # Ejecutar auditoría completa del sistema lynis audit system # Ver solo advertencias y sugerencias lynis audit system 2>&1 | grep -E "Warning|Suggestion" # El informe completo se guarda en cat /var/log/lynis.log cat /var/log/lynis-report.dat
auditd — monitorear comandos de usuarios específicos
# Instalar auditd apt install auditd audispd-plugins -y systemctl enable auditd && systemctl start auditd # Monitorizar ejecución de comandos como root auditctl -a always,exit -F arch=b64 -F euid=0 -S execve -k root_cmds # Monitorizar modificaciones de ficheros críticos auditctl -w /etc/passwd -p wa -k passwd_changes auditctl -w /etc/sudoers -p wa -k sudoers_changes auditctl -w /var/log/auth.log -p wa -k auth_log # Ver eventos registrados relacionados con cambios en passwd ausearch -k passwd_changes --start today # Generar informe de acciones del usuario "admin" aureport --user --start today | grep admin

14. Borrado Seguro de Datos

Cuando un dato debe desaparecer definitivamente —baja de un equipo, reutilización de disco, cumplimiento LOPD/RGPD— no basta con eliminar el fichero ni con formatear. Los datos pueden recuperarse con herramientas forenses hasta que el espacio sea sobreescrito físicamente.

Borrado seguro en Windows (múltiples pasadas)
# Formateo de partición con 7 pasadas de sobreescritura (DoD 5220.22-M) format F: /P:7 # Con SDelete (Sysinternals) — borrado seguro de ficheros individuales sdelete64.exe -p 7 C:\datos_sensibles\fichero.xlsx # Limpiar espacio libre del disco (sobreescribir datos eliminados) sdelete64.exe -p 3 -z C: # Borrar un directorio completo de forma segura sdelete64.exe -p 7 -s -q C:\directorio_sensible\
Borrado seguro en Linux (shred y wipe)
# Borrado irrecuperable de un fichero (7 pasadas, verbose, eliminar) shred -n 7 -v -u /ruta/fichero_sensible.pdf # Borrar un disco completo (ej: antes de dar de baja un servidor) shred -n 3 -v /dev/sda # Alternativa con wipe (instalar: apt install wipe) wipe -r /directorio_sensible/ # Limpiar el espacio libre sin tocar ficheros existentes (sfill de secure-delete) apt install secure-delete -y sfill -llz /punto/de/montaje/
SSDs y borrado seguro

Para discos SSD, el comando shred no garantiza borrado completo porque el controlador del SSD usa wear-leveling y puede escribir en bloques distintos a los solicitados. En SSDs, usa el comando hdparm --security-erase (ATA Secure Erase) o el software del fabricante (Samsung Magician, Crucial Storage Executive). Si el disco soporta encriptación de hardware (SED), basta con borrar la clave de cifrado.

15. Checklist de Hardening — Medidas Prioritarias

Si tienes que empezar por algún sitio, estas son las medidas que más impacto tienen en el menor tiempo posible, ordenadas por ratio riesgo/esfuerzo:

Windows

Linux

Preguntas Frecuentes sobre Bastionado

El hardening o bastionado es el proceso de asegurar un sistema reduciendo su superficie de vulnerabilidad: eliminar software innecesario, cerrar puertos, limitar privilegios de usuario y aplicar configuraciones de seguridad estrictas. La premisa es simple: cuanto menos tiene un sistema expuesto, menos puede atacarse.

SMBv1 es el protocolo que explotó WannaCry en 2017, infectando 200.000 sistemas en 150 países en 48 horas. Está activo por defecto en Windows hasta Server 2016 y tiene vulnerabilidades de diseño que no tienen parche. Deshabilitarlo es la medida de hardening de mayor impacto/esfuerzo que existe en Windows: dos comandos PowerShell, cero impacto en sistemas modernos, protección total contra EternalBlue y derivados.

Son complementarios. Un firewall controla qué tráfico entra y sale según reglas estáticas (IP, puerto, protocolo). Fail2ban es reactivo: analiza logs en tiempo real y crea reglas de firewall dinámicas para banear IPs que muestran comportamiento de ataque (demasiados intentos de autenticación fallidos, escaneos, etc.). El firewall es la muralla; Fail2ban es el guardia que añade piedras cuando alguien intenta escalarla.

Las pymes son el objetivo favorito del ransomware precisamente porque suelen tener sistemas sin bastionar. No necesitas implementarlo todo de golpe. Prioriza por impacto: SMBv1 deshabilitado, RDP fuera del puerto 3389 con NLA, Firewall activo, contraseñas de mínimo 12 caracteres y Fail2ban en Linux. Con esas cinco medidas ya has eliminado el 80% de los vectores de ataque más comunes en pymes.

Para Windows: Sysinternals Autoruns (persistencia oculta) + PingCastle (riesgo de Active Directory) + Microsoft Security Compliance Toolkit (comparar contra líneas base). Para Linux: Lynis (auditoría completa del sistema) + rkhunter (detección de rootkits) + Nmap (puertos abiertos reales). Todas gratuitas, todas usadas por profesionales de ciberseguridad en su día a día.

En redes corporativas con Active Directory puede causar problemas con la resolución DNS y la replicación entre controladores de dominio, ya que internamente usan IPv6 aunque la red no lo configure explícitamente. En servidores Linux standalone sin AD, deshabilitarlo es seguro y reduce la superficie de ataque. Siempre prueba el cambio primero en un entorno no crítico y verifica que los servicios clave siguen funcionando antes de aplicarlo en producción.

¿Necesitas una auditoría de seguridad profesional?

Realizo análisis de bastionado y ciberseguridad para empresas en Huesca, Aragón y a distancia. Reviso tu infraestructura, detecto vulnerabilidades reales y te entrego un plan de remediación priorizado. No esperes al incidente para protegerte.

Solicitar auditoría de seguridad →

← Volver al Blog

💬 7 comentarios

DM

Llevaba tiempo buscando una guía en español que no fuera solo teoría. La parte del sysctl es exactamente lo que necesitaba: en mis VPS siempre tenía dudas de si estaba dejando algo crítico sin configurar. El parámetro de tcp_syncookies y rp_filter los tenía a 0 por defecto. Corregido ya. Gracias por poner los comandos reales con contexto, que en muchas guías ponen el parámetro solo y sin explicar por qué.

LJ

David, exactamente ese es el problema con muchas guías de hardening: listas de parámetros sin contexto. El rp_filter = 1 es especialmente importante en servidores con más de una interfaz de red —sin él, el kernel acepta paquetes que lleguen por una interfaz con IPs de origen que deberían entrar por otra, lo que facilita el spoofing. Comprueba también el valor de kernel.randomize_va_space: en muchos sistemas heredados viene a 1 en lugar de 2.

ER

Sysadmin aquí. La sección de auditoría de eventos de Windows es de las mejores que he leído en español. Nadie habla de auditpol y es la herramienta correcta para esto, no el Event Viewer clicando. ¿Tienes pensado hacer un artículo específico sobre correlación de eventos en el Visor o con una SIEM ligera tipo Wazuh? Esa es la pieza que falta para cerrar el ciclo detección → respuesta.

JB

El punto de LAPS con Active Directory me ha resultado muy útil. Llevaba meses diciéndole al responsable IT de un cliente que necesitaban LAPS porque todos los equipos tenían la misma contraseña de administrador local (sí, "Admin2020"). Con el comando de PowerShell que pones para leer la contraseña por equipo ya no hay excusa para no implantarlo. La sección del grupo Protected Users tampoco la había visto tan bien explicada en ningún sitio en castellano.

MP

Gracias por la nota sobre SSDs y borrado seguro. Es algo que mucha gente ignora: shred en un SSD no hace lo que crees. Tuve que explicárselo a un cliente que iba a dar de baja unos portátiles con datos de pacientes. Al final usamos Samsung Magician con el Secure Erase y guardamos evidencia del proceso para cumplimiento RGPD. Sería interesante que ampliaras ese apartado con el comando hdparm --security-erase, que a muchos les resulta oscuro.

AT

La advertencia sobre bloquear el tráfico RDP sin una regla previa de tu IP es de oro. La aprendí por las malas en un servidor de producción hace dos años. Ahora antes de tocar el firewall siempre abro una tarea programada que ejecuta netsh advfirewall reset a los 10 minutos, y la cancelo solo cuando confirmo que todo funciona. El truco del ScriptBlock Logging de PowerShell tampoco lo conocía —acabo de habilitarlo en todos mis servidores.

LN

Profesora de ciberseguridad en FP. Voy a enlazar esta guía en los apuntes del módulo de bastionado. Es de las pocas en español que combina Windows y Linux con comandos reales, no capturas de pantalla de GUIs. La tabla de contenidos con anclas es un detalle que muchos blogs técnicos no tienen y que facilita mucho el uso en clase como referencia. ¿Tienes pensado hacer una versión en PDF descargable?

Se ha cerrado el hilo de comentarios para este artículo.