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.
⏱ 22 min de lecturaSeguridadHardeningAdmin Sistemas
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.
# 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.
Cambio de puerto: Mueve el RDP del 3389 a uno no estándar (ej: 5044) para eliminar los escaneos automáticos de bots.
NLA obligatoria: Fuerza Network Level Authentication para que la autenticación ocurra antes de establecer sesión RDP.
Acceso solo por VPN: El RDP nunca debería estar expuesto directamente a internet. Colócalo detrás de una VPN y bloquea el puerto en el firewall perimetral.
Sesiones únicas: Limitar a una sesión activa por usuario para contener el impacto de una brecha.
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)
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
[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
12. Active Directory y GPOs Corporativas
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 Suite (gratuito, Microsoft): Autoruns detecta cualquier persistencia oculta. Process Explorer es el Administrador de tareas definitivo. TCPView muestra todas las conexiones activas. PsExec permite ejecución remota sin RDP.
PingCastle (gratuito para auditorías básicas): Genera un informe de riesgo de Active Directory en minutos. Detecta cuentas sin expiración, delegaciones peligrosas, configuraciones inseguras de Kerberos y paths de ataque hacia el DC.
Microsoft Security Compliance Toolkit (gratuito): Contiene las líneas base de seguridad de Microsoft (GPOs predefinidas) para Windows 10/11, Server 2019/2022 y Edge. Úsalo para comparar tu configuración actual contra la recomendada.
Hardentools (open-source): Herramienta gráfica que deshabilita en un clic características peligrosas de Windows orientadas a atacantes (macros de Office, PowerShell, scripts WSH, Autorun, etc.).
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 (open-source): Auditor de seguridad para sistemas Unix. Analiza el sistema completo y genera un informe con puntuación, advertencias y sugerencias específicas para tu distribución.
chkrootkit / rkhunter: Detectores de rootkits y backdoors. Útiles como herramienta de verificación periódica en servidores en producción.
auditd: El demonio de auditoría del kernel Linux. Registra llamadas al sistema, accesos a ficheros, ejecución de comandos y cambios de privilegios con resolución muy alta.
Nmap: Imprescindible para auditar qué puertos tienes realmente abiertos vistos desde fuera, no solo los que crees tener abiertos.
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:
Activar el Firewall de Windows en todos los perfiles con política de denegación por defecto
Deshabilitar LLMNR y NetBIOS sobre TCP/IP
Configurar políticas de contraseña: mínimo 12 caracteres, bloqueo tras 5 intentos
Deshabilitar la cuenta Administrador integrada o renombrarla
Activar ScriptBlock Logging y Module Logging de PowerShell
Ampliar el log de seguridad a al menos 200 MB y configurar auditoría de logon/logoff
Instalar y configurar LAPS en entornos con AD
Añadir cuentas privilegiadas al grupo Protected Users
Linux
Configurar PermitRootLogin no y PasswordAuthentication no en sshd_config
Cambiar el puerto SSH del 22 a un puerto personalizado (mayor 1024)
Instalar y activar UFW con política de denegación de entrada por defecto
Instalar Fail2ban con bantime mínimo de 1 hora para SSH
Aplicar los parámetros sysctl de hardening de red
Deshabilitar IPv6 si no se usa en la red
Auditar cuentas con shell de login (grep -v nologin /etc/passwd)
Configurar umask 027 globalmente
Instalar auditd y monitorizar cambios en /etc/passwd, /etc/sudoers
Ejecutar Lynis mensualmente y resolver advertencias críticas
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.
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
Luis Juan Autor
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
Elena Rueda
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
Jorge Bermúdez
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
Marta Palou
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
Alejandro Torres
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
Laura Navarro
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.
💬 7 comentarios
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_syncookiesyrp_filterlos 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é.David, exactamente ese es el problema con muchas guías de hardening: listas de parámetros sin contexto. El
rp_filter = 1es 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 dekernel.randomize_va_space: en muchos sistemas heredados viene a 1 en lugar de 2.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
auditpoly 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.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.
Gracias por la nota sobre SSDs y borrado seguro. Es algo que mucha gente ignora:
shreden 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 comandohdparm --security-erase, que a muchos les resulta oscuro.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 reseta 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.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?