04. [15p] SNMP server pe Linux

În exercițiul 03. [15p] Configurare server SNMP pe echipamente CISCO am configurat serverul de SNMP pe rutere CISCO. După cum am precizat anterior SNMP este implementat în general pe toate echipamentele, inclusiv pe sistemele Linux.

Pe statia gateway, vom instala pachetul snmpd care conține serverul de SNMP:

root@gateway:~# apt-get install snmpd

În mod implicit acesta ascultă doar pe localhost. Trebuie să modificăm linia agentAddress udp:127.0.0.1:161 în agentAddress udp:161 (pe orice intefață) din fișierul de configurare al snmpd (/etc/snmp/snmpd.conf) și să resetăm daemonul (/etc/init.d/snmpd restart).

Dorim să realizăm o interogare de pe stația monitor către stația gateway prin care să listăm toate interfețele:

root@monitor:~# snmpwalk -v2c -c public 192.168.1.3 IF-MIB::ifName
IF-MIB::ifName = No more variables left in this MIB View (It is past the end of the MIB tree)

Acest comportament e cauzat tot de o configurație a daemonului snmpd. În fișierul de configurare pe linia în care se specifică comunitatea (parola) rocommunity public default -V systemonly se observă opțiunea -V systemonly care limitează proprietățile expuse doar la cele legate de starea sistemului (exemplu: uptime-ul), systemonly fiind un subset de OID-uri definit mai sus în fișier.

Eliminăm acea opțiune, resetăm serviciul snmpd și refacem interogarea:

root@gateway:~# cat /etc/snmp/snmpd.conf |grep rocomm
# rocommunity public  default    -V systemonly
rocommunity public  default
root@gateway:~# /etc/init.d/snmpd restart
[....] Restarting network management services::  snmpd
 
root@monitor:~# snmpwalk -v2c -c public 192.168.1.3 IF-MIB::ifName
IF-MIB::ifName.1 = STRING: lo
IF-MIB::ifName.2 = STRING: eth0
IF-MIB::ifName.3 = STRING: eth1

Cuvântul cheie default din linia ce configurează comunitatea public permite oricărei adresă IP să facă interogarea. Dacă dorim securizarea interogării la o clasă de adrese IP (192.168.1.0/24 în cazul nostru) putem înlocui default cu clasa respectivă (192.168.1.0/24):

root@gateway:~# cat /etc/snmp/snmpd.conf|grep 192.
 rocommunity public  192.168.1.0/24
root@gateway:~# /etc/init.d/snmpd restart
[....] Restarting network management services::  snmpd
 
root@monitor:~# snmpwalk -v2c -c public 192.168.1.3 IF-MIB::ifName
IF-MIB::ifName.1 = STRING: lo
IF-MIB::ifName.2 = STRING: eth0
IF-MIB::ifName.3 = STRING: eth1
 
root@gateway:~# snmpwalk -v2c -c public 192.168.0.3
Timeout: No Response from 192.168.0.3
root@gateway:~# tail -1 /var/log/syslog
Mar  9 19:11:51 gateway snmpd[4984]: Connection from UDP: [192.168.0.3]:55453->[192.168.0.3]:161

Se observă că la interogarea folosind adresa IP sursă 192.168.0.3, serverul nu mai răspunde (automat se folosește adresa IP sursă 192.168.0.3 când facem interogarea de pe aceeași mașină către aceeași adresă IP).

SNMP este un protocol extensibil putând adăuga noi proprietăți care să fie exportate serverelor de management/monitorizare. Putem crea script-uri custom care să preia valori din sistem și să le expună prin SNMP.

Creați un script pe stația gateway care întoarce numărul de intrări din passwd:

root@gateway:~# cat /tmp/getUserNo
#!/bin/bash
 
echo Numarul de utilizatori din sistem este: $(getent passwd | wc -l)
 
root@gateway:~# chmod +x /tmp/getUserNo
root@gateway:~# /tmp/getUserNo
Numarul de utilizatori din sistem este: 26

Dorim să exportăm rezultatul acestui script prin SNMP pentru ca stația monitor să poată să îl preia. În fișierul /etc/snmp/snmpd.conf avem la dispoziție comanda extend (/extend). Vom adăuga o nouă intrare de tipul extend-sh:

root@gateway:~# cat /etc/snmp/snmpd.conf |grep getUser
 extend-sh    userNo   /tmp/getUserNo
root@gateway:~# /etc/init.d/snmpd restart
[....] Restarting network management services::  snmpd

Conform comentariilor din snmpd.conf ieșirea scriptului este exportată prin proprietatea NET-SNMP-EXTEND-MIB::nsExtendOutput1Table:

root@monitor:~# snmpwalk -v2c -c public 192.168.1.3 NET-SNMP-EXTEND-MIB::nsExtendOutput1Table|grep userNo
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."userNo" = STRING: Numarul de utilizatori din sistem este: 26
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."userNo" = STRING: Numarul de utilizatori din sistem este: 26
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."userNo" = INTEGER: 1
NET-SNMP-EXTEND-MIB::nsExtendResult."userNo" = INTEGER: 0

După cum se vede scriptul este executat, iar output-ul acestuia este trimis prin SNMP. Adăugați un nou user pe stația gateway și executați interogarea de mai sus. Observați modificarea valorii la 27.