Datensammlung mit SNMP

Mit den Visionen des Internet of Things können Kühlschränke eigenständig drohende Fehlstände erkennen und dem abhelfen oder als Spamschleuder fungieren. Wenn aber die Betriebsparameter (wie die Kühltemperatur) dieses Geräts überwacht werden sollen, steht der Benutzer normalerweise im Regen. Hier hilft SNMP (Simple Network Management Protocol) weiter. Allerdings zur Warnung: Trotz des Namens ist SNMP nicht wirklich ein simples Protokoll.

Die erste Version von SNMP wurde 1988 spezifiziert. Wegen Sicherheitsbedenken (die Authentifizierung wird im Klartext gesendet) war ein Hauptaugenmerk der RFCs (z.B. RFC 1910) für Version 2 diese Sicherheitslücke zu schließen. Allerdings gab es noch einige weitere RFCs die mit miteinander nicht kompatibel waren. Als Kompromiss wurde 1998 Version 2C verabschiedet, die weitgehend akzeptiert und implementiert ist. Sie bietet zwar einige Ergänzungen gegenüber V1, das Thema Sicherheit wird aber weiterhin ausgeklammert. 2002 wurden die Sicherheitsprobleme mit der SNMPv3 Architektur angegangen und behandelt. Wie immer bedingt höhere Sicherheit auch höheren Verwaltungsaufwand, so dass SNMPv1 immer noch weit verbreitet im Einsatz ist.

SNMP beschränkt sich natürlich nicht nur auf Kühlschränke. Einzige Voraussetzungen sind Zugriff auf das Gerät über ein Netz und ein laufender SNMP Agent. Das sind z.B. mal alle Komponenten einer Netzwerkinfrastruktur wie Switches, Router  und WLAN (WIFI) Boxen. Häufig werden SNMP Agenten auch unbewusst betrieben. Drucker, Klimaanlagen, … es gibt viele Geräte mit SNMP Unterstützung von denen man es nicht im ersten Moment vermuten würde. Ein paar Beispiele finden sich in http://www.heise.de/ct/artikel/Stille-Helfer-unter-Beschuss-288124.html, dort wird auch tiefer auf die historische Entwicklung und Sicherheitslücken eingegangen.

MIB & OIDs

MIB ist die Abkürzung für Management Information Base. In einer MIB werden einzelne Objekte in einer hierarchischen Liste organisiert und können über eine einfache Notation direkt adressiert werden (vergleichbar der Gliederung eines Textes).  Ein einzelnes Objekt wird mittels der „Kapitelnummer“  OID (Object Identifier) angesprochen. So kann z.B.  der installierte Speicherplatz über die OID .1.3.6.1.2.1.25.2.2.0 ermittelt werden. Und selbst so etwas Banales wie die Systembeschreibung hat die OID 1.3.6.1.2.1.25.2.2.0.

Zum Glück gibt es mit MIB Browsern eine Reihe von freien Tools, die den Umgang mit MIBs erleichtern. Die Hierarchie einer MIB wird in einer (Windows) Explorer ähnlichen Oberfläche dargestellt. Mit einer ungefähren Idee von der Position einer spezifischen OID kann deren numerischer Wert leicht ermittelt werden. 

Der aktuelle Wert wird auch ausgegeben, in diesem Fall wurde der Firmenkopierer angesprochen. Je nach Tool kann in die MIB auch durchsucht werden. Belohnt wurde die Suche nach „memory“ mit der OID.

Aha, im Firmenkopierer sind 2GB Memory eingebaut. Dieses Vorgehen setzt allerdings eine entsprechend sinnvolle Benennung der OIDs voraus. In vielen Fällen hilft das Internet schneller weiter.

Communities

Die meisten eingesetzten SNMP Versionen kennen nur eine sehr eingeschränkte Form der Authentifizierung, sogenannte Communities:  „Passwörter“ für den lesenden/schreibenden Zugriff. Wie oben gesagt, werden diese „Passwörter“ im Klartext über das Netz gesendet. Allerdings braucht man sich in den nächsten Fällen nicht die Mühe zu machen im Firmen LAN nach SNMP Paketen zu sniffen. Häufig bleibt die Standardeinstellung mit dem „Passwort“ public zum lesenden Zugriff und dem „Passwort“  private für RW Operationen unverändert.

Datensammlung

Ein kleines Beispiel soll den SNMP Zugriff mit perl verdeutlichen. Gesammelt werden die Metriken CPU System, CPU User und Memory gesamt, Memory in use. Für weitere Auswertungen werden die ermittelten Zahlen in einer Datenbank abgelegt.

Perl stellt für den SNMP Zugriff das Modul Net::SNMP bereit. Für den Aufbau einer Session müssen lediglich das angesprochene Gerät und seine Community dem Verbindungsaufbau mitgegeben werden. Alle weiteren Zugriffe erfolgen mit get_request und der gewünschten OID. Zurückgegeben wird von get_request eine Hash Referenz mit der jeweiligen OID als Schlüssel. Normalerweise wird get_request mit einem Array von OIDs ausgeführt; zur besseren Verdeutlichung ist hier für jede Metrik ein get_request kodiert. Nach der Datensammlung wird das Resultat über ODBC in einer Datenbank abgelegt.

Diese Werte weisen eine gewisse Unschärfe auf, weil für jede Metrik ein eigener get_request Aufruf durchgeführt wurde. Z.B. läßt sich bei aufeinanderfolgenden aber stark verzögerten Zugriffen

  • 17:00 Uhr Get: CPU  Auslastung:  100%
  • 17:01 Uhr Get: Memory Auslastung: 100% 

die hohe CPU Auslastung nicht durch die hohe Memory Auslastung begründen. Beide Messzeiten sind zu weit voneinander entfernt. Für ein LAN mit geringen Netzwerklatenzen und ohne große Ansprüche reicht das aber aus. Zur ernsthaften Korrelationsanalyse vieler Metriken muss dieses Beispiel durch einen Request mit einem Array von OIDs umstrukturiert werden.

use Net::SNMP;
use Win32::ODBC;
 
$ts = time;
$session = Net::SNMP->session(Hostname => 'colvm08', Community => 'public') or die "Session: $!";
 
# cpu
 
$cpu_user = $session->get_request("1.3.6.1.4.1.2021.11.9.0");
$db_cpu_user = $cpu_user -> {"1.3.6.1.4.1.2021.11.9.0"};
$cpu_sys  = $session->get_request("1.3.6.1.4.1.2021.11.10.0");
$db_cpu_sys  = $cpu_sys  -> {"1.3.6.1.4.1.2021.11.10.0"};
 
# memory
 
$memory   = $session->get_request("1.3.6.1.2.1.25.2.2.0");
$db_mem = $memory -> {"1.3.6.1.2.1.25.2.2.0"};
$mem_free = $session->get_request("1.3.6.1.4.1.2021.4.6.0");
$db_mem_used = $db_mem - $mem_free -> {"1.3.6.1.4.1.2021.4.6.0"};
if (!($db = new Win32::ODBC("performance")))
{
  print "connect to database failed.\n";
  print "Error:" . Win32::ODBC::Error() . "\n";
  exit;
}
 
$insert = "insert into lpt.dbo.snmp_data values ('colvm08', $ts,$db_cpu_user, $db_cpu_sys, $db_mem, $db_mem_used)";
$rc = $db->Sql ($insert);
if ($rc)
{
  ($errnum, $errtext, $errconn) = $db->Error(); 
  if ($errnum == 2601) {next;} # filter duplicate
  print "Failure: $cmd: " . $db->Error () . "\n";
}

Schon mit diesen einfachen Mitteln lassen sich schleichende Probleme im Capacity Mangement wie der konstant ansteigende Speicherplatzbedarf im folgenden Beispiel erkennen. 

SNMP bietet aber noch einiges mehr: z.B.

  • Veränderung von durch OIDs adressierten Werten (Administration) mit SetRequest.
  • Senden von „Hilferufen“ mittels Traps. Bsp OID. überschreitet einen Grenzwert
  • Starten von Aktivitäten mittels Trap. Bsp Start Stop des SNMP Agenten
  • Abfrage Spezial-Metriken:  Netzwerktraffic von Routern, Switches, ...

Viele Tools stützen sich auf SNMP und verbergen die komplizierte Handhabung vor dem Endanwender durch ein Webinterface. Wireshark unterstützt selbstverständlich SNMP und und und. SNMP bleibt der IT Welt wohl noch für eine lange Zeit erhalten.

Autor: Norbert EndeWebsite: /index.php/prof/profile-en