En el panorama actual de ciberseguridad, donde los ataques de fuerza bruta y las intrusiones no autorizadas están en constante aumento, monitorear quién accede a nuestros servidores se ha convertido en una práctica esencial. El protocolo SSH (Secure Shell), aunque diseñado para ser seguro, sigue siendo uno de los vectores de ataque más comunes contra servidores Linux.
El Problema: Visibilidad en los Accesos SSH
Los administradores de sistemas frecuentemente se enfrentan a preguntas críticas: ¿quién se está conectando a mi servidor?, ¿desde qué ubicaciones?, ¿hay intentos de acceso sospechosos? Sin las herramientas adecuadas, estas preguntas pueden quedar sin respuesta hasta que sea demasiado tarde.
«La seguridad que no se puede medir, no se puede mejorar», es un principio fundamental en la administración de sistemas moderna. Por ello, implementar un sistema de monitoreo efectivo de conexiones SSH no es solo una buena práctica, sino una necesidad imperante.
Configurando el Monitoreo: Más Allá del Puerto Estándar
Aunque SSH tradicionalmente opera en el puerto 22, muchos administradores optan por cambiar este puerto como medida de seguridad básica. Sin embargo, los principios de monitoreo se mantienen constantes, independientemente del puerto utilizado.
Abriendo el Puerto con iptables
Para nuestro ejemplo práctico, utilizaremos el puerto estándar 22, pero estos mismos comandos son aplicables a cualquier puerto personalizado:
# Para puerto estándar SSH (22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Para cualquier puerto personalizado (ejemplo: 65432)
sudo iptables -A INPUT -p tcp --dport 65432 -j ACCEPT
Lenguaje del código: PHP (php)
Nota importante: Si tu servidor utiliza un puerto SSH personalizado, simplemente reemplaza «22» por tu puerto específico en todos los comandos siguientes.
Técnicas de Monitoreo en Tiempo Real
1. Análisis de Logs del Sistema
El archivo /var/log/auth.log
en sistemas Ubuntu/Debian (o /var/log/secure
en CentOS/RHEL) es la fuente principal de información sobre autenticaciones SSH:
# Revisar conexiones SSH recientes en puerto 22
sudo grep "sshd.*port 22" /var/log/auth.log | tail -20
# Filtrar solo conexiones exitosas
sudo grep "Accepted password\|Accepted publickey" /var/log/auth.log | tail -10
# Identificar intentos de acceso fallidos
sudo grep "Failed password" /var/log/auth.log | tail -15
Lenguaje del código: PHP (php)
2. Monitoreo de Conexiones Activas
Para obtener una vista en tiempo real de quién está conectado:
# Ver conexiones SSH activas
sudo netstat -tnpa | grep :22
# o usando la herramienta más moderna
sudo ss -tnp | grep :22
# Mostrar usuarios conectados actualmente
w
who
Lenguaje del código: PHP (php)
3. Análisis Estadístico de Conexiones
Una de las técnicas más reveladoras es el análisis estadístico de los intentos de conexión:
# Contar intentos por dirección IP
sudo grep "sshd" /var/log/auth.log | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | head -10
# Ver patrones de conexión por hora
sudo grep "$(date '+%b %d')" /var/log/auth.log | grep "sshd" | awk '{print $3}' | cut -d: -f1 | sort | uniq -c
Lenguaje del código: PHP (php)
Herramientas Avanzadas de Monitoreo
Script de Monitoreo Automatizado
Para administradores que requieren informes regulares, aquí presentamos un script completo:
#!/bin/bash
# ssh_monitor.sh - Monitor de conexiones SSH
echo "=== REPORTE DE SEGURIDAD SSH - $(date) ==="
echo
echo "1. CONEXIONES ACTIVAS:"
sudo ss -tnp | grep :22 | awk '{print " - Desde:", $5, "hacia:", $4}'
echo
echo "2. ÚLTIMAS CONEXIONES EXITOSAS:"
sudo grep "Accepted" /var/log/auth.log | tail -5 | while read line; do
echo " - $line"
done
echo
echo "3. TOP 5 IPs CON MÁS INTENTOS DE CONEXIÓN:"
sudo grep "sshd" /var/log/auth.log | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c | sort -nr | head -5 | while read count ip; do
echo " - $ip: $count intentos"
# Opcional: información de geolocalización
whois $ip | grep -i "country\|netname" | head -2 | sed 's/^/ /'
done
Lenguaje del código: PHP (php)
Monitoreo Continuo con journalctl
Para sistemas que utilizan systemd, journalctl
ofrece capacidades avanzadas:
# Seguir logs SSH en tiempo real
sudo journalctl -u ssh -f
# Ver logs de SSH de las últimas 24 horas
sudo journalctl -u ssh --since "24 hours ago"
# Filtrar por eventos específicos
sudo journalctl -u ssh --since "1 hour ago" | grep "Failed\|Accepted"
Lenguaje del código: PHP (php)
Detección de Amenazas y Patrones Sospechosos
Indicadores de Compromiso
Los administradores deben estar atentos a estos patrones:
- Múltiples intentos fallidos desde la misma IP
- Conexiones desde ubicaciones geográficas inusuales
- Intentos de conexión fuera del horario laboral
- Uso de nombres de usuario comunes (admin, root, test)
Automatización de Alertas
# Script para detectar ataques de fuerza bruta
#!/bin/bash
THRESHOLD=10
LOGFILE="/var/log/auth.log"
# Buscar IPs con más de X intentos fallidos en la última hora
sudo grep "$(date '+%b %d %H:')" $LOGFILE | grep "Failed password" | \
awk '{print $(NF-3)}' | sort | uniq -c | \
while read count ip; do
if [ $count -gt $THRESHOLD ]; then
echo "ALERTA: $ip ha intentado $count conexiones fallidas en la última hora"
# Aquí podrías enviar una notificación por email o Slack
fi
done
Lenguaje del código: PHP (php)
Aplicabilidad Universal: Más Allá del Puerto 22
Es crucial entender que estos métodos de monitoreo son completamente escalables y aplicables a cualquier configuración SSH:
- Puerto personalizado (ej: 2222): Solo cambia
:22
por:2222
en los comandos - Múltiples puertos SSH: Aplica el monitoreo a cada puerto individualmente
- Configuraciones con balanceadores: Adapta los filtros de log según tu configuración
Ejemplo para Puerto Personalizado
# Para SSH en puerto 2222
sudo ss -tnp | grep :2222
sudo grep "port 2222" /var/log/auth.log | grep "Accepted"
Lenguaje del código: PHP (php)
Mejores Prácticas y Recomendaciones
Configuración de Logging Avanzado
Para un monitoreo más detallado, considera ajustar la configuración SSH:
# En /etc/ssh/sshd_config
LogLevel VERBOSE
# Esto proporcionará información más detallada en los logs
Lenguaje del código: PHP (php)
Integración con Herramientas de Monitoreo
Los datos recopilados pueden integrarse fácilmente con:
- Elastic Stack (ELK) para visualización avanzada
- Prometheus + Grafana para métricas en tiempo real
- Splunk para análisis empresarial
- Nagios/Zabbix para alertas automáticas
Consideraciones de Rendimiento y Almacenamiento
El monitoreo intensivo puede generar grandes volúmenes de logs. Implementa estrategias de rotación:
# Configurar logrotate para auth.log
sudo nano /etc/logrotate.d/rsyslog
# Ejemplo de configuración
/var/log/auth.log {
daily
rotate 30
compress
delaycompress
missingok
postrotate
systemctl reload rsyslog
endscript
}
Lenguaje del código: PHP (php)
Conclusión: Seguridad Proactiva vs. Reactiva
El monitoreo efectivo de conexiones SSH representa la diferencia entre una postura de seguridad reactiva y proactiva. Las herramientas y técnicas presentadas en este artículo permiten a los administradores mantener visibilidad completa sobre el acceso a sus sistemas, independientemente del puerto utilizado.
La implementación de estos métodos de monitoreo no solo mejora la postura de seguridad, sino que también proporciona datos valiosos para auditorías de cumplimiento y análisis forense en caso de incidentes.
Recordatorio importante: Estas técnicas son aplicables a cualquier puerto SSH, simplemente ajustando los números de puerto en los comandos presentados. La seguridad no debe depender únicamente del cambio de puerto, sino de un monitoreo continuo y efectivo.
Para mantenerte actualizado sobre las mejores prácticas de seguridad en sistemas Linux, considera implementar estas técnicas de monitoreo como parte de tu estrategia integral de ciberseguridad.