Notificări automate la autentificarea SSH cu ntfy
Dacă administrezi un server, știi că una dintre cele mai importante lucruri pe care vrei să le știi în timp real este când se conectează cineva prin SSH. Nu neapărat pentru că te aștepți la ceva rău, ci pentru că e bine să fii la curent cu ce se întâmplă pe mașina ta. O autentificare neașteptat la 3 dimineața merită o notificare.
Există mai multe metode pentru asta, dar cea mai simplă combinație este PAM împreună cu ntfy - un serviciu de notificări push open source pe care îl poți folosi fie prin instanța publică de la ntfy.sh, fie self-hosted pe propriul server.
Ce este ntfy
ntfy este un program simplu de notificări push bazat pe un model de tip publish/subscribe. Publici un mesaj către un topic (o adresă unică), iar toate dispozitivele abonate la acel topic primesc notificarea instantaneu. Nu necesită cont, nu necesită autentificare pentru utilizare de bază - ai nevoie doar de un nume de topic suficient de greu de ghicit și de aplicația instalată pe telefon. Are aplicații native pentru Android și iOS, iar pe Android este disponibil și prin F-Droid.
Cum funcționează mecanismul
PAM (Pluggable Authentication Modules) este sistemul de autentificare folosit de majoritatea distribuțiilor Linux. Printre altele, PAM poate executa un script la deschiderea oricărei sesiuni - inclusiv SSH. Scriptul primește automat câteva variabile de mediu utile: PAM_USER cu numele utilizatorului, PAM_RHOST cu adresa IP de unde vine conexiunea și PAM_TYPE cu tipul evenimentului. Tot ce trebuie să facem este să scriem un script care trimite aceste informații ca notificare prin ntfy.
Instalarea aplicației pe telefon
Înainte de orice, instalează aplicația ntfy pe telefon. Pe iOS o găsești în App Store, pe Android în Google Play sau F-Droid.
Scriptul de notificare
Creează fișierul /etc/ssh/login-notify.sh:
nano /etc/ssh/login-notify.sh
Adaugă următorul conținut:
#!/bin/bash [ "$PAM_TYPE" != "open_session" ] && exit 0 USER="$PAM_USER" IP="$PAM_RHOST" HOST=$(hostname) TIME=$(date '+%Y-%m-%d %H:%M:%S') curl -s -X POST https://ntfy.sh/TOPICUL-TAU \ -H "Title: Login SSH - $HOST" \ -d "User: $USER | IP: $IP | $TIME" \ > /dev/null 2>&1
Linia [ „$PAM_TYPE“ != „open_session“ ] && exit 0 asigură că scriptul rulează doar la deschiderea unei sesiuni, nu și la închidere sau la alte evenimente PAM.
Înlocuiește TOPICUL-TAU cu un șir random și greu de ghicit, de genul server-login-k7x9mq2p. Asta este „adresa“ ta privată pe ntfy - oricine cunoaște numele topic-ului poate să se aboneze și să vadă notificările, deci cu cât e mai greu de ghicit, cu atât mai bine. Poți genera un șir random direct din terminal:
cat /dev/urandom | tr -dc 'a-z0-9' | head -c 12
Faci scriptul executabil:
chmod +x /etc/ssh/login-notify.sh
Configurarea PAM
Deschide fișierul de configurare PAM pentru SSH:
nano /etc/pam.d/sshd
Adaugă la sfârșit:
session optional pam_exec.so /etc/ssh/login-notify.sh
Cuvântul cheie optional înseamnă că dacă scriptul eșuează din orice motiv (de exemplu serverul ntfy.sh nu e accesibil), autentificarea SSH continuă normal fără nicio problemă.
Abonarea pe telefon
Deschide aplicația ntfy, apasă + și introdu același topic pe care l-ai folosit în script. De acum, orice autentificare SSH pe server va genera o notificare pe telefon cu hostname-ul serverului, utilizatorul și IP-ul de origine.
Testarea înainte de a te deconecta
Este important să testezi scriptul manual înainte de a închide sesiunea SSH curentă, ca să te asiguri că totul funcționează:
PAM_TYPE=open_session PAM_USER=utilizatorul_tau PAM_RHOST=1.2.3.4 /etc/ssh/login-notify.sh
Dacă primești notificarea pe telefon, configurarea este completă. Abia după ce confirmi că funcționează te poți deconecta în siguranță.
Mai multe servere
Dacă administrezi mai multe servere, poți folosi același topic pe toate - variabila $HOST din notificare îți spune mereu de pe ce mașină vine autentificarea. Scriptul și configurarea PAM sunt identice pe fiecare server.