Proteggersi da scansioni ed intrusioni

SysctlSysctl

Molte volte si pensa che per poter difendere il nostro amato PC da occhi indiscreti ci voglia chissa’ quale software sofisticato , oppure una decennale esperienza nella scrittura di regole con iptables ; certo tutto questo aiuta comunque, ma e’ anche vero che nella maggior parte dei casi il nostro PC non e’ poi cosi’ invitante e non contiene nessun vero segreto che valga la pena, per un hacker ( o x meglio dire chracker ) di perderci del tempo. Quindi molte volte alziamo fortificazioni esagerate, oltre il nostro vero sapere e controllo, senza avere un buon motivo. Si potrebbe invece iniziare a prendere dimestichezza con tutta quella serie di tools che Linux fornisce di base per cominciare a restringere le possibilita’ di accesso agli estranei ed ai curiosi.

Oggi inizieremo da sysctl ossia ” la gestione dei parametri del kernel  ”

Il comando sysctl viene usato per la personalizzazione dei parametri in run-time del kernel che si trovano in /proc/sys.
Per avere uno sguardo dell’output del comando basterà digitare da root:

sysctl -a

Le categorie

                 debug
                 dev
                 fs
                 kernel
                 net
                 vm

Significato
parametri per il debug.
parametri dei dispositivi.
parametri dei filesystem.
parametri generici del kernel.
parametri della rete.
parametri della memoria virtuale.

Praticamente possiamo modificare molti valori riguardanti il sistema,la rete,ecc.

Possiamo cambiare valore ai vari parametri in base alle nostre esigenze, facciamo un esempio.
Vogliamo cambiare valore all’ip forward:

sysctl -a | grep ip_forward

@lorenzo:/etc# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0

Come vediamo il valore è a 0 e noi lo vogliamo mettere a 1:

sysctl -w net.ipv4.ip_forward=”1″

Come possiamo vedere ha preso il valore 1:

@lorenzo:/etc# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0

Ovviamente questa modifica è temporanea infatti dopo un riavvio il valore torna a 0, ma possiamo renderla definitiva andato a editare il file /etc/sysctl.conf (facendo sempre prima un bel backup) mettendo 1 alla voce net.ipv4.ip_forward.

Una volta scritta la regola nel file ed usciti dalla modalita’ scrittura dovremo far rileggere la configurazione dei parametri di questo file tramite il seguente comando:

sysctl -p

Vediamo ora alcuni parametri e scopriamo a cosa servono :

net.ipv4.tcp_syncookies:  Quando abilitato, protegge dagli attacchi SYN FLOOD

net.ipv4.icmp_echo_ignore_broadcasts: Quando abilitato, ignora tutte le richieste ICMP ECHO e TIMESTAMP dirette ad indirizzi broadcast e multi cast proteggendo il server da attacchi SMURF.

net.ipv4.icmp_ignore_bogus_error_responses: Quando abilitato, protegge da errori ICMP maligni

net.ipv4.tcp_keepalive_time: Definisce ogni quanti secondi inviare al client con una connessione keepalive aperta un pacchetto in modo tale da mantenerla aperta.

L’abilitazione dei seguenti paramentri permette di inoltrare il traffico di rete da un’interfaccia ad un’altra agendo come un router:

net.ipv4.ip_forward
net.ipv4.conf.all.send_redirects
net.ipv4.conf.default.send_redirects

net.ipv4.tcp_max_syn_backlog=512   Quando la coda dei segmenti SYN provenienti da un certo host supera il numero stabilito in questo parametro il kernel invece di tenere i dati in arrivo nella coda dei pacchetti SYN in attesa di risposta, invierà un SYN+ACK di risposta.
Si svuota cosi la coda SYN, evitando che diventi troppo grande,

net.ipv4.icmp_echo_ignore_broadcasts = 1  Il kernel ignorerà i ping destinati all’indirizzo di broadcast della rete. Questo può evitare diversi tipi di attacchi DOS.

net.ipv4.ip_conntrack_max=15000  Viene impostato il numero massimo di connessioni che il sistema può gestire. E’ bene dimensionare tale numero in base alle risorse del sistema, per evitare in ogni momento il rischio che la RAM si esaurisca. *** ***Prevenzione attacchi DOS.

net.ipv4.ipfrag_high_tresh=131072

net.ipv4.ipfrag_low_tresh=102400

Queste due opzioni indicano la quantità di RAM massima e minima che deve essere usata nel momento in cui i segmenti TCP vengono riassemblati, per non esaurire la RAM.  ***Prevenzione attacchi DOS.

net.ipv4.ipfrag_time=20 Quest’opzione indica in secondi il tempo che i segmenti TCP devono essere tenuti in memoria

net.ipv4.conf.all.rp_filter=1 Quest’opzione è utile quando un pacchetto arriva in ingresso su un’interfaccia di rete diversa da quella che ci si aspetterebbe secondo le tabelle di routing.  ***Protezione contro attacchi di Spoofing

net.ipv4.tcp_mem = 12288, 16384, 24576
Queste impostazioni istruiscono lo stack TCP su come compostarsi nei riguardi dell’uso della memoria. Indicano al kernel qual’e’ la soglia al di sopra della quale debba iniziare un uso più attento della memoria. Il primo attributo indica il valore per il quale il kernel non si deve preoccupare dell’utilizzo della memoria. Il secondo attributo invece indica la valore per il quale il kernel deve iniziare a forzare la diminuzione dell’uso della memoria. Questo stato si chiama memory pressure mode.
L’ultimo valore indica il valore per il quale il kernel non può piu assegnare pagine di memoria finchè non torna sotto la soglia.

Per l’architettura x86 ad esempio le pagine di memoria sono grandi 4096 byte.
E’ bene dimensionare la configurazione di questa variabile in base alla RAM disponibile sulla propria macchina, per evitare l’esaurimento delle risorse.

Nel prossimo articolo vedremo altri tool ed altri sistemi di protezione integrati , bye !!

Wireshark Network Analyzer

wiresharkCos’e’ Wireshark 

E’ un network analyzer, tra i piu’ potenti, ossia e’ un software che permette l’analisi dei pacchetti che transitano in rete, con lo scopo di analizzarli e capire cosa sta succedendo sul nostro PC . E’ fornito di una serie di tool che rendono piu’ “dinamiche” l’analisi per poter cosi’ capire cosa c’e’ che non va nella nostra rete.

Wireshark ci permette di capire approfonditamente quali e quanti pacchetti ci sono in transito nella rete e tramite i molti tool a disposizione si potranno individuare i fenomeni che disturbano la nostra navigazione, permettendoci cosi’ anche di capire cosa fanno i computer vicino a noi.

Passato e futuro [ Ethereal & Wireshark] 

Ethereal e’ il nome originale di questo progetto ma la separazione tra gli sviluppatori originali ha contribuito alla nascita nel 2006 di Wireshark decretando poco dopo la fine del progetto Ethereal che attualmente non viene piu’ sviluppato.

Sniffer vs Network Analyzer 

Uno sniffer e’ un software che intercetta pacchetti transitanti in rete e li correla con il preciso intento di ricavarne dettagliate informazioni quali (password, dati , ed ogni sorta di credenziali…) [ dsniff, ettercap ].

Un network analyzer e’ un software che intercetta pacchetti in rete e li presenta all’operatore in una forma che possa facilitarne l’analisi (human-readable form) [ wireshark, tcpdump ].

Normal vs promiscuous 
Nel normal mode l’interfaccia di rete processa solo i pacchetti diretti a lei (modo di funzionamento standard).
In promiscuous mode l’interfaccia processa anche gli altri pacchetti (sniffa) e li passa al kernel,in pratica sniffer e network analyzer lavorano tutti in promiscuous mode.

Non e’ compito di questo articolo spiegare come adoperare Wireshark il quale, come spiegato, e’ un prodotto molto avanzato e ricco di tools; per fortuna internet e’ zeppa di documentazioni ufficiali e non che dettagliano al meglio le mille funzioni. Quello che spero e di aver destato in voi la voglia di essere piu’ curiosi possibile su cio’ che passa dal vostro PC, i mezzi per saperlo ci sono quindi siate curiosi e ricordatevi sempre che :
” il sapere e’ potere “.

Cifrare una Directory con EncFS

Cifrare il contenuto di una Directory da occhi indiscreti non e’ mai stato cosi’ facile come con EncFS.

EncFS è uno speciale filsystem in userspace che consente di cifrare tutto il contenuto di una directory senza dover ricorrere all’uso di un dispositivo apposito. Pertanto il contenuto potrà essere memorizzato direttamente in un’altra directory, senza la necessità di dover creare un filesystem su un dispositivo cifrato. I primo passo è installare il programma con tutte le sue dipendenze con:

sudo apt-get install encfs

Una volta installato il programma la creazione di una directory cifrata è molto semplice, sarà sufficiente usare lo stesso specificando come primo argomento la directory che conterrà i contenuti cifrati e come secondo argomento quella in cui compariranno i contenuti in chiaro quindi creiamo in un PATH a nostro piacere due directory assegnate al nostro utente e con  permessi 700, dopodiche’ il comando da usare sara’ molto semplice cioè qualcosa del tipo:

mkdir ~/.protetta ~/protetta
chmod 700 ~/.protetta ~/protetta
encfs ~/.protetta ~/protetta
Creazione nuovo volume cifrato.
Scegliere tra una delle seguenti opzioni:
 digitare "x" per la modalità di configurazione per esperti,
 digitare "p" per la modalità paranoica preconfigurata.
 qualsiasi altra cosa o una riga vuota selezionerà la modalità standard.

la scelta della modalità standard è sufficiente per tutti gli usi normali, per cui una volta premuto invio verrà richiesta due volte l’immissione della password di cifratura dei dati, e montato automaticamente nella directory di destinazione. I file eventualmente già presenti nella directory cifrata non verranno toccati, ma verranno creati al suo interno file e directory cifrati il cui contenuto in chiaro apparirà soltanto nella directory cifrata.

Una volta completate le operazioni, per inibire l’accesso alla directory con i contenuti in chiaro sarà sufficiente smontarla con fusemount, con un comando del tipo:

fusermount -u ~/protetta

In seguito si potrà riaccedere al contenuto in chiaro riutilizzando encfs, esattamente con lo stesso comando visto in precedenza. In questo caso però non verranno fatte le domande relative alla creazione ma verrà semplicemente richiesta la password di decifrazione.

Su encfs è possibile anche indicare un tempo di inattività, decorso il quale la directory verrà automaticamente smontata, ad esempio con:

encfs -i 5 ~/.protetta_enfs ~/protetta

Smonterà la directory dopo 5 minuti di inattività se non risultano files aperti.

Infine è possibile cambiare la password per l’accesso alla directory con:

encfsctl passwd ~/.protetta_encfs

Fail2ban – fuori i curiosi

Spesso capita, persino in ufficio, di dover proteggere la propria privacy da curiosi o male intenzionati e fail2ban ha sempre svolto egregiamente il suo compito di guardiano del castello, infatti si tratta di un programma che tiene sotto monitoraggio alcuni file di log e, quando rileva dei tentativi ripetuti & falliti (configurabili) di accedere ad un determinato servizio provvedera’ al blocco dell’host incriminato, a livello d’indirizzo IP, aggiungendolo alle regole di firewall di IPTABLES.

Bene, installiamolo ! :  /$ sudo apt-get install fail2ban

Appena installato il pacchetto saranno gia’ in esecuzione alcune regole abilitate di default come ad esempio quella per bloccare gli IP che falliscono gli accessi SSH ecc….

Fail2ban viene installato in modalita’ demone, sara’ quindi possibile gestirne lo start & stop tramite i comandi

/etc/init.d/fail2ban  start/stop      oppure       service fail2ban  start/stop

I file di configurazione si trovano in /etc/fail2ban, in particolare prestiamo attenzione al file “jail.conf” il quale contiene le configurazioni di base del pacchetto e suo relativo uso. Dal manuale viene consigliato di non modificare i file di conf originari ma di creare una copia locale tramite (es.) : /etc/fail2ban$ sudo cp jail.conf jail.local 

Andremo ora ad impostare all’interno di quest’ultimo file le regole di filtraggio per i vari servizi di nostro interesse.

Ogni regola e’ indicata dal nome della regola, scritta tra parentesi quadre, a cui fanno seguito i parametri che vogliamo impostare, seguiti da un simbolo  ” = ” e dal valore che vogliamo assegnare alla regola, facciamo un esempio lavorando su alcuni parametri di Default e sulla regola di filtraggio del servizio SSH :

[DEFAULT]
ignoreip = 127.0.0.1 192.168.xx.xx
bantime = 600
maxretry = 3
backend = polling
destemail = root@localhost
action = iptables[name=%(__name__)s, port=%(port)s]

…in questo esempio stiamo dicendo al programma di non considerare nei filtri le richieste di autenticazione errate provenienti dall’IP locale (127.0.0.1) e da un IP fidato della nostra rete (192.168.xx.xx). Il secondo parametro imposta il tempo di “ban” ossia la quantita’ di tempo (espressa in secondi) per cui vogliamo che fail2ban tenga nelle regole di Iptables

l’IP da ‘bannare’ / bloccare [600 secondi = 10 minuti], mentre il parametro ‘maxretry’ indica quanti tentativi errati di connessione lasciamo attivi prima di bannare l’IP, le ultime tre righe lavorano insieme, in pratica il polling e’ il metodo di gestione degli allarmi a cui, una volta scattato l’allarme, viene fatta mandare una mail al destinatario sotto indicato.

Passiamo adesso alla sezione del servizio SSH :

[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5

i parametri in questo caso sono presto spiegati, la prima riga dice di abilitare il controllo su questo servizio, indicando come porta da monitorare quella del servizio SSH (che come standard ascolta sulla 22) e come demone associa SSHD, indicando il percorso contenente il file di log da cui leggere per verificare i tentativi di accesso; l’ultimo parametro indica il valore del numero di accessi negati da trovare nel file di log prima che l’IP venga bloccato dalle regole di firewall Iptables.

Al termine della configurazione delle regole di nostro interesse sara’ necessario riavviare il servizio cosi’ come indicato precedentemente e magari provare ad accedere da qualche altro PC, sbagliando volontariamente la password di accesso in ssh cosi da poter sperimentare l’effettivo funzionamento dei filtri.

Per verificare il funzionamento dei filtri su di un servizio e’ anche possibile utilizzare il comando del client fail2ban:

  • sudo fail2ban-client status ssh 

dalla versione 8.8 in poi e’ anche possibile “unbannare” ossia togliere dall’esclusione degli accessi un IP precedentemente bloccato tramite il comando : sudo fail2ban-client set ssh unbanip <ip da sbloccare>