Durante gli ultimi mesi ho discusso ampiamente della configurazione di Nagios per la ricezione dei check passivi, quali trap SNMP o security alert. Adesso vi mostrerò come integrare le predette tipologie di allarmi in modo da riuscire a monitorare le ACL del nostro router Cisco.
Premessa
Esiste un modo più veloce per ottenere il monitoraggio delle ACL rispetto a quello che sto per illustrare. Esso consiste, fondamentalmente, nella configurazione di un syslog server (dotato dell’applicativo swatch per l’analisi in tempo reale dei file di log) a cui il nostro router Cisco dovrà puntare. Nel caso in cui un determinato pattern (ad esempio / denied /) dovesse essere matchato da swatch, quest’ultimo genererà un’opportuna notifica email da inoltrare all’amministratore di rete.
La mia configurazione, invece, si basa sulla logica seguente: il router Cisco genererà delle opportune trap SNMP segnalando ciò che avviene a livello di ACL (traffico consentito oppure negato). Esse verranno intercettate da snmptrapd e tradotte da snmptt, per poi essere elaborate dall’event handler submit_check_result e date in pasto a Nagios. Ho optato per tale configurazione poichè sulla mia linux box che funge da syslog server e da NMS sono già attivi sia snmptrapd che snmptt e quindi ho ritenuto conveniente sfruttarli piuttosto che mettere in funzione swatch.
Configurazione del router Cisco
La configurazione del router Cisco si basa in 3 passaggi: settaggio della direttiva log per ciascuna entry che andrà a formare l’ACL da monitorare, settaggio del syslog server a cui inviare le trap ed abilitazione di queste ultime.
Ad esempio, l’ACL di nostro interesse dovrà essere formata da entry di questo tipo:
access-list 102 deny ip host 255.255.255.255 any log
Inoltre, per definire la community string RO (read only) e l’indirizzo IP del server che si occuperà della ricezione delle trap, occorrerà digitare le seguenti direttive:
snmp-server host 192.168.1.1 keypublic snmp-server community keypublic RO
mentre le trap potranno essere abilitate nel modo seguente:
snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart snmp-server enable traps tty snmp-server enable traps config-copy snmp-server enable traps config snmp-server enable traps resource-policy snmp-server enable traps cpu threshold snmp-server enable traps syslog snmp-server enable traps firewall serverstatus
Contenuto dello scrip submit_check_result
Secondo quanto già riportato in questo post, sappiamo che snmptt effettua una traduzione “statica” delle trap (mediante il comando snmpttconvertmib). Per tale motivo, affinchè si possa indurre Nagios a generare dei security alert solo dopo la ricezione di trap ben determinate, occorre modificare il codice sorgente relativo all’event handler submit_check_result. Di seguito riporto il contenuto dello scrip in questione da me customizzato:
echocmd="/bin/echo" CommandFile="/var/spool/nagios/cmd/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # create the command line to add to the command file if [[ $1 == "ip router" ]];then if [[ $4 =~ "denied igmp" ]];then exit 0; elif [[ $4 =~ "denied" ]];then service="Router ACL Connection Denied"; output="$4 | connection_denied=1" cmdline="[$datetime] PROCESS_SERVICE_CHECK_RESULT;router;$service;$3;$output"; else cmdline="[$datetime] PROCESS_SERVICE_CHECK_RESULT;router;$2;$3;$4"; fi else cmdline="[$datetime] PROCESS_SERVICE_CHECK_RESULT;$1;$2;$3;$4"; fi # append the command to the end of the command file `$echocmd $cmdline >> $CommandFile`
Nella fattispecie, vengono dapprima identificate le trap che riguardano il router. Successivamente, nel caso in cui esse contengano il pattern igmp denied, lo scrip uscirà senza effettuare alcuna operazione. Tale “scrematura” è stata necessaria poichè il mio ISP effettua regolarmente del polling IGMP mediante il proprio querier 192.168.100.1 (per il servizio IPTV).
Nel caso in cui, invece, le trap dovessero contenere la stringa denied, la variabile cmdline verrà popolata con l’host name dell’oggetto monitorato da Nagios (per il quale si dovrà aggiornare lo stato del servizio che si occupa di tenere d’occhio le ACL). Nel mio caso tale host name è semplicemente router. Inoltre, l’output verrà rimaneggiato in modo da tenere traccia delle performance data (graficizzandole mediante l’uso di pnp4nagios).
MIB da utilizzare e configurazione di Nagios
Per prima cosa occorre scaricare le MIB CISCO-SYSLOG-MIB e CISCO-SYSLOG-MIB-V1SMI dal repository FTP della Cisco, effettuandone il parsing mediante snmpttconvertmib.
Successivamente, su Nagios occorrerà definire per l’host name router il servizio che si occuperà di monitorare le ACL:
define service{ use local-service host_name router service_descripion Router ACL Connection Denied check_command check_passive passive_checks_enabled 1 active_checks_enabled 0 max_check_attempts 1 is_volatile 1 check_freshness 1 freshness_threshold 600 flap_detection_enabled 0 }
Come ultimo step, a configurazione ultimata possiamo riavviare Nagios per rendere effettive le suddette modifiche:
[root@NMS ~]# service nagios reload
ed abbiamo finito.
A presto.