Simple Network Management Protocol (SNMP) je jedním z protokolů aplikační vrstvy ISO/OSI modelu. Slouží převážně k monitorování a správě sítě. SNMP pro komunikaci využívá protokol UDP na portech 161 (přijímání a odesílání zpráv) a 162 (přijímání trap). Při zabezpečeném spojení (pouze SNMPv3) se používají porty 10161 a 10162.
Zprávy mohou zasílat obě strany:
Agent posílá trap, pokud se zařízení stane něco, na co by se mělo upozornit. Trap je asynchronní a jednostranné spojení.
NMS může agentům zasílat dotazy, pomocí kterých zjišťuje jejich stav, popřípadě může zařízení pomocí dotazů spravovat. Na dotaz od NMS agenti odpovídají, spojení je oboustranné.
Je to hierarchická datová struktura, ve které je každý objekt adresován pomocí svého identifikátoru (OID, Object Identifier).
Struktura samotného objektu je definovaná pomocí ASN.1 (Abstract Syntax Notation One), vypsat strukturu objektu jde například pomocí snmptranslate -Td
(viz níže).
Standard MIB-2: RFC 1213
Struktura stromu MIB, jehož podstromem je MIB-2 (OID 1.3.6.1.2.1):
ccitt(0)
iso(1) → org(3) → dod(6) → internet(1)
directory(1)
mgmt(2) → mib-2(1)
system(1)
interfaces(2)
ifNumber(1)
ifTable(2)
at(3)
ip(4)
icmp(5)
tcp(6)
udp(7)
egp(8)
transmission(10)
snmp(11)
experimental(3)
private(4) → enterprise(1)
cisco(9)
microsoft(311)
security(5)
snmpV2(6)
joint(2)
Překlad jmen na OID a obráceně je vyhledávání v tomto stromě. Užitečný nástroj na překlad je smtptranslate
(návod):
[root@proto08 ~]# snmptranslate -On -IR ifNumber
.1.3.6.1.2.1.2.1
[root@proto08 ~]# snmptranslate -Td 1.3.6.1.2.1.1.6
SNMPv2-MIB::sysLocation
sysLocation OBJECT-TYPE
-- FROM SNMPv2-MIB
-- TEXTUAL CONVENTION DisplayString
SYNTAX OCTET STRING (0..255)
DISPLAY-HINT "255a"
MAX-ACCESS read-write
STATUS current
DESCRIPTION "The physical location of this node (e.g., 'telephone
closet, 3rd floor'). If the location is unknown, the
value is the zero-length string."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) 6 }
Nástroj na procházení MIB-2 stromem SMTP agenta se nazývá snmpwalk
(návod):
[root@proto08 ~]# snmpwalk -v 1 -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux proto08 5.9.1-pv090 #35 PREEMPT Wed Oct 28 00:59:05 CET 2020 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (35746) 0:05:57.46
SNMPv2-MIB::sysContact.0 = STRING: root@localhost
SNMPv2-MIB::sysName.0 = STRING: proto08
SNMPv2-MIB::sysLocation.0 = STRING: Unknown
...
IF-MIB::ifNumber.0 = INTEGER: 5
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifIndex.5 = INTEGER: 5
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: Red Hat, Inc. Device 0001
IF-MIB::ifDescr.3 = STRING: virbr80
IF-MIB::ifDescr.4 = STRING: virbr80-nic
IF-MIB::ifDescr.5 = STRING: vnet0
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)
IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.3 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.4 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.5 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifMtu.1 = INTEGER: 65536
IF-MIB::ifMtu.2 = INTEGER: 1500
IF-MIB::ifMtu.3 = INTEGER: 1500
IF-MIB::ifMtu.4 = INTEGER: 1500
IF-MIB::ifMtu.5 = INTEGER: 1500
...
Před verzí SNMPv3 se autentizuje pouze pomocí jména komunity - kdo zná jméno komunity, ten má plný přístup k údajům komunitě poskytnuté. Navíc, SNMPv1 ani SNMPv2 nepodporují šifrování, tedy názvy komunit se posílají nešifrované, což může být problematické.
Název komunity je heslo, které se navíc posílá nezašifrovaným spojením. Měl by být dostatečně dlouhý a náhodný. V případě, že útočník získá read/write název komunity, může ovládat veškerá síťová zařízení.
SNMPv3 podporuje autentizaci pomocí HMAC (MD5, SHA, SHA-256) a zároveň šifrování (DES, AES-128, AES-192, AES-256).
Ani jedno nemusí být vyžadováno, existují 3 bezpečnostní úrovně připojení:
Mimo to, SNMPv3 podporuje tunelování přes TLS (TCP) i DTLS (UDP), které zajišťuje šifrování spojení nezávislé na šifrovacím mechanismu SNMPv3.
Údaje v tabulce převzaté z Net-SNMP Wiki.
Název metody | CLI nástroj | SNMP verze | Popis |
---|---|---|---|
GET | snmpget | v1, v2c, v3 | získá seznam přesně zadaných objektů |
GETNEXT | snmpgetnext, snmpwalk | v1, v2c, v3 | získá další objekt v MIB stromě (inorder řazení) |
GETBULK | snmpgetbulk | v2c, v3 | podobné GETNEXT, pouze se vrací více následujících objektů najednou |
SET | snmpset | v1, v2c, v3 | pošle konfiguraci nebo příkaz SNMP agentovi |
TRAP | snmptrap | v1, v2c, v3 | jednosměrná asynchronní zpráva od agenta směrem k NMS |
INFORM | snmpinform | v2c, v3 | skoro jako TRAP, jen se očekává odpověď druhé strany |
RESPONSE | - | v1, v2c, v3 | odpověď na všechny ostatní typy zpráv (kromě TRAP, REPORT, RESPONSE) |
REPORT | - | v3 | interní zpráva protokolu, většinou komunikační chyba |
Běžně používaný SNMP démon je net-snmp
.
pacman -S net-snmp
systemctl enable snmpd
Samotná konfigurace SNMP démona se dá provést dvěma způsoby:
snmpconf
:snmpconf
je wrapper, který pomáhá s vytvářením konfiguračních souborů. Ukázka vytvoření SNMPv3 uživatele s read-write p
[root@proto08 ~]# snmpconf
The configuration information which can be put into snmpd.conf is divided
into sections. Select a configuration section for snmpd.conf
that you wish to create:
1: Access Control Setup
2: Extending the Agent
3: Monitor Various Aspects of the Running Host
4: Agent Operating Mode
5: System Information Setup
6: Trap Destinations
Other options: finished
Select section: 1
Section: Access Control Setup
Description:
This section defines who is allowed to talk to your running
snmp agent.
Select from:
1: a SNMPv3 read-write user
2: a SNMPv3 read-only user
3: a SNMPv1/SNMPv2c read-only access community name
4: a SNMPv1/SNMPv2c read-write access community name
Other options: finished, list
Select section: 3
Configuring: rocommunity
Description:
a SNMPv1/SNMPv2c read-only access community name
arguments: community [default|hostname|network/bits] [oid]
The community name to add read-only access for: read_only_community
The hostname or network address to accept this community name from [RETURN for all]: 10.0.0.0/24
The OID that this community should be restricted to [RETURN for no-restriction]: system
Finished Output: rocommunity my_readonly_community 10.0.0.0/24 system
Hlavní konfigurační soubor démona net-snmp
je /etc/snmp/snmpd.conf
. Pro SNMPv1, SNMPv2c se používají komunity; pro SNMPv3 se používají uživatelé.
Ukázka možného obsahu souboru /etc/snmp/snmpd.conf
(inspirován dokumentací):
# listen on all available addresses on port 161
agentAddress udp:161
# the basic way to define communities, with less flexibility - communities have access to the subtree defined by oid
# community source oid
rocommunity my_readonly_community
rocommunity system_from_localhost localhost system
rwcommunity private
# the more complex way to define communities - VACM (View Access Control Model)
# sec.name source community
com2sec my_sec_name localhost my_community
com2sec my_sec_name 10.0.0.0/24 my_community
# sec.model sec.name
group my_group any my_sec_name
# incl/excl subtree mask
view my_view excluded .1 ff
view my_view included sysUpTime.0 ff
view my_view included ifNumber ff
# context sec.model sec.level match read write notif
access my_group "" any noauth exact my_view none none
Pak průchod stromem může vypadat následovně:
[root@proto08 ~]# snmpwalk -v 1 -c my_community localhost
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (217) 0:00:02.17
IF-MIB::ifNumber.0 = INTEGER: 5
End of MIB
[root@proto08 ~]# snmpwalk -v 1 -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux proto08 5.9.1-pv090 #35 PREEMPT Wed Oct 28 00:59:05 CET 2020 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12784) 0:02:07.84
SNMPv2-MIB::sysContact.0 = STRING: root@localhost
SNMPv2-MIB::sysName.0 = STRING: proto08
SNMPv2-MIB::sysLocation.0 = STRING: Unknown
...
Ukázka možného obsahu souboru /etc/snmp/snmpd.conf
:
# the basic way - for VACM please visit the Wiki
# username sec.level oid
rouser my_readonly_user noauth system
rwuser my_readwrite_user priv
Pro SNMPv3 je třeba navíc vytvořit soubor /var/net-snmp/snmpd.conf
, do kterého se vloží hesla uživatelů (v plaintextu). Při spuštění démona snmpd
soubor démon přečte, uloží si obě hesla a soubor smaže.
/var/net-snmp/snmpd.conf
:
createUser my_readonly_user SHA password1 AES password2
Běžně používaný software na generování tohoto typu grafů je mrtg
(Multi Route Traffic Grapher).
Třeba nainstalovat balíčky mrtg
AUR, perl-net-snmp
.
MRTG funguje jako démon, který monitoruje SNMP data podle své konfigurace a z dat generuje statické HTML stránky a PNG grafy, které se pak mohou publikovat na kterémkoliv webovém serveru.
pacman -S smokeping
Je třeba mít nakonfigurovaný webserver s podporou CGI.
Smokeping je software, který umožňuje sledovat vybraný seznam serverů, ukládá data pomocí RRDtoolu a generuje z uložených dat grafy, které se zobrazují na webserveru.
Software pro monitorování síťových služeb monitoruje specifikované stroje a upozorňuje na události, které jsou zajímavé (chyby). Zástupce tohoto typu softwaru je například Nagios.
Nainstalovat balíčky nagios
AUR, monitoring-plugins
.
Je třeba mít nakonfigurovaný webserver, na kterém běží PHP a CGI.
Nagios dokáže sledovat většinu standardních internetových služeb (SMTP, POP3, HTTP, SSH, PING, ...). Je rozšiřitelný přes pluginy.
Arpwatch sleduje v lokální síti dvojice (MAC adresa, IP adresa). Ukládá data do log souboru a v případě mimořádné aktivity (nová dvojice adres, nová MAC adresa, flip flop, změna MAC adresy) upozorní administrátora e-mailem.
Neighbor Discovery Protocol Monitor monitoruje IPv6 Neighbor Discovery Protocol (ICMPv6 pakety) a také e-mailem upozorní administrátora v případě mimořádné aktivity.