SNMP a monitoring sítě

Adam Ivora, xivora@fi.muni.cz

Obsah

Protokol SNMP

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.

Agenti a NMS

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é.

Strom MIB-2, OIDs a jejich překlad na jméno

Strom MIB-2 (Management Information Base)

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):

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
...

Autentizace v SNMP

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é.

Komunity (SNMPv1, SNMPv2c)

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í.

Uživatelé (SNMPv3)

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.

Metody SNMP

Ú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

Konfigurace SNMP démona

Běžně používaný SNMP démon je net-snmp.

Instalace (Arch)

pacman -S net-snmp
systemctl enable snmpd

Samotná konfigurace SNMP démona se dá provést dvěma způsoby:

  1. Nástrojem snmpconf:
  2. 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
    
  3. Pomocí konfiguračních souborů:
  4. 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é.

    1. SNMPv1, SNMPv2c
    2. 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
      ...
      
    3. SNMPv3
    4. 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.

      Možný obsah souboru /var/net-snmp/snmpd.conf:
      createUser my_readonly_user SHA password1 AES password2
      

Generování grafů na základě SNMP veličin

Běžně používaný software na generování tohoto typu grafů je mrtg (Multi Route Traffic Grapher).

Instalace (Arch)

Třeba nainstalovat balíčky mrtgAUR, 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.

Sledování chybovosti sítě pomocí SmokePing

Instalace (Arch)

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

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.

Instalace (Arch)

Nainstalovat balíčky nagiosAUR, 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.

Další nástroje

Literatura