Contenuti

Allarme intrusi

Essenzialmente ricevi un messaggio in telegram per ogni tentativo di accesso fallito al tuo sistema. Funziona con ogni tipo di login, SSH compreso. E ti da anche una foto dell’aggressore (da webcam).

come funziona

Grazie alla modularità di PAM, è facile integrare i propri script. Questo script acquisisce un’immagine dalla webcam e manda un messaggio usando telegram, accompagnato dalla foto appena acquisita.

Lo script è fatto in python e grazie ad alcune librerie è veramente semplice.

Se la tua webcam ha un LED di attività, questo lampeggia solo per una frazione di secondo, è veramente improbabile che l’intruso lo noti.

prerequisiti

Come ho detto, abbiamo bisogno di alcune librerie di python, molte delle quali sono già incluse dell’installazione di deafult. Con un’eccezione:

1pip install telepot

Abbiamo anche bisogno di due binari esterni, i quali molto probabilmente sono già installati nel tuo sistema:

1apt install coreutils ffmpeg

Come sempre, questa era facile.

configurazione di PAM

Al momento, questa è l’unica parte “sporca” di tutta la cosa: devo ancora guardare se c’è un modo migliore per effettuare l’integrazione con PAM. Per ora, “funziona”.

Modifica /etc/pam.d/common-auth, cerca la linea contenente questo testo:

1auth	requisite		pam_deny.so

e modifica la linea appena sopra, cambiando “success=1” in “success=2”; poi inserisci questa nuova linea (sempre prima della riga con “pam_deny”):

1auth    [default=ignore]		pam_exec.so seteuid /usr/local/bin/badlogin.py

Assumiamo che il nostro script sarà posizionato in /usr/local/bin/badlogin.py. Non serve riavviare alcun servizio nè riavviare il computer.

Per riferimento, il file risultante dovrebbe essere qualcosa del genere (al netto dei commenti):

1auth	[success=2 default=ignore]	pam_unix.so nullok_secure
2auth    [default=ignore]                pam_exec.so seteuid /usr/local/bin/badlogin.py
3auth	requisite			pam_deny.so
4auth	required			pam_permit.so
5auth	optional	pam_ecryptfs.so unwrap
6auth	optional			pam_cap.so

lo script

Da mettere in /usr/local/bin/badlogin.py:

 1#!/usr/bin/python
 2
 3import telepot
 4import subprocess
 5import os
 6
 7bottoken = 'XXXXXXXXXXXXXXX'
 8
 9chat = 1111111111
10
11temp = subprocess.check_output(["mktemp", "tmp.XXX.jpg"]).rstrip()
12
13subprocess.call(["ffmpeg","-f", "video4linux2", "-s", "vga", "-i", "/dev/video0", "-vframes", "1", "-y", temp])
14
15# initialize telegram bot connection
16bot = telepot.Bot(bottoken);
17bot.sendMessage(chat, 'Failed login!!!')
18bot.sendPhoto(chat, open(temp, 'rb'))
19
20os.remove(temp)

E non dimenticare di fare chmod 755 /usr/local/bin/badlogin.py.

Due cose mancano ora: il bot-token e la chat-id. Li vedremo entrambi dopo. Per ora guardiamo il codice:

  • prima di tutto, importiamo delle librerie, e indichiamo le due variabili di cui sopra
  • poi si chiama “mktemp”, il quale creerà un file temporaneo (il cui nome finisce in .jpg, questo è importante)
  • dopodichè si chiama un altro binario esterno: ffmpeg. Questo è responsabile della cattura dell’istantanea e del salvataggio nel nostro file temporaneo (riscrivendolo)
  • poi arriva la roba di telegram: inizializzazione del bot, invio del messaggio di testo e dell’immagine
  • pulizia del file temporaneo

setup del bot telegram

Apri Telegram sul tuo PC o sullo smartphone e apri una chat con @botfather:

1/newbot

Ti chiederà un nome per il tuo bot. Chiamalo come vuoi (basta che finisca con ‘bot’)

1@my_new_auth_bot

Botfather ti darà il bot-token. Mettilo nello script, al posto di ‘XXXXXXXXXXXXXXX’.

1/setprivacy

Abilita la privacy per questo bot, per essere sicuri.

Ottenere la chat-id è un pò più macchinoso: il bot deve essere attivo e deve rispondere ai messaggi per questo. Quindi ecco un piccolo script:

 1#!/usr/bin/python
 2import time
 3import telepot
 4
 5bottoken = 'XXXXXXXXXXXXXXX'
 6
 7def handle(msg):
 8    content_type, chat_type, chat_id = telepot.glance(msg)
 9    print (chat_id)
10
11bot = telepot.Bot(bottoken);
12bot.message_loop(handle)
13# Keep the program running. CTRL+C to stop
14while 1:
15    time.sleep(10)

Metti il token al posto giusto ed esegui lo script: il bot comincerà ad ascoltare, basta mandargli (col tuo client telegram) un messaggio con scritto:

1/start

e lui stamperà su console la chat-id. Quando hai segnato quel numero, premi CTRL+C per fermare il programma e buttalo via. Metti la chat-id nel posto giusto nello script finale e sei a posto.

Divertiti!

miglioramenti futuri

  • migliore integrazione con PAM (non è elegante toccare la configurazione di sistema di PAM, è meglio aggiungere la nostra in un file a parte)
  • setup del bot telegram
  • controllare che la webcam sia disponibile prima di fare la foto
  • screenshot di quanto c’è effettivamente su schermo
  • file di configurazione
  • pacchetto .deb
  • usare qualcosa di integrato in python al posto di mktemp
  • usare la libreria ffmpeg di python al posto di ffmpeg