Ad un nostro cliente è saltato il vecchio firewall. Si trattava di un Watchguard FBXIII 500. Una roba di 10 anni fa. Ha sempre funzionato bene ma si vede che è arrivata la sua ora. Una volta il cliente aveva una bella rete. Vpn tra Milano, Roma e pure China, diversi server e diversi accessi. Ora invece, complice la crisi, ha giusto l'exchange in casa e qualche accesso SSL. Di conseguenza la configurazione, una volta più tosto complessa, ora è abbastanza "standard".

Dalla nostra gli sono stati proposti alcuni apparati sostitutivi. In particolare tre: un Watchguard, uno Zywall e un Asa. Sarà il mercato, ma è andato finire che l'asa se l'ha comprato da solo e a noi ci ha chiesto solo la configurazione.

A me va bene. Purtroppo non ho il piacere di avere molto materiale Cisco sotto le mani, e la cosa mi dispiace un sacco. Ma visto che "...è un azienda in decadenza..." (ndr è una delle battute più idiote e allo stesso tempo memorabili del mio capo) .... Ahhhhh.

Prendo l'appuntamento con il cliente il venerdi scorso. Sballiamo la cosa e cominciamo a creare la configurazione. Io sono assolutamente negato con ASDM. Anche Firewall Builder mi sta particolarmente sulle palle. Di conseguenza normalmente le configurazioni le faccio dalla CLI.

La cosa più figa che configuro le prime cose e provo se vanno senza successo. Con senno di poi avevo sbagliato tutta la parte del nat, ma li in casa del cliente il cervello mi è andato in tilt. Alla fine mi sono portato via il "coso" e me lo sono configurato line-by-line, scrivendo tanto di commenti. Serve a me e serve ai miei colleghi.

Ecco cose ne è venuto fuori, con la dovuta precisazione che NON è la configurazione finale e che le classi e gli indirizzi ip sono quelli del laboratorio.

Lo schema della rete è banale. Tre interfacce:

  • WAN : 192.168.1.36/24
  • LAN : 172.16.9.100/24
  • DMZ : 172.16.10.1/24

Gateway sulla WAN: 192.168.1.254. Sulla DMZ ho un server Exchange, mentre sulla lan il server di dominio. Sono stato molto pigro e non ho mai fatto la modifica del RPC. Di conseguenza il traffico tra la lan e dmz è permesso any-any. Visto che stiamo mettendo le mani nella rete e c'è un po' di spazio per poterlo fare sarà la prossima cosa che verrà fatta.

Ecco la mia esperienza da laboratorio:

Si parte con un bel erase della configurazione. Quindi:

write erase

reboot con reload e siamo pronti a cominciare.

Verifico le versioni del asa e del asdm (?!?). Come già scritto io non lo so proprio usare, anzi. Per questa esperienza me lo sono tenuto aperto e facevo di volta in volta "refresh" per capire proprio come si usa. Decisamente non male ma continuo a preferire la CLI. Asdm lo lascio cosi do al cliente un sistema di monitoraggio in real-time. Comunque:

dir disk:0/

un bel sh ver infine fa sempre bene...

Fatto l'aggiornamento via tftp:

copy tftp: disk0:

Poi setto le immagini di boot per quella per asdm:

boot system disk0:/asa804-k8.bin
asdm image disk0:/asdm-602.bin

Nel momento in cui scrivo mi sto scaricando dal Cisco CCO le nuove versioni. Tempo di leggere le release notes e faccio aggiornamento di nuovo. Comunque andando avanti configuro alcuni parametri di base e dei utenti:

hostname fwLaborTty
domain-name lttsite.local
username service password xxxxxxxxxx priv 2
username rafal password xxxxxxxxxx priv 15
enable password xxxxxxxxxx
logging consol error
logging enable

quindi passo alla configurazione delle interfaccie

interface Ethernet0/0
nameif outside
security-level 0
ip address 192.168.1.36 255.255.255.0

interface Ethernet0/1
nameif inside
security-level 100
ip address 172.16.9.100 255.255.255.0

interface Ethernet0/2
nameif dmz
security-level 100
ip address 172.16.10.1 255.255.255.
0

Ora tocca al asdm:

http server enable
http 172.16.9.194 255.255.255.255 inside

Funziona anche da Safari, meno male. Avvio asdm per monitorare le modifiche fatte. Procedo quindi con SSH.

crypto key generate RSA

ssh 172.16.9.194 255.255.255.255 inside
ssh XX.XX.XX.XX 255.255.255.248 outside
ssh XX.XX.XX.XX  255.255.255.248 outside
ssh XX.XX.XX.XX  255.255.255.248 outside
ssh timeout 10
ssh version 2

Mi sembra ovvio che il mio mac sta sulla inside ed ha ip 172.16.9.194. Solo perche voglio fare dei test modifico il comportamento del icmp:

icmp unreachable rate-limit 1 burst-size 1
icmp permit any inside
icmp permit any dmz

Adesso tocca al NAT. Il mio scopo è quello di riprodurre il maniera fedele la configurazione precedente. Faccio quindi un nat dinamico sulla interfaccia outside per uscire sia per la LAN che per la DMZ. Occorre in anzi tutto un global per outside:

global (outside) 1 interface

quindi le acl per la configurazione del nat:

access-list outgoing_nat_lan extended permit ip 172.16.9.0 255.255.255.0 any
access-list outgoing_nat_dmz extended permit ip 172.16.10.0 255.255.255.0 any

Mi assicuro che nat-control è abilitato quindi creo le due regole:

nat (inside) 1 access-list outgoing_nat_lan
nat (dmz) 1 access-list outgoing_nat_dmz

Visto che, almeno in questo caso e per ora, voglio permettere tutto il traffico tra la LAN e DMZ, e le stesse interfacce sono nello stesso security-level aggiungo:

same-security-traffic permit inter-interface

Mi serve quindi la regola di esclusione del nat tra queste due reti:

access-list no_nat_lan_dmz extended permit ip 172.16.9.0 255.255.255.0 172.16.10.0 255.255.255.0
access-list no_nat_dmz_lan extended permit ip 172.16.10.0 255.255.255.0 172.16.9.0 255.255.255.0
nat (inside) 0 access-list no_nat_lan_dmz
nat (dmz) 0 access-list no_nat_dmz_lan

Faccio le dovute prove e funziona tutto. Bene. Ora so perche dal cliente non ha funzionato (ma 0 nat non me lo ricordo proprio mai!!!). E' ora di filtrare il traffico. Le access rules rispecchiano in toto la configurazione che il cliente aveva prima, nella configurazione finale ho sistemato meglio le inspection e fatto qualche variazione di qua e la. Prima di creare le regole creo un po' di oggetti che mi serviranno per comporle:

object-group protocol tcp-udp
protocol-object udp
protocol-object tcp

che non manca mai....

object-group network fastmediaNET
network-object XX.XX.XX.XX 255.255.255.248
network-object XX.XX.XX.XX  255.255.255.248
network-object 8XX.XX.XX.XX  255.255.255.248

object-group network genesys
network-object host XX.XX.XX.XX
network-object host XX.XX.XX.XX

object-group network LanNetwork
network-object 172.16.9.0 255.255.255.0

object-group network DmzNetwork
network-object 172.16.10.0 255.255.255.0

object-group service RDP tcp
port-object eq 3389

object-group network perTCPUDP7000
network-object host XX.XX.XX.XX


Quindi creo prima le acl per la dmz:

access-list dmz_access_in extended permit object-group tcp-udp object-group DmzNetwork any eq domain
access-list dmz_access_in extended permit tcp object-group DmzNetwork any eq www
access-list dmz_access_in extended permit tcp object-group DmzNetwork any eq https
access-list dmz_access_in extended permit tcp object-group DmzNetwork any eq ftp
access-list dmz_access_in extended permit tcp object-group DmzNetwork any eq smtp
access-list dmz_access_in extended permit ip object-group DmzNetwork object-group LanNetwork

quindi le applico alla interfaccia:

access-group dmz_access_in in interface dmz

Faccio lo stesso con la lan:

access-list lan_access_in extended permit object-group tcp-udp object-group LanNetwork any eq domain
access-list lan_access_in extended permit tcp object-group LanNetwork any eq www
access-list lan_access_in extended permit tcp object-group LanNetwork any eq https
access-list lan_access_in extended permit tcp object-group LanNetwork any eq ftp
access-list lan_access_in extended permit tcp object-group LanNetwork any eq smtp
access-list lan_access_in extended permit tcp object-group LanNetwork any eq 32300
access-list lan_access_in extended permit object-group tcp-udp object-group LanNetwork object-group perTCPUDP7000 eq 7000
access-list lan_access_in extended permit tcp object-group LanNetwork any eq pop3
access-list lan_access_in extended permit tcp object-group LanNetwork any eq imap4
access-list lan_access_in extended permit ip object-group LanNetwork object-group DmzNetwork


access-group lan_access_in in interface inside

Creo i nat in ingresso, che poi in realtà sono dei port forward. Il vecchio firewall gestisce infatti il nat direttamente sulla policy e anche se ho 10 ip pubblici da utilizzare non posso modificare ne ip con cui "esce" il cliente ne ip per servizi che sono legati al DNS:

static (dmz,outside) tcp interface smtp mail-srv smtp netmask 255.255.255.255
static (dmz,outside) tcp interface ftp mail-srv ftp netmask 255.255.255.255
static (dmz,outside) tcp interface www mail-srv www netmask 255.255.255.255
static (dmz,outside) tcp interface https mail-srv https netmask 255.255.255.255
static (dmz,outside) tcp interface 3389 mail-srv 3389 netmask 255.255.255.255
static (inside,outside) tcp interface ldap dom-srv ldap netmask 255.255.255.255

A questo punto mi faccio la configurazione delle ACL per l'accesso sulla outside:

access-list wan_access_in extended permit tcp any interface outside eq smtp
access-list wan_access_in extended permit tcp any interface outside eq www
access-list wan_access_in extended permit tcp any interface outside eq https
access-list wan_access_in extended permit tcp any interface outside eq ftp
access-list wan_access_in extended permit tcp object-group fastmediaNET interface outside object-group RDP
access-list wan_access_in extended permit tcp object-group genesys interface outside object-group RDP
access-list wan_access_in extended permit tcp object-group FastmediaAntispam interface outside eq ldap

infine

access-group wan_access_in in interface outside

Poi c'è da fare qualche limatura (log, mettere in sicurezza l'accesso sull'apparato, ecc) , ma in linea di massima funziona tutto. Come già scritto in precedenza ho applicato delle class map anti IM e P2P. Ho limato ulteriormente la configurazione e messo meglio in sicurezza il tutto con AAA.

Ho perso un pomeriggio dietro ad una "cazzata". Abituato poi ai Watchguard non solo non mi ricordo i comandi ma inizialmente mi è sfuggita completamente di mente anche la logica con la quale si programmano gli ASA. Questo post mi deve servire come promemoria e un po' come monito...