Índice
- La Fundación: Actualizaciones del sistema y gestión de paquetes
- Fortalecimiento del acceso SSH
- Configuración de cortafuegos y refuerzo de la red
- Control de acceso y autenticación
- Supervisión, auditoría y detección de intrusiones
- Control de acceso y gestión de privilegios
- Endurecimiento y mantenimiento continuos
- Conclusión
Asegurar un servidor Debian 12 requiere mucho más que simplemente instalar el sistema operativo y conectarlo a Internet. La mayoría de los administradores de sistemas siguen las directrices básicas de seguridad -actualizar paquetes, habilitar un cortafuegos y deshabilitar el inicio de sesión root- pero pasan por alto numerosos pasos críticos de refuerzo que amplían significativamente la postura de seguridad. Estas medidas pasadas por alto crean brechas explotables que los atacantes sofisticados buscan activamente. Esta completa guía revela 15 pasos esenciales de refuerzo que los administradores de sistemas experimentados a menudo pasan por alto, transformando su servidor Debian 12 de meramente funcional a genuinamente reforzado contra las amenazas modernas.
La diferencia entre una instalación básica y un servidor Debian 12 adecuadamente reforzado determina si su sistema sobrevivirá a ataques dirigidos o se convertirá en otra estadística de ransomware. Cada paso que se pasa por alto representa una superficie de ataque adicional, una vulnerabilidad potencial y una oportunidad perdida para levantar barreras de seguridad antes de que las amenazas se materialicen.

La Fundación: Actualizaciones del sistema y gestión de paquetes
Paso 1: Implantar actualizaciones de seguridad automatizadas con actualizaciones desatendidas
Aunque la mayoría de los administradores ejecutan actualización apt y apt actualizar, Sin embargo, son menos los que aplican parches de seguridad automatizados, un descuido crítico que deja los sistemas vulnerables entre ventanas de actualización manual.
Los parches de seguridad de Debian abordan vulnerabilidades conocidas explotadas activamente por los atacantes. Las actualizaciones manuales crean lagunas peligrosas: un lunes por la mañana, cuando ejecutas las actualizaciones, una vulnerabilidad de día cero del martes ya está circulando entre los equipos de ataque. El martes por la tarde, su sistema seguirá sin parches a pesar de que exista una solución en los repositorios de Debian.
Instale actualizaciones desatendidas para actualizaciones de seguridad automáticas:
bashsudo apt update && sudo apt upgrade -y
sudo apt install unattended-upgrades apt-listchanges -y
sudo dpkg-reconfigure -plow unattended-upgrades
Configure las actualizaciones de seguridad automáticas editando /etc/apt/apt.conf.d/50unattended-upgrades:
bashsudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Asegúrese de que estos ajustes críticos están activados:
textoActualización desatendida::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Mail "your-email@example.com";
Unattended-Upgrade::MailOnlyOnError "true";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Esta configuración aplica automáticamente actualizaciones de seguridad a diario, elimina los paquetes del kernel que no se utilizan y le envía correos electrónicos sólo cuando se producen errores, evitando así peligrosas brechas de seguridad sin añadir carga administrativa.
Refuerzo de la seguridad del servidor Debian 12 con capas de protección de cortafuegos
Fortalecimiento del acceso SSH
Paso 2: Aplicar la autenticación basada en clave SSH (desactivar la autenticación por contraseña)
La mayoría de los servidores tienen activada por defecto la autenticación de contraseñas SSH, una vulnerabilidad que invita a realizar ataques de fuerza bruta desde cualquier punto de Internet. Los atacantes utilizan herramientas automatizadas para intentar millones de combinaciones de contraseñas cada noche y, a menos que utilices contraseñas excepcionalmente seguras con fail2ban, alguien acabará teniendo éxito.
La autenticación mediante clave SSH es criptográficamente superior: aunque los atacantes irrumpan en su red, no podrán utilizar contraseñas robadas porque el servidor ya no las acepta.
Genere un par de claves SSH fuerte en su máquina local:
bashssh-keygen -t rsa -b 4096 -f ~/.ssh/debian_server -N "su-frase-de-confirmación"
Copie la clave pública en su servidor (ejecútelo una vez desde su máquina local):
bashssh-copy-id -i ~/.ssh/debian_server.pub nombre_usuario@tu_servidor_ip
Ahora verifique que el acceso basado en claves funciona antes de desactivar las contraseñas:
bashssh -i ~/.ssh/debian_server nombre_usuario@tu_servidor_ip
Edite la configuración del demonio SSH:
bashsudo nano /etc/ssh/sshd_config
Aplique esta configuración SSH reforzada:
textoProtocolo 2
Puerto 22
Familia de direcciones inet
ListenAddress 0.0.0.0
PermitRootLogin no
PubkeyAuthentication sí
PasswordAuthentication no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no
UsePAM sí
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 1m
StrictModes sí
IgnoreRhosts sí
Autenticación basada en host no
RhostsRSAAuthentication no
RSAAuthentication no
X11Forwarding no
X11UseLocalhost no
TCPKeepAlive sí
ClientAliveInterval 300
ClientAliveCountMax 2
Subsistema sftp /usr/lib/openssh/sftp-server
Reinicie SSH para aplicar los cambios:
bashsudo systemctl restart ssh
Pruebe su configuración minuciosamente antes de salir de la sesión actual: si está mal configurada, se arriesga a un bloqueo permanente.
Seguridad de autenticación basada en claves SSH para un acceso seguro al servidor
Paso 3: Cambiar el Puerto SSH del 22 por defecto (Opcional pero efectivo)
Aunque no es criptográficamente necesario, cambiar SSH del puerto 22 reduce el ruido del escaneo de puertos de las herramientas de ataque automatizadas. Esto es seguridad a través de la oscuridad, útil en la práctica para reducir el spam de registro y ralentizar el reconocimiento casual.
En /etc/ssh/sshd_config, modificar:
textoPuerto 2222
Actualice su cortafuegos para permitir el nuevo puerto:
bashsudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
Documenta este cambio: lo olvidarás durante tu próxima emergencia a las 3 de la mañana.
Paso 4: Implantar Fail2ban para prevenir ataques de fuerza bruta
Incluso con autenticación de clave SSH, los servicios auxiliares (correo, aplicaciones web, etc.) pueden aceptar contraseñas. Fail2ban supervisa los intentos fallidos de autenticación y bloquea temporalmente las direcciones IP infractoras, deteniendo los ataques de fuerza bruta antes de que tengan éxito.
Instale Fail2ban:
bashsudo apt update && sudo apt install fail2ban -y
Configure Fail2ban copiando la configuración por defecto:
bashsudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Edita la configuración:
bashsudo nano /etc/fail2ban/jail.local
En el [DEFAULT] configurar:
texto[DEFAULT]
bantime = 3600
tiempo de búsqueda = 600
maxretry = 3
ignoreip = 127.0.0.1/8 ::1 your_trusted_ip
[sshd]
enabled = true
puerto = 2222
filtro = sshd
logpath = /var/log/auth.log
maxretry = 3
tiempo de espera = 1800
Inicie y active Fail2ban:
bashsudo systemctl enable fail2ban
sudo systemctl start fail2ban
Supervisar las prohibiciones activas:
bashsudo fail2ban-client status sshd
Esta configuración prohíbe IPs durante 1800 segundos (30 minutos) después de 3 intentos fallidos de SSH dentro de una ventana de 10 minutos - lo suficientemente agresivo para detener los ataques de fuerza bruta evitando falsos positivos.
Configuración de cortafuegos y refuerzo de la red
Paso 5: Configurar el cortafuegos UFW con políticas estrictas por defecto
Muchos administradores omiten la configuración del cortafuegos o utilizan reglas demasiado permisivas. Un cortafuegos correctamente configurado es su primera línea de defensa contra el acceso no autorizado.
Instale y configure UFW (cortafuegos sin complicaciones):
bashsudo apt update && sudo apt install ufw -y
Antes de habilitar UFW, permita SSH para evitar el bloqueo:
bashsudo ufw allow 2222/tcp
sudo ufw allow ssh
Establezca políticas restrictivas por defecto:
bashsudo ufw por defecto denegar entrantes
sudo ufw default allow outgoing
sudo ufw por defecto denegar enrutado
Activar UFW:
bashsudo ufw enable
Para un servidor web, permita adicionalmente HTTP y HTTPS:
bashsudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Permita que sólo determinadas IP accedan a servicios sensibles:
bashsudo ufw allow desde 192.168.1.100 a cualquier puerto 3306
Visualiza tu configuración:
bashsudo ufw status verbose
Paso 6: Implementar el endurecimiento de parámetros del kernel con Sysctl
Los administradores de sistemas rara vez modifican los parámetros del kernel más allá de los valores predeterminados, un descuido importante. El endurecimiento del kernel a través de sysctl puede prevenir clases enteras de ataques y exploits de red.
Crear un archivo de configuración de endurecimiento:
bashsudo nano /etc/sysctl.d/99-hardening.conf
Añade parámetros completos de endurecimiento del núcleo:
texto# Seguridad de la red
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Seguridad IPv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
Protección de memoria #
kernel.dmesg_restrict = 1
kernel.printk = 3 3 3 3
kernel.kptr_restrict = 2
kernel.core_uses_pid = 1
kernel.kexec_load_disabled = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
Restricciones del proceso #
kernel.unprivileged_userns_clone = 0
kernel.perf_event_paranoid = 3
Aplique el endurecedor inmediatamente:
bashsudo sysctl -p /etc/sysctl.d/99-hardening.conf
Estos parámetros desactivan el reenvío de IP (a menos que lo necesite), activan las cookies SYN para evitar ataques de inundación SYN, activan el filtrado de ruta inversa para evitar la suplantación de IP e implementan protecciones de memoria contra la divulgación de información.
Paso 7: Desactivar servicios de red innecesarios
Cada servicio en ejecución representa una superficie potencial de ataque. Muchas instalaciones por defecto de Debian incluyen servicios que no necesita-servidores de correo, resolvedores de DNS, incluso Bluetooth en servidores headless.
Identificar los servicios en ejecución:
bashsudo systemctl list-units --type=service --state=running
Compruebe qué servicios están escuchando en los puertos de red:
bashsudo ss -tulnp
Desactive los servicios innecesarios. Para un servidor web básico, es probable que no necesite:
bashsudo systemctl disable bluetooth.service
sudo systemctl disable cups.service
sudo systemctl disable avahi-daemon.service
sudo systemctl mask isc-dhcp-server
sudo systemctl mask isc-dhcp-server6
Una vez desactivados, detenga los servicios:
bashsudo systemctl stop bluetooth.service
sudo systemctl stop cups.service
Documente qué servicios ha desactivado y por qué: esto es fundamental durante las auditorías de seguridad.
Control de acceso y autenticación
Paso 8: Implementar la autenticación de dos factores para SSH
La autenticación de dos factores (2FA) añade una segunda capa de seguridad: aunque alguien obtenga su clave privada SSH, no podrá acceder a su servidor sin el segundo factor.
Instale Google Authenticator para TOTP (Time-based One-Time Password):
bashsudo apt update && sudo apt install libpam-google-authenticator -y
Configura 2FA como tu usuario (no root):
bashgoogle-authenticator -t -f -d -w 10 -r 3 -R 30
Esto genera un código QR que puedes escanear con tu aplicación de autenticación. Guarda los códigos de copia de seguridad en un lugar seguro: son tu mecanismo de recuperación si pierdes el dispositivo de autenticación.
Modificar la configuración de PAM SSH para requerir 2FA:
bashsudo nano /etc/pam.d/sshd
Añada esta línea antes de @include common-auth:
textoauth requerido pam_google_authenticator.so nullok
Editar la configuración del demonio SSH:
bashsudo nano /etc/ssh/sshd_config
Añadir o modificar:
textoChallengeResponseAuthentication sí
AuthenticationMethods publickey,keyboard-interactive
Reinicie SSH:
bashsudo systemctl restart ssh
Pruebe su configuración con un nuevo terminal antes de cerrar la sesión actual.
La autenticación de dos factores asegura el acceso al servidor Debian
Paso 9: endurecer las políticas de cuentas de usuario
Las políticas de cuentas de usuario por defecto en Debian carecen de suficientes restricciones. Si no se refuerzan, las débiles políticas de contraseñas y los mecanismos de bloqueo de cuentas dejan a los sistemas vulnerables a la vulneración de credenciales.
Editar /etc/login.defs para aplicar políticas de contraseñas más estrictas:
bashsudo nano /etc/login.defs
Modifica estos ajustes críticos:
textoPASS_MAX_DAYS 30
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
INTENTOS DE INICIO DE SESIÓN 3
LOGIN_TIMEOUT 60
FAILLOG_ENAB sí
LOG_UNKFAIL_ENAB sí
LOG_OK_LOGINS sí
SYSLOG_SU_ENAB sí
Desactive las cuentas de usuario innecesarias:
bashsudo passwd -l juegos
sudo passwd -l noticias
sudo passwd -l uucp
Cree una configuración de sudo fuerte que requiera contraseñas y audite el uso de sudo:
bashsudo visudo
Asegúrese de que existen estas líneas:
textoPor defecto use_pty
Por defecto log_input, log_output
Defaults requirepass
%sudo ALL=(ALL:ALL) ALL
Esto fuerza comandos sudo en un pseudo-terminal, registra todas las entradas/salidas, y requiere autenticación de contraseña para la escalada de privilegios.
Supervisión, auditoría y detección de intrusiones
Paso 10: Implementar un registro exhaustivo con Auditd
La mayoría de los administradores confían únicamente en syslog, perdiéndose eventos de seguridad detallados que auditd captura. Auditd proporciona registros de auditoría granulares esenciales para las investigaciones forenses y el cumplimiento de normativas.
Instale auditd:
bashsudo apt update && sudo apt install auditd audispd-plugins -y
Configure auditd editando /etc/audit/rules.d/audit.rules:
bashsudo nano /etc/audit/rules.d/audit.rules
Añadir reglas de auditoría críticas:
texto# Eliminar cualquier regla existente
-D
# Tamaño del búfer
-b 8192
# Modo de fallo
-f 2
# Auditar los registros de auditoría
-w /var/log/audit/ -k auditlog
# Auditar la administración del sistema
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
# Auditar llamadas al sistema
-a always,exit -F arch=b64 -S execve -k exec
-a always,exit -F arch=b32 -S execve -k exec
# Auditar modificaciones de ficheros
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
# Hacer la configuración inmutable
-e 2
Cargar las reglas de auditoría:
bashsudo systemctl restart auditd
Ver registros de auditoría:
bashsudo ausearch -m EXECVE --start recent
Generar informes de auditoría:
bashsudo aureport
Auditd genera registros masivos: configure la rotación de registros para evitar problemas de espacio en disco.
Paso 11: Instalar herramientas de detección de rootkits y malware
Muchos administradores asumen que sus sistemas están libres de malware porque nada parece estar obviamente mal. Los rootkits sofisticados ocultan su presencia mientras mantienen el acceso de los atacantes.
Instala el cazador de rootkits:
bashsudo apt update && sudo apt install rkhunter -y
sudo rkhunter --update
sudo rkhunter --check --skip-warning
Instale chkrootkit para la detección de malware de segunda opinión:
bashsudo apt install chkrootkit -y
sudo chkrootkit
Instale AIDE (Advanced Intrusion Detection Environment) para la supervisión de la integridad de los archivos:
bashsudo apt install aide aide-common -y
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
sudo aide --check
Programe escaneos semanales mediante cron:
bashsudo nano /etc/cron.d/rootkit-checks
Añade:
texto0 2 * * 0 root /usr/bin/rkhunter --check --skip-warning 2>&1 | mail -s "Comprobación semanal de rootkits" your@email.com
0 3 * * 0 root /usr/bin/aide --check 2>&1 | mail -s "Comprobación semanal de AIDE" your@email.com
Estas herramientas le alertan de rootkits y malware antes de que establezcan persistencia.
Paso 12: Activar y supervisar los registros del sistema
Los administradores de sistemas a menudo tienen syslog en funcionamiento pero nunca revisan los registros. Los registros sólo son útiles si los supervisas activamente.
Configure rsyslog para un registro completo:
bashsudo nano /etc/rsyslog.conf
Asegúrese de que los módulos críticos están activados:
textomodule(load="imuxsock")
module(load="imklog")
module(load="imtcp")
input(type="imtcp" port="514")
Configure la rotación de registros con logrotate:
bashsudo nano /etc/logrotate.d/rsyslog
Garantizar una rotación adecuada:
texto/var/log/syslog {
diario
rotar 14
comprimir
delaycompress
notifempty
crear 0640 syslog adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Instale y configure logwatch para obtener resúmenes diarios de los registros:
bashsudo apt install logwatch -y
sudo nano /etc/logwatch/conf/logwatch.conf
Configurar la entrega de correo electrónico:
textoSalida = mail
Formato = html
Correo electrónico = your@email.com
Nombre de host = nombre-servidor
Control de acceso y gestión de privilegios

Paso 13: Implantar y hacer cumplir el control de acceso obligatorio
Los sistemas de permisos estándar de Linux (DAC) carecen de la granularidad necesaria para evitar que las aplicaciones comprometidas dañen el sistema. AppArmor proporciona un control de acceso obligatorio (MAC) basado en perfiles que protege contra el movimiento lateral tras el compromiso.
Debian incluye AppArmor por defecto pero a menudo con los perfiles mínimos cargados. Compruebe que AppArmor está activo:
bashsudo aa-status
Instale perfiles AppArmor adicionales:
bashsudo apt install apparmor-profiles apparmor-profiles-extra apparmor-utils -y
Recargar perfiles:
bashsudo systemctl reload apparmor
Verifique que la protección esté activa:
bashsudo aa-status | grep "perfiles en modo enforce"
Cree perfiles AppArmor personalizados para aplicaciones sensibles:
bashsudo aa-genprof /usr/bin/su-aplicación
AppArmor confina las aplicaciones a sus recursos previstos, impidiendo que los servidores web comprometidos accedan a los archivos del sistema o a la configuración de las bases de datos.
Paso 14: Configurar los permisos y la máscara de seguridad de los archivos
Los permisos de fichero por defecto en Debian permiten accesos de lectura innecesarios. Una configuración adecuada de umask evita que los archivos sensibles sean legibles por todo el mundo.
Comprueba la umask actual:
bashmáscara
Establecer valores predeterminados seguros en /etc/profile.d/ para todos los usuarios:
bashsudo nano /etc/profile.d/secure-umask.sh
Añade:
textoif [ $UID -ge 1000 ]; then
máscara 0077
si no
máscara 0027
fi
Hazlo ejecutable:
bashsudo chmod 644 /etc/profile.d/secure-umask.sh
Auditar los permisos actuales de los archivos sensibles de lectura mundial:
bashsudo find /etc -type f -perm -444 -exec ls -l {} \;
sudo find /home -type f -perm -444 -exec ls -l {} \;
Eliminar permisos de lectura innecesarios:
bashsudo chmod 600 /etc/ssh/sshd_config
sudo chmod 640 /etc/sudoers
Paso 15: Desactivar capacidades innecesarias del sistema de archivos
Los sistemas Linux modernos conceden capacidades granulares a los programas en lugar de distinciones binarias root/no root. Las capacidades innecesarias en los binarios del sistema crean rutas de escalada de privilegios.
Identificar capacidades en los binarios del sistema:
bashgetcap -r /usr/bin 2>/dev/null
getcap -r /usr/sbin 2>/dev/null
Eliminar capacidades innecesarias (ejemplo):
bashsudo setcap -r /usr/bin/dumpcap
sudo setcap -r /usr/bin/chsh
Documente qué capacidades son necesarias para sus aplicaciones y elimine el resto: cada una de ellas representa una escalada potencial de privilegios si se explota.
Endurecimiento y mantenimiento continuos
Tras aplicar estas 15 medidas de refuerzo, la seguridad se convierte en un proceso continuo:
Tareas mensuales: Revise los registros de auditoría en busca de anomalías, compruebe las prohibiciones de Fail2ban en busca de patrones, actualice los parámetros del núcleo según sea necesario, verifique que los perfiles de AppArmor estén funcionando.
Tareas trimestrales: Ejecute análisis completos de rootkits, revise las reglas del cortafuegos en busca de excepciones innecesarias, audite las cuentas de usuario en busca de accesos inactivos, compruebe si hay servicios obsoletos que puedan desactivarse.
Anualmente: Realización de auditorías de seguridad exhaustivas utilizando herramientas como Lynis, revisión y actualización de todas las políticas de seguridad, comprobación de los procedimientos de recuperación en caso de catástrofe, actualización de los planes de respuesta a incidentes.
Conclusión
La diferencia entre un servidor Debian 12 vulnerable y uno reforzado reside en la ejecución de estos 15 pasos que muchos administradores de sistemas pasan por alto. Desde actualizaciones de seguridad automatizadas y endurecimiento de claves SSH hasta ajuste de parámetros del kernel, registro exhaustivo y monitorización continua, cada medida aborda vectores de ataque específicos que los atacantes sofisticados explotan a diario.
Empiece por los pasos básicos: actualización automática, autenticación de claves SSH, configuración del cortafuegos y activación de 2FA. A continuación, pase a la supervisión y la detección de intrusiones. No intente implementarlo todo simultáneamente; el refuerzo por fases evita errores de configuración y le permite comprender cada componente. Documente los cambios minuciosamente, pruebe las configuraciones antes de desplegarlas en producción y mantenga prácticas de supervisión periódicas.
Su servidor Debian 12 nunca será 100% seguro: la seguridad es un viaje continuo, no un destino. Pero implementando estos 15 pasos de refuerzo, eliminará la fruta al alcance de la mano que explotan los ataques automatizados y establecerá defensas lo suficientemente sofisticadas como para repeler a todos los adversarios, excepto a los más decididos y con más recursos.









