Servidores Linux

¿Quién inició sesión en mi servidor? Audite accesos SSH y aaPanel y reciba alertas de Telegram por cada acceso

6 pasos 15 min de lectura 10 vistas 0
Contenido

La mayoría de las intrusiones se descubren tarde porque nadie revisa quién inicia sesión. Un atacante con una contraseña robada inicia sesión exactamente igual que usted, y la línea del registro parece normal a menos que sepa qué IP y qué claves son suyas. Esta guía muestra cómo auditar los inicios de sesión SSH en un servidor Linux, asociar cada inicio de sesión con una clave, revisar los inicios de sesión del panel aaPanel (BaoTa) y enviar un mensaje de Telegram cada vez que alguien inicia sesión, para que un desconocido destaque en cuestión de segundos.

Paso 1: quién está conectado ahora mismo

who                 # interactive sessions
ss -tnp | grep sshd # every SSH connection, including tunnels without a terminal
Una sesión SSH usada solo para reenvío de puertos (ssh -N) no abre una terminal, por lo que no aparece en who ni en w. Revise siempre también ss -tnp o ps -ef | grep "sshd:". Una conexión desde una IP que no reconoce y que lleva días abierta es una señal de alarma seria.

Paso 2: revise el historial de inicios de sesión

last -a | head -30          # successful logins (from /var/log/wtmp)
lastb -a | head -30         # failed logins (from /var/log/btmp)

# Successful SSH logins with the method used (password or key)
grep "Accepted" /var/log/auth.log | tail -50        # Debian / Ubuntu
grep "Accepted" /var/log/secure | tail -50          # Rocky / AlmaLinux / CentOS
journalctl -u ssh -u sshd --since "7 days ago" | grep Accepted

Cada línea muestra el método, el usuario, la IP de origen y, en el caso de las claves, la huella de la clave:

Accepted password for root from 198.51.100.7 port 51234 ssh2
Accepted publickey for root from 203.0.113.20 port 60122 ssh2: ED25519 SHA256:Xq3vR8...

Resúmalas para ver de un vistazo todas las IP de origen y los métodos:

grep -h "Accepted" /var/log/auth.log* 2>/dev/null | awk '{for(i=1;i<=NF;i++){if($i=="Accepted")m=$(i+1); if($i=="from")ip=$(i+1)}; print m, ip}' | sort | uniq -c | sort -rn

Si solo inicia sesión con claves, cualquier línea Accepted password es sospechosa.

Paso 3: compare las huellas con sus claves

Liste las huellas de todas las claves que pueden iniciar sesión y compárelas con las huellas del registro:

ssh-keygen -lf /root/.ssh/authorized_keys
for h in /home/*; do [ -f "$h/.ssh/authorized_keys" ] && ssh-keygen -lf "$h/.ssh/authorized_keys"; done

Cada clave debe tener un comentario que usted reconozca (como alice@laptop). Elimine las claves que no pueda explicar y compruebe que nadie haya añadido archivos de claves adicionales mediante AuthorizedKeysFile en /etc/ssh/sshd_config.

Paso 4: revise los inicios de sesión de aaPanel (BaoTa)

En aaPanel, la página de inicio muestra los últimos inicios de sesión en el panel, y Logs → Panel logs (registros → registros del panel) lista cada inicio de sesión con su IP. También puede leerlos desde la línea de comandos:

sqlite3 /www/server/panel/data/default.db \
  "select addtime, log from logs where type in ('Login','用户登录') order by id desc limit 30"

Después de un inicio de sesión, revise en esos mismos registros qué hizo esa sesión (subidas y descargas de archivos, tareas cron, sitios nuevos). Luego active Google Authenticator (verificación en dos pasos) en Settings (configuración), defina una entrada de seguridad y limite el acceso al panel por IP cuando sea posible, como se describe en la guía de seguridad de aaPanel.

Paso 5: reciba un mensaje de Telegram por cada inicio de sesión SSH

Cree un bot de Telegram con @BotFather, envíele un mensaje y obtenga su chat ID como se muestra en la guía del informe diario del servidor con IA. Después cree el script de alerta:

cat > /usr/local/bin/ssh-login-alert.sh <<'EOF'
#!/bin/bash
# Called by PAM when an SSH session opens: send user, source IP and host to Telegram
[ "$PAM_TYPE" = "open_session" ] || exit 0
TG_TOKEN="123456789:replace-with-your-bot-token"
TG_CHAT="123456789"
TEXT="SSH login on $(hostname): user=${PAM_USER} from=${PAM_RHOST} at $(date '+%F %T %Z')"
curl -s -m 5 "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
  --data-urlencode "chat_id=${TG_CHAT}" --data-urlencode "text=${TEXT}" >/dev/null 2>&1 &
exit 0
EOF
chmod 700 /usr/local/bin/ssh-login-alert.sh

Engánchelo a PAM para que se ejecute en cada sesión SSH, incluidos los inicios de sesión con clave y los túneles:

echo "session optional pam_exec.so /usr/local/bin/ssh-login-alert.sh" >> /etc/pam.d/sshd
grep -i "^UsePAM" /etc/ssh/sshd_config   # must be "UsePAM yes" (the default on most systems)

Mantenga abierta su ventana SSH actual, inicie sesión desde una segunda ventana y compruebe que llega el mensaje de Telegram. La palabra clave optional y el tiempo de espera de 5 segundos hacen que una caída de Telegram nunca bloquee su inicio de sesión.

Para añadir la huella de la clave a la alerta, lea dentro del script la última línea Accepted de ese usuario a partir de journalctl -u ssh -n 20. Mantenga el script breve: se ejecuta en cada inicio de sesión.

Paso 6: ponga difícil el robo de accesos

  • Use solo inicio de sesión con clave y desactive las contraseñas: inicio de sesión SSH con clave en Linux.
  • Nunca reutilice la misma contraseña de root en varios servidores. Si lo hace, una sola contraseña robada abre todas las máquinas, incluidos los servidores de salto (jump hosts) y los servidores de gestión.
  • Bloquee los ataques de fuerza bruta con Fail2ban y mantenga los puertos del panel cerrados a internet siempre que sea posible.
  • Si encuentra un inicio de sesión que no puede explicar, siga cómo comprobar si un servidor Linux ha sido hackeado antes de cambiar nada más, y renueve todas las contraseñas y claves a las que el servidor tenía acceso.

Preguntas frecuentes

last no muestra nada, pero auth.log tiene inicios de sesión

Las sesiones no interactivas (scp, sftp, túneles) a menudo no escriben en wtmp. El registro de SSH y la alerta PAM anterior sí las detectan.

Los archivos de registro rotan. ¿Hasta cuándo puedo mirar hacia atrás?

Revise /var/log/auth.log.1 y los archivos comprimidos .gz (zgrep Accepted /var/log/auth.log*). Para un historial más largo, envíe los registros a otro servidor o conserve las alertas de Telegram.

¿Sigue con problemas después de seguir estos pasos? Abra un ticket de soporte y el equipo técnico 24/7 de IMIDC le ayudará. Incluya la IP del servidor y las líneas de registro sospechosas para que podamos localizar el problema más rápido.

¿Fue útil la respuesta?

Tutoriales relacionados