Abbiamo già visto nei precedenti post come configurare il nostro router per i protocolli PPPoA e PPPoE. Adesso vediamo quali sono le possibili tecniche per difenderlo da eventuali attacchi di bruteforce, IP spoofing o di tipo Denial of Service (DoS).
Messa in sicurezza delle connessioni Telnet
Il nostro router Cisco consente (per default) la connessione sulla porta 23 (Telnet) anche da host esterni alla nostra rete (ovvero da Internet), rendendolo soggetto ad eventuali attacchi di bruteforce.
Un modo per evitare che ciò avvenga è creare un ACL apposita che permetta la connessione al router via Telnet esclusivamente dagli host della nostra rete. Supponiamo quindi che la nostra LAN comprenda 6 indirizzi utilizzabili, ovvero 192.168.1.1 (il router), 192.168.1.2, 192.168.1.3, 192.168.1.4, 192.168.1.5, 192.168.1.6. Come avrete notato la subnet mask utilizzata è una /29 (255.255.255.248), la quale comprende in tutto 8 indirizzi di cui solo 6 possono essere assegnati agli host (il primo indirizzo indentifica la nostra rete, ovvero 192.168.1.0, mentre l’indirizzo 192.168.1.7 rappresenta il broadcast).
Detto ciò, non ci resta che definire l’ACL, digitando:
NightRouter(config)#access-list 1 permit 192.168.1.0 0.0.0.7
Tramite questo comando abbiamo creato l’ACL standard identificata dal numero 1 che permette l’accesso agli host appartenenti alla nostra LAN. Per fare ciò abbiamo dovuto specificare sia l’indirizzo di rete (192.168.1.0) che la wildmask (0.0.0.7). Quest’ultima rappresenta la parte fissa dell’indirizzo mediante degli zeri, mentre la parte variabile viene indicata attraverso il massimo valore intero rappresentabile dai bit che verranno utilizzati per formare l’indirizzo IP degli host.
Ad esempio, nel nostro caso, una /29 indica che su 32 bit (dimensione di un indirizzo IPv4) 29 costituiscono la maschera, mentre gli ultimi 3 concorrono a costituire gli indirizzi IP degli host. Sappiamo che il valore intero massimo rappresentabile mediante questi bit è pari a 7. Ergo la wildmask sarà pari a 0.0.0.7.
Discorso analogo va fatto per la classe A di indirizzi privati, ovvero la 10.0.0.0/8. In questo caso abbiamo 8 bit che costituiscono la subnet mask mentre gli altri 24 verranno utilizzati per assegnare gli indirizzi IP agli host. Dunque quale sarà la wildcard mask? Semplice: 0.255.255.255.
Per gli indirizzi di classe B privati, che vanno da 172.16.0.0/16 a 172.31.255.255/16 abbiamo la seguente wildcard: 0.15.255.255. Infine, per gli indirizzi privati di classe C, ovvero 192.168.1.0/24, 192.168.2.0/24 e così via possiamo utilizzare questa wildmask:
0.0.255.255
associata all’indirizzo 192.168.0.0, ovvero un indirizzo privato di classe C adattato a classe B, in modo tale che con una sola wildmask vengano interessate tutte le possibili reti private di classe C.
Questa spiegazione ci tornerà utilie quando andremo ad implementare le regole per difenderci dall’IP spoofing.
Tornando alla nostra ACL, è necessario che essa venga associata al servizio Telnet, che negli apparati Cisco prende il nome di vty. Per fare ciò basta digitare:
NightRouter(config)# line vty 0 4
NightRouter(config-line)# access-class 1 in
NightRouter(config-line)# exit
Come avrete facilmente intuito è il comando access-class che associa l’ACL standard 1 in ingresso al terminale Telnet.
Sicuramente a questo punto vi starete chiedendo: perchè ho definito un ACL che permette l’accesso via Telnet sul router agli host della mia LAN se poi non ho definito alcuna regola per vietare l’accesso a tutti gli altri host?
Semplice, ogni ACL nel momento in cui viene creata ha come regola implicita il deny any, quindi tutti gli altri host vengono automaticamente esclusi da ogni possibilità di accesso.
Misure contro L’IP Spoofing
Bene, il nostro terminale Telnet è finalmente al sicuro. Vediamo ora come fare per difenderci dall’IP spoofing, tecnica che prevede l’alterazione dell’IP sorgente presente all’interno dei pacchetti, in modo da aggirare i controlli effettuati dal router attraverso le ACL.
Una prima difesa contro questo attacco consiste essenzialmente nel creare un’ACL estesa in cui definire tutti gli indirizzi IP che non possono accedere al router mediante l’interfaccia connessa ad internet (Dialer0).
Passiamo quindi alla creazione dell’ACL:
NightRouter(config)# access-list 101 deny ip 10.0.0.0 0.255.255.255 any log
Mediante questo comando stiamo creando l’access list estesa (identificata dal numero 101) che nega qualsiasi pacchetto facente uso del protocollo IP proveniente dalla net 10.0.0.0/8 e diretto verso qualunque host della nostra rete.
Aggiungiamo altre regole alla nostra ACL:
NightRouter(config)# access-list 101 deny ip 172.16.0.0 0.15.255.255 any log
NightRouter(config)# access-list 101 deny ip 192.168.0.0 0.0.255.255 any log
NightRouter(config)# access-list 101 deny ip host 127.0.0.1 any log
NightRouter(config)# access-list 101 deny ip host 255.255.255.255 any log
NightRouter(config)# access-list 101 deny ip 224.0.0.0 15.255.255.255 any log
NightRouter(config)# access-list 101 permit ip any any log
Quest’ultima regola consente l’accesso a tutti gli altri host non esplicitamente negati nell’ambito delle regole precendenti.
Facciamo ora alcune piccole considerazioni:
1) Il termine “host” utilizzato nell’ambito delle regole 4 e 5 indica all’ACL che l’indirizzo da negare è soltanto uno, ovvero, rispettivamente, 127.0.0.1 (localhost) nel caso della regola numero 4 e 255.255.255.255 (broadcast) nel caso della regola numero 5. In alternativa avrei potuto usare la wildmask 0.0.0.0 immediatamente dopo l’indirizzo IP, ad esempio:
NightRouter(config)# access-list 101 deny ip 127.0.0.1 0.0.0.0 any log
NightRouter(config)# access-list 101 deny ip 255.255.255.255 0.0.0.0 any log
2) Per ciò che concerne, invece, la numerazione delle ACL, quelle standard vanno numerate da 1 a 99 e quelle estese da 101 a 199 (esistono comunque altri range utilizzabili per entrambe le tipologie di ACL).
3) Infine, è bene notare che le regole vengono applicate dal router in ordine sequenziale, ovvero dalla prima all’ultima. Quindi, se un dato pacchetto rispetta una regola, quelle immediatamente successive verranno ignorate. A tal proposito facciamo un piccolo esempio:
NightRouter(config)# access-list 101 permit ip any any
NightRouter(config)# access-list 101 deny 82.11.199.188 any any
Quest’ultima regola verrà palesemente ignorata dal router, in quanto abbiamo già permesso l’accesso indistinto a tutti i pacchetti.
PS: il termine log presente alla fine di ogni regola associata all’ACL indica al router di loggare tutti i pacchetti che sono stati scartati da essa.
Un piccolo trucco: quando definite il permit ip any any in un’ACL siate certi di aver negato tutti gli host ai quali non volete permettere l’accesso, anche perchè non è possibile (sia per le ACL standard che per quelle estese) andare a rimuovere una singola regola (se ad esempio digitiamo il comando no access-list 101 permit ip any any viene rimossa l’intera ACL).
Comunque, per sopperire a tale limitazione, le IOS più recenti hanno introdotto le ACL nominali, in cui è prevista la cancellazione di una o più regole specifiche.
Associamo tale ACL in ingresso all’interfaccia Dialer0, ovvero quella direttamente connessa ad Internet:
NightRouter(config)# int dia0
NightRouter(config-if)# ip access-group 101 in
Difesa contro gli attacchi di tipo DoS (Smurfing)
Bene, ora non ci resta che difendere il nostro router dagli attacchi di tipo DoS. Per prima cosa occorre prendere delle contromisure contro lo smurfing. Tale tecnica coinvolge almeno tre tipi di attori: l’host dell’attaccante (A), uno o più host della nostra LAN (B) e l’host vittima (C). Nella fattispecie, l’host dell’attaccante, ovvero A, invia delle richieste di broadcast ad uno o più host della nostra LAN (B), contenenti come indirizzo IP sorgente quello dell’host vittima (C). Tali richieste di livello 3 (255.255.255.255) vengono convertite in richieste di livello 2 (FF:FF:FF:FF:FF:FF) (solitamente dal router) in modo tale che tutti gli host della LAN possano rispondere, generando un elevato ammontare di traffico. A questo punto, tutte le risposte così generate verranno inoltrate sotto forma di pacchetti ICMP verso l’host vittima, congestionandolo di conseguenza.
Per fare in modo che gli host della nostra LAN non vengano utilizzati come testa di ponte per attacchi di questo tipo basta lanciare il comando:
NightRouter(config)# int e0
NightRouter(config-if)# no ip directed-broadcast
Così facendo, le richieste di broadcast (di livello 3) contenenti indirizzo sorgente fasullo, inoltrate da un attacker mediante l’interfaccia del router connessa ad internet (Dialer0) oppure attraverso un’interfaccia di rete interna (E0), non verranno tradotte in richieste di broadcast di livello 2 e non subiranno quindi il processo di amplificazione che sta alla base del successo di questo tipo di attacco.
NB: nei router che utilizzano IOS maggiori o uguali alla 12.0 tale comando è abilitato per default. Per indentificare la versione di IOS installata sul vostro router basta digitare:
NightRouter# sh ver
Difesa contro gli attacchi di tipo DoS (diretti verso i servizi di diagnostica)
Un altro tipo di attacco, di tipo DoS, a cui sono soggetti i router Cisco, consiste nell’invio di un grande numero di pacchetti spuri UDP e TCP verso le porte echo, chargen, discard e daytime (quest’ultima si basa esclusivamente sul protocollo TCP). Tali porte vengono adoperate per operazioni di diagnostica sul router ed un attacco di questo tipo potrebbe causare la congestione della CPU, fino a portare allo stallo del dispositivo.
Per prevenire questa tipologia di attacco basta disabilitare i servizi di diagnostica sopra citati, attraverso i comandi:
NightRouter(config)# no service udp-small-servers
NightRouter(config)# no service tcp-small-servers
Difesa contro gli attacchi di tipo DoS (Land)
Un attacco di tipo “land” permette di inoltrare pacchetti TCP SYN (tipici dell’inizio di una connessione) con indirizzo IP sorgente e porta modificati e posti uguali all’indirizzo ed alla porta dell’host di destinazione, causando in alcuni casi anche il blocco del router.
Il problema è stato risolto nelle versioni più recenti di IOS, ma negli altri casi è necessario applicare un filtro che blocchi per ogni interfaccia la ricezione di questi pacchetti. Vediamo come fare (utilizzando delle ACL estese):
NightRouter(config)# access-list 102 deny ip <indirizzo della scheda ethernet0> 0.0.0.0 <indirizzo della scheda ethernet0> 0.0.0.0
Associamo dunque tale ACL all’intercaccia ethernet0:
NightRouter(config)# int e0
NightRouter(config-if)# ip access-group 102 in
Come avrete notato, non ho associato tale ACL anche all’interfaccia Dialer0, in quanto la maggior parte di noi utilizza IP dinamici che ci vengono assegnati direttamente dall’ISP. Nel caso in cui, però, usufruite di IP statico basta digitare:
NightRouter(config)# access-list 102 deny ip <indirizzo della scheda Dialer0> 0.0.0.0 <indirizzo della scheda Dialer0> 0.0.0.0
NightRouter(config)# int dia0
NightRouter(config-if)# ip access-group 102 in
Cifratura delle password
L’ultima parte di questa guida riguarda la cifratura delle password, in modo che uno sh run non permetta di visualizzarle in chiaro.
Per abilitare la cifratura occorre digitare:
NightRouter(config)# service password-encryption
Bene, ora il nostro router dovrebbe essere al sicuro contro gli attacchi più comuni. A presto.