Google – Internet: Diritti e Regole

Google - Internet diritti e regole“Internet: diritti e regole” è la confereza che si è tenuta lunedì 29 novembre alle ore 20 a Roma. L’incontro – promosso da Google, Reti, Federazione delle micro web tv FEMI e dal network Altratv.tv – permetterà un approfondimento sui temi regolamentatori della rete. All’incontro intervengono Stefano Rodotà, Arturo Di Corinto, Alessandro Gilioli. Modera Guido Scorza. La conferenza sarà trasmessa in diretta su Altratv.tv e sulle micro web tv della federazione delle micro web tv FEMI

Tags: , , , , , , , , , , , , , , , ,

Guida – Script Python, bloccare indirizzi IP che tentano attacchi brute force

Vincenzo Argese - elven.itCon questo articolo, riprendiamo la rubrica di informatica.
In fondo, elven.it nel 2004 era nato come sito di approfondimento informatico con lo scopo di trattare argomenti legati all’opensouce come programmazione, sistemi operativi della famiglia unix come linux e BSD, reti, internet e sicurezza informatica.

Vogliamo realizzare in questa guida uno script molto semplice e ideale a livello didattico per far comprendere la potenza del linguaggio di programmazione Python, la struttura dei log e alcuni file di configurazione utili di linux.
Questo articolo comprende anche una VideoGuida dove vengono spiegate le operazioni da fare e ogni riga di codice dello script.

Questo programma in python, permette di bloccare o bannare gli indirizzi IP dei computers che tentano di accedere al nostro sistema tramite la tecnica del brute force o a forza bruta.
Un attacco di tipo brute force si verifica quando un utente ma molto più spesso un software, tenta in modo stupido e metodico, la connessione su un server provando e riprovando combinazioni di password e username finché non viene trovata la combinazione corretta per l’accesso.
Qualche premessa prima di vedere il codice sorgente, mi sembra dovuta, questo script non vuole essere una soluzione completa al problema e di sicuro non è la migliore, ma solo una soluzione didattica funzionante e funzionale.
Con questo piccolo programma in python non facciamo altro che copiare testo tra due semplici file, averlo applicato ad un problema sistemistico reale rende, semplicemente, la guida più divertente.
Voglio sottolineare che il problema della sicurezza informatica è un qualcosa di molto più complesso e non può essere risolto con una semplice guida e qualche riga di codice e chi ha provato a studiare questa materia, penso sia arrivato alla conclusione che per quanto si voglia rendere sicuro un sistema non si potrà mai farlo al 100% (le percentuali sono molto ma MOLTO più basse).

Sicuramente possiamo, successivamente, migliorare il programma aggiungendo altre funzionalità come ad esempio gestire indirizzi IP uguali, questo programma infatti non si preoccupa di verificare se in hosts.deny è già presente un IP che stiamo bloccando, la ricerca degli IP è fatta tramite il metodo per la libreria string di python, qualcuno potrebbe pensare di modificarlo usando le espressioni regolari (regular expression), lo script potrebbe essere realizzato usando lo shell scripting, si potrebbe realizzare una comoda interfaccia di gestione, dare la possibilità di poter settare tramite un file di configurazione i file log da controllare e le informazioni da gestire e mille altre features mi vengono in mente mentre scrivo questa guida, nulla toglie che se prendete questo programma e lo usate, fa semplicemente quello che è stato programmato per fare… bloccare gli IP.

Detto questo, passiamo al nostro lavoro, lo script si occuperà di identificare i tentativi di connessioni non riuscite sul nostro server andando a verificare il file /var/log/auth.log per ottenere l’IP dalla macchina ultima che l’ “Hacker” sta usando per eseguire l’ “attacco” e inserirlo nel nel file /etc/hosts.deny bloccando l’accesso al nostro server dall’IP indicato.

Prerequisiti:
Per meglio comprendere quello che andiamo a realizzare, bisognerebbe conoscere qualche comando base di linux, la struttura delle directory e dei file e aver studiato un qualsiasi linguaggio di programmazione anche in modo molto elementare.
Altro prerequisito importante è avere a disposizione due computer per effettuare i test o in alternativa utilizzare e conoscere un sistema di virtualizzazione come VirtualBox.

Andiamo nel dettaglio.
Python è un linguaggio di programmazione ad alto livello interpretato e permette di realizzare codice sorgente in molti paradigmi di programmazione, ma la cosa importante da sapere è che in Python tutto è un oggetto (OOP – Object-oriented programming – Programmazione Orientata agli Oggetti).
Con questo linguaggio possiamo realizzare applicazioni complesse con o senza interfaccia grafica (GUI), multi piattaforma, applicazioni Web e semplici o complessi script di automazione.
Senza ombra di dubbio Python è un grande alleato di ogni sistemista.
Il sistema operativo su cui andiamo a lavorare e per cui realizzeremo il nostro script didattico è linux. Potete scegliere la distribuzione che preferite, personalmente scelgo Debian e derivate ma con poche modifiche il programma può essere adattato su ogni sistema unix like.

I due file su cui andiamo a lavorare sono:
/var/log/auth.log
è uno dei file log di sistema, contiene informazioni che hanno un valore inestimabili per chiunque lavori con linux e in particolare contiene i log di accesso al sistema.
Un file di log è un semplice file di testo su cui il sistema scrive tutto quello che avviene nel sistema stesso, ne esistono tantissimi quello su cui si basa la nostra guida contiene le informazioni relative alle connessioni e agli accessi.

/etc/hosts.deny contiene le regole per negare l’accesso a tutti i client.

Il nostro script non dovrà fare altro che leggere il file /var/log/auth.log verificare se gli IP che stanno tentando l’accesso al nostro server falliscano per un certo numero di volte prestabilito, prendere l’IP e scriverlo nel file /etc/hosts.deny applicando la regola per bloccare completamente l’IP.

Ambiente di lavoro:
Per testare il nostro script utilizzeremo due computer con sistema operativo linux e in particolare un client da cui tenteremo di eseguire le connessioni e un sistema operativo che fungerà da server che riceverà le connessioni dal client.
Per realizzare questo piccolo sistema sono necessari due computer collegati in rete o come si è preferito in questa guida, il server sarà virtualizzato tramite VirtualBox opportunamente configurato per fare in modo che la macchina virtuale risulti presente nella rete del sistema desktop su cui viene eseguito mentre il client sarà il pc desktop su cui è installato VirtualBox.

Riepilogando:

Client :
Computer FISICO desktop;
Sistema Operativo Ubuntu 9.10;
IP 192.168.1.2

Server:
Macchina virtuale (VirtualBox)
Sistema Operativo Debian GNU Linux 5.0 Lenny
IP 192.168.1.150
Nome utente: vincenzo
File di log: /var/log/auth.log
File gestione host: /etc/hosts.deny

Per funzionare in modo corretto avete bisogno sul server di almeno un editor di testo e l’interprete python, in questo caso come editor di testo ho scelto vim, voi potete usare quello che preferite.
Python e Vim dovrebbero essere già presenti se state usando Debian ma per scrupolo lanciamo il comando per l’installazione di questi due pacchetti.

~# aptitude install vim python

PROCEDIAMO:

1) Testare il corretto funzionamento del sistema prima di eseguire lo script
Eseguire la connessione dal client sul server tramite il comando ssh
ssh nome utente@host

Esempio:

vincenzo@desktop:~/tmp$ ssh vincenzo@192.168.1.150
vincenzo@192.168.1.150′s password:
Linux elvenit 2.6.26-2-686 #1 SMP Wed Feb 10 08:59:21 UTC 2010 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
No mail.
Last login: Wed Mar 10 16:49:47 2010

Se tutto avviene in modo corretto come da esempio, disconnettersi dal server con il comando exit

vincenzo@elvenit:~$ exit
logout
Connection to 192.168.1.150 closed.
vincenzo@desktop:~/tmp$

2) Eseguire almeno 3 tentativi di connessione sbagliando volutamente password o username come da esempio:

vincenzo@desktop:~/tmp$ ssh vincenzo@192.168.1.150
vincenzo@192.168.1.150′s password:
Permission denied, please try again.
vincenzo@192.168.1.150′s password:
Permission denied, please try again.
vincenzo@192.168.1.150′s password:
Permission denied (publickey,password).
vincenzo@desktop:~/tmp$

A questo punto siamo sicuri che nel file log di sistema /var/log/auth.log sono presenti 3 tentativi di connessioni non riusciti, possiamo verificarlo collegandoci sul nostro server e guardando le ultime righe del file auth.log con il comando tail:

da root o con il comando sudo lanciare:

~# tail /var/log/auth.log

… righe del file di log…
Mar 10 19:44:04 elvenit sshd[2345]: Failed password for vincenzo from 192.168.1.2 port 50967 ssh2
Mar 10 19:44:07 elvenit sshd[2345]: Failed password for vincenzo from 192.168.1.2 port 50967 ssh2
… righe del file di log…

Queste che vedete in alto sono le righe del file di log che ci interessano e ci dicono: giorno data e ora, host, il protocollo, il messaggio loggato, l’ip del client che ha tentato la connessione e la porta.

Ok, la parte di queste righe che ci interessa è senza dubbio l’ip del client, nell’esempio 192.168.1.2 e la frase “Failed password” che useremo per individuare i tentativi di connessioni andati male.

3) A questo punto non resta che studiare il codice del nostro script ed eseguirlo:
Nella stesura del codice in questa guida farò ampio uso dei commenti.

Codice sorgente python per script blocca IP:
Fate il copia incolla del sorgente e salvatelo in un file con nome bannator.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

#——————————————————

# www.elven.it

# Script Python – bloccare IP da attacchi brute force

# file: bannator.py

# Vincenzo Argese info@elven.it

#——————————————————

# Importiamo la libreria string per gestire le righe dei file
import string

# In questa variabile inseriamo il percorso del file di log
pathlog = ‘/var/log/’

# Indichiamo in questa variabile il file di log su da verificare
filelog = ‘auth.log’

# Specifichiamo il path file hosts.deny
pathban = ‘/etc/’
#
fileban = ‘hosts.deny’

# Nella variabile target specifichiamo la stringa da utilizzare nella ricerca degli indirizzi IP
# che stanno tentando l’accesso nel nostro sistema. Sappiamo che i log sono presenti nel
# file /var/log/auth.log e la riga del log con l’accesso fallito e’
# Failed password for invalid user admin from 192.168.1.2 port 17727 ssh2
# Quindi prendiamo come riferimento la stringa ‘Failed password’
#
target = ‘Failed password’

# Numero di tentativi massimi consentiti da ogni IP per connettersi al server
# su cui e’ in esecuzione questo script.
#
BANNA = 3

# Iniziamo a realizzare il codice vero e proprio:

# Contiamo il numero di caratteri della stringa contenuta in target, questo numero ci
# permettera’ di gestire la stringa e identificare in modo assolutamente preciso l’IP da bloccare.
#
lunghezza = len(target)

# Apro il file auth.log in sola lettura (perche’ devo semplicemente ricavare l’informazione
# sulle connessioni e sugli IP)
#
f = file(pathlog+filelog, ‘r’)

# Creiamo un dizionario python contenente gli IP bannati.
# Il dizionario e’ una struttura che ci permette di gestire le informazioni per chiave e valore
# nel nostro caso useremo come chiave l’IP e come valore un numero intero che conta le volte
# che l’IP non riesce ad eseguire l’accesso.
# {key:valore, key2:valore2, …}
# es.: {’192.168.1.2′: 2, ’172.16.8.10′: 3}
#
ip_bannati = {}

# Leggo la prima riga del file auth.log e copio il contenuto nella variabile i;
i = f.readline()

# Ciclo il file finche’ la variabile i che contiene la riga da esaminare non e’ vuota
# quindi finche’ il file auth.log non e’ terminato.
#
while (i != “”):
    # Tramite il metodo find di string ottengo la posizione della stringa in cui stato trovato il target
    #
    posizione = string.find(i,target)

    # Se la posizione e’ diversa da -1 significa che il targhet e’ stato trovato
    # Quindi la stringa letta contiene ‘Failed password’ ora dobbiamo riuscire a prendere
    # la parte della stringa che contiene l’IP
    if posizione != -1:
        # RICERCA IP
        # Concentriamoci sulla riga del file auth.log e in particolare alle parole tra cui l’IP
        # e’ compreso: from 192.168.1.2 port
        #
        # Prima di identificare l’IP faccio la ricerca della stringa
        # from per assicurarmi la corretta posizione
        #
        inizio = string.find(i,”from”)
        if inizio != -1 :
            inizio = inizio + 5 # +5 caratteri di from e spazio

            # Calcolo la posizione finale tramite la stringa port
            fine = string.find(i,”port”)

            # Ottengo la substring con con l’IP da bannare
            ip = i[inizio:fine-1]

            # Se l’IP e’ gia’ presente in ip_bannati
            if ip in ip_bannati:
                # Aggiorna semplicemente il suo contatore
                ip_bannati[ip] = ip_bannati[ip] + 1
            else :
                # Altrimenti inserisci l’IP e imposta il suo contatore a 1
                ip_bannati[ip] = 1

        # A questo punto abbiamo finito il lavoro su una singola riga quindi procediamo
        # con la riga successiva del file auth.log e ed esaminiamola nuovamente con il ciclo while
        i = f.readline()

# In questo punto siamo usciti dal while, questo significa che il file auth.log e’ terminato
# e non abbiamo altre righe da esaminare, quindi possiamo chiudere il file.
f.close()

# Creo una copia di backup del file hosts.deny perche’ ogni volta che lancio lo script
# perdo gli IP bloccati precedentemente
denyold = file(pathban+fileban, ‘r’) # Apro hosts.deny in lettura
deny = file(‘_’+fileban, ‘w’) # Creo il file _hosts.deny di backup

# Leggo tutte le righe di hosts.deny e le copio in _hosts.deny
i = denyold.readline()
while (i!=”"):
    deny.write(i)
    i = denyold.readline()

# Ora non resta che verificare quali IP hanno superato il numero
# massimo di tentativi consentiti e scriverli nel file _hosts.deny con la regola opportuna.
#
# Ciclo per verificare tutti gli IP inseriti nel dizionario
#
for i in ip_bannati :
    # Se l’IP ha superato il numero massimo di tentativi
    #
    if ip_bannati[i] > BANNA :
        # Scrivi nel file hosts.deny l’IP con la regola ALL = BLOCCA TUTTO
        # es.: ALL:192.168.1.10 e vai a capo.
        #
        deny.write(‘ALL:’+ i+’\n’)

# Chiudo i file
denyold.close()
deny.close()

# Copio il contenuto di _hosts.deny nel file /etc/hosts.deny
deny = file(pathban+fileban, ‘w’)
denytmp = file(‘_’+fileban, ‘r’)
i = denytmp.readline()
while (i!=”"):
    deny.write(i)
    i = denytmp.readline()

denytmp.close()
deny.close()
# Fine

4) Rendiamo eseguibile

~# chmod +x bannator.py

5) Eseguiamo lo script (sono necessari i permessi di root)

~# ./bannator.py

E’ chiaro che lo script deve essere lanciato con i permessi da superuser root, altrimenti non riesce ad eseguire le operazioni di scrittura su hosts.deny.

7 ) Se tutto è andato bene dobbiamo trovare nella directory del nostro script il file _hosts.deny di backup e se facciamo un cat del file /etc/hosts.deny deve contenere gli IP bloccati.

vincenzo@elvenit:~/tmp$ cat /etc/hosts.deny
ALL:192.168.1.2
vincenzo@elvenit:~/tmp$

A questo punto si potrebbe schedulare il nostro script con crontab in modo da automatizzare la sua esecuzione in intervalli di tempo prestabiliti ma questa è un’altra storia.

SE STATE LAVORANDO IN REMOTO RISCHIATE DI BANNARVI DA SOLI ;-)

DOWNLOAD SCRIPT
Nel caso in cui il copia incolla del codice generi qualche errore, potete scaricare il sorgente dello script bannator.py.
Una volta fatto il download del file bannator.txt, rinominare in bannator.py (cambiando semplicemente l’estensione da .txt a .py) ed eseguite i test.

Buon divertimento e continuate a seguirci su elven.it
Vincenzo Argese

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

No B Day, nulla sarà come prima

vignetta no b dayE’ stato l’evento dell’anno. Hai voglia a dire che non è così. A metterci su il cappello di qualche partito. A trarre analisi su cosa è stato e cosa non è stato il No B Day. Da quelle di Eugenio Scalfari su Repubblica a quelle di Massimo Franco su Il Corriere della Sera a quelle di Antonio Padellaro su Il Fatto Quotidiano e via così. No, non ne va bene praticamente nessuna. Il No B Day è stato l’anno zero di un nuovo modo di fare politica in Italia e nel mondo. Sui libri di storia tra venti anni se ne riparlerà. Si scriveranno tesi di laurea. E non mi stupirò se da qui a breve, qualcuno, di maggioranza con la complicità di un’opposizione che quasi sempre non è tale, cercherà di imbavagliare in modo stringente la rete in modo da toglierle il fiato, da non lasciarla respirare. Siamo il paese europeo dove internet è più lento eppure siamo l’unico dove una manifestazione del genere ha potuto essere organizzata. Probabilmente perché la rete è l’ultimo spazio dove poter dire la propria, organizzarsi e discutere in modo fresco e libero. Dove anche l’ultimo dei timidi, se ha un’idea interessante, può proporla e diffonderla trovando un seguito. Alla Questura che nel suo comunicato ufficiale ha affermato che in Piazza San Giovanni non ci fossero più di novantamila persone, non varrebbe la pena nemmeno rispondere se non fosse che il mio occhio, mentre ero lì, è stato colpito da una donna. E credo sia la migliore risposta su come questo in questo Paese l’informazione ufficiale sia ormai totalmente separata dalla vita reale. Mentre attendevamo che il grosso del corteo giungesse, ad anticiparlo sono arrivate le forze dell’ordine. Camionette e agenti di polizia e carabinieri scelti per il loro essere imponenti. Non c’è ne era uno di meno di un metro e novanta. Poi in un’auto della polizia. All’interno la donna cui accennavo prima, credo fosse un’ispettrice: indossava un maglione viola e sorrideva. Come le centinaia di migliaia di persone giunte in piazza. Si, il No B Day è stato anche questo. no b day fotoE’ stata anche la sensazione di un incontro tra cittadini e forze dell’ordine che finalmente si sono guardati senza sospetto. Sorridenti nella loro rabbia per un paese che si è spento. Che non ha rispetto e non garantisce chi lavora o lo cerca. Dagli studenti agli operai, agli impiegati, alle forse dell’ordine. Tutti, nessuno escluso. E’ vero, c’erano tante bandiere. Il bianco dell’Italia dei Valori se la giocava con il rosso dei partiti dell’estrema sinistra ma questo era un dettaglio di colore. Perché anche i due partiti, negli ultimi tempi più vicini alla piazza, erano solo un contorno. Le prove generali del 5 dicembre c’erano state a febbraio quando in poco più di tre giorni, alla manifestazione per la vita pro Eluana Englaro, la rete in cinque giorni, in un giorno feriale, aveva richiamato a Piazza Farnese oltre seimila persone. Con due mesi di preparazione si è giunti alle cifre che nessuno, politicamente schierato in Parlamento, vuole ammettere. Ma nemmeno può smentire. Si interrogano gli analisti su quale sarà il futuro del movimento viola. Non sanno dove andare a parare perché non conoscono i meccanismi della rete. Attribuiscono a questo o quel personaggio politico meriti e demeriti. Fanno rientrare tutto in logiche di partito che riconoscono. Ma non è sufficiente. L’onda viola è stato qualcosa di assolutamente nuovo. Autoconvocata e libera, ha detto bene Paolo Ferrero, segretario del Prc: “Noi non saremmo riusciti a organizzare una manifestazione del genere nemmeno in un anno”. Ecco, sta tutto qui il No B Day. Nessun partito può oggi organizzare una manifestazione del genere. I vertici dei tradizionali movimenti politici sono occupati da persone che hanno scarsa o poca dimestichezza con la rete: da Berlusconi, a Fini, a Casini, a Bossi, a Bersani ma anche Di Pietro che però ha colto la novità. Se non altro per gli spazi ridotti che gli vengono offerti dalle tv nazionali. E allora? La risposta è semplice. La rete appartiene ai giovani perché loro ne sono i principali fruitori. E’ una fruizione dinamica a cui loro credono e che sanno usare. Tanto che la stanno sostituendo alla televisione. foto no b dayParlano i dati di ascolto, in picchiata, di trasmissioni che a loro si rivolgono come il Grande Fratello o X-Factor. In piazza sabato 5 dicembre fondamentalmente c’erano due generazioni: tanti giovani fino a 35 anni e tanti anziani pensionati. Uniti nelle loro difficoltà. I primi senza contratti di lavoro che gli garantiscano un futuro accettabile, i secondi stretti dalla difficoltà di arrivare a fine mese con le pensioni minime che gli vengono attribuite. Si, il No B Day non è stato il giorno dei 45enni della penultima generazione garantita seppure per alcuni, messi in un angolo dalla crisi, licenziati quando mancava poco alla fine delle loro fatiche, lo diventerà. Comincia una nuova stagione. E non sarà breve quanto quella dei girotondi che, viceversa, ha rappresentato il saluto della vecchia. Il No B Day rappresenta l’inizio. Se sarà l’avvio di un cambiamento veloce, nessuno può dirlo. Il potere che ora c’è, farà di tutto per limitare l’onda viola, per negarla, per mantenere il controllo il più possibile a costo di mandare ancora più a gambe all’aria il Paese. E paradossalmente, così facendo, ingrosserà ancora di più l’onda che ha dimostrato di sapersi muovere autonomamente. no b dayUn anno fa nessuno poteva pensare che una manifestazione del genere potesse avere luogo. I partiti cercheranno di farla propria. Non è detto che ci riescano perché la rete non ha bisogno di loro. Internet non è luogo che si può incatenare. La sua risposta è semplice: se non mi piaci, non ti clicco. Forse la rete riuscirà con la sua velocità a smuovere questo vecchio paese dove i “cervelli” più promettenti fuggono all’estero perché i loro posti spettano per diritto famigliare ai più mediocri? Una cosa è certa: dopo sabato 5 dicembre nulla sarà più uguale a come è stato.

Tags: , , , , , , , , , , , , , ,

Vincenzo Argese © 2009 - Una produzione vaSystems Sviluppo siti internet, Assistenza Informatica

RIPRODUZIONE RISERVATA
Il contenuto di www.elven.it è coperto da licenza
Creative Commons Attribuzione-Non commerciale-Non opere derivate 2.5 Italia