2
Ziele des Vortrags
● Überblick zu SNMP liefern● Grundlegende Anwendung von Net-SNMP erklären● SNMPv3 mit Net-SNMP konfigurieren● SNMPv3 von Java aus nutzen● TLS/DTLS mit Net-SNMP konfigurieren
3
Grundlegendes zu SNMP
4
SNMP
● Simple Network Management Protocol● Verwendet UDP, Ports 161 und 162
● Historie● Version 1 (1988) Ursprüngliche Spezifikation in RFC 1155-1157
● Secure SNMP (1992) RFC1351-1353, nie offiziell eingeführt
● Party-based SNMP (1993, SNMPv2p) RFC 1441, 1445-1447, führte getbulk ein, erhöhte Sicherheit, heute nicht mehr im Einsatz
● User-based SNMP (1996, SNMPv2u) RFC 1909-1910, heute nicht mehr im Einsatz
● Community-based SNMP (1996, SNMPv2c) RFC 1901, 1905-1906, Erweiterung von Version 1 um Features aus SNMPv2p
● Version 3 (2002), RFC 3410-3418, Fokus auf Sicherheit
5
Anwendungen von SNMP
● Kontinuierliches Monitoring (Polling)● Uptime, Load
● Netzwerkverkehr
● Speicherverbrauch (RAM, Festplatten)
● Hardware-Zustand (S.M.A.R.T., Lüfterdrehzahl)
● Information über Ereignisse (SNMP-Traps)● Fehlersituationen
● Zustandswechsel
6
SNMP Begriffswelt
● Agent – SNMP-Daemon, der Informationen via UDP 161 bereitstellt oder Traps via UDP 162 versendet
● Manager – SNMP-Client, der Informationen via UDP 161 einsammelt● Trap – SNMP-Nachricht, über UDP 162 versendet● MIB – Management Information Base
● Dateien mit strukturiertem Text nach ASN.1
● Beschreiben Monitoring-Objekte
● Übersetzen OIDs in Namen und interpretieren der entsprechenden Werte
● OID – Object Identifier● Identifikatoren in durch ASN.1 definiertem Namensraum
● community – in SNMP Version 1 und SNMPv2c zur Anmeldung am Agent verwendet
7
Der MIB-Baum
root
ccitt(0) joint-iso-ccitt(2)iso(1)
org(3)
dod(6)
internet(1)
directory(1) mgmt(2) experimental(3) private(4)
mib-2(1) enterprises(1)
Gerrit Beine GmbH(40207)host(25)system(1)
snmp(11)interfaces(2)
ip(4)
Die Position im MIB-Tree liefert den OID eines Objektes.
SNMP-Objekte der Gerrit Beine GmbH beginnen immer mit1.3.6.1.4.1.40207.
8
OID: Object Identifier
● OIDs sind eindeutige Identifikatoren innerhalb eines Agenten bzw. eines Gerätes
● OIDs navigieren durch SNMPs MIB-Baum● Hersteller-spezifische OIDs immer unterhalb von 1.3.6.1.4.1● Mapping auf Domains
● 1.3.6.1.4.1.40207 – gerritbeinegmbh.enterprises.private.internet.dod.iso.org.
● Unterhalb der OID ist jeder Hersteller frei in seinen Definitionen● Zuweisung der Enterprise-Identifkation erfolgt durch die IANA:
http://www.iana.org/assignments/enterprise-numbers
9
Net-SNMP
10
Net-SNMP
● OpenSource SNMP Implementierung (CMU, BSD-Like)● Läuft auf fast allen Unix- und Linux-Systemen● Unterstützt SNMP Version 1, SNMPv2c, SNMPv3 via IPv4 und IPv6● Kommandozeilenapplikationen zu
● Abfrage von SNMP-Agents (snmpget, snmpwalk, …)
● Ändern von Konfigurationen via SNMP (snmpset)
● Übersetzen von OIDs (snmptranslate)
● Daemon zum Empfangen von SNMP Traps (snmptrapd)● Daemon als SNMP Agent (snmpd)● C- und Perl-APIs● Zu finden hier: http://www.net-snmp.org/
11
Net-SNMP snmpd konfigurieren
● Minimale Konfiguration definiert Standort, Kontakt und erlaubt Auslesen# /etc/snmp/snmpd.confsyslocation Server Roomsyscontact Sysadmin (root@localhost)
# listen on all interfacesagentAddress udp:161# allow localhost read-only access via community publicrocommunity public 127.0.0.1# allow whole network read-only access via community publicrocommunity public 192.168.79.0/24
~$ snmpwalk -c public -v1 snmp.devSNMPv2-MIB::sysDescr.0 = STRING: Linux linux-dwoa 3.1.10-1.16-default #1 SMP Wed Jun 27 05:21:40 UTC 2012 (d016078) x86_64SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (635449) 1:45:54.49SNMPv2-MIB::sysContact.0 = STRING: Sysadmin (root@localhost)SNMPv2-MIB::sysName.0 = STRING: linux-dwoaSNMPv2-MIB::sysLocation.0 = STRING: Server Room...
● Abfrage des snmpd erfolgt via snmpwalk
12
Das Problem:Das ist alles total unsicher!
13
Probleme von SNMPv1 und SNMPv2c
● Autorisierung erfolgt über die IP-Adresse● Authentifizierung erfolgt über Community● Einschränkungen der Community gelten jeweils pro IP-Adresse● Übertragung erfolgt unverschlüsselt● Standard-Protokoll UDP sicher Datenübertragung nicht ab
14
Net-SNMP für SNMPv3 konfigurieren
● Benutzer anlegen~$ /etc/init.d/snmpd stop~$ net-snmp-config --create-snmpv3-user -a "secretpw" snmpUser~$ /etc/init.d/snmpd start
# /etc/snmp/snmpd.confsyslocation Server Roomsyscontact Sysadmin (root@localhost)
# listen on all interfacesagentAddress udp:161
● Minimale Konfiguration für SNMPv3
# /usr/share/snmp/snmpd.conf# Via `net-snmp-config` erzeugt
rwuser snmpUser
15
Net-SNMP für SNMPv3 konfigurieren
● Minimale Konfiguration für SNMPv3 # /var/lib/net-snmp/snmpd.conf (openSUSE)# /var/lib/snmp/snmpd.conf (Debian)
############################################################################# STOP STOP STOP STOP STOP STOP STOP STOP STOP## **** DO NOT EDIT THIS FILE ****## STOP STOP STOP STOP STOP STOP STOP STOP STOP############################################################################...
● Abfrage testen (unverschlüsselt und verschlüsselt)~$ snmpget -v 3 -u snmpUser -l authNoPriv -a MD5 -A secretpw \ snmp.dev sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8805) 0:01:28.05
~$ snmpget -v 3 -u snmpUser -l authPriv -a MD5 -A secretpw \ -x DES -X secretpw snmp.dev sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (9835) 0:01:38.35
16
Benutzer hinzufügen
● Neue Benutzer benötigen einen Template-User● Benutzer hinzufügen mit snmpusm● Danach unbedingt das Passwort ändern
~$ snmpusm -v 3 -u snmpUser -l authNoPriv -a MD5 -A secretpw \ snmp.dev create gbeine snmpUserUser successfully created.
~$ snmpget -v 3 -u gbeine -l authNoPriv -a MD5 -A secretpw \ snmp.dev sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (11303) 0:01:53.03
~$ snmpusm -v 3 -u gbeine -l authPriv -a MD5 -A secretpw \ -x DES -X secretpw snmp.dev passwd secretpw strenggeheimSNMPv3 Key(s) successfully changed.
~$ snmpget -v 3 -u gbeine -l authNoPriv -a MD5 -A strenggeheim \ snmp.dev sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (5871) 0:00:58.71
● Achtung: Neue Benutzer und Passworänderungen sind zwar verfügbar,aber noch nicht persistiert!
17
Benutzer hinzufügen
● Benutzer in Konfiguration eintragen und SNMP neu starten# /etc/snmp/snmpd.confsyslocation Server Roomsyscontact Sysadmin (root@localhost)
# listen on all interfacesagentAddress udp:161
# new userrwuser gbeine
● Nach Neustart# /var/lib/net-snmp/snmpd.conf (openSUSE)# /var/lib/snmp/snmpd.conf (Debian)# ...usmUser 1 3 0x80001f88804162a72b6c8c205300000000 "gbeine" "gbeine" NULL \ .1.3.6.1.6.3.10.1.1.2 0x0a32bdbfcc9830326f7a6353a4fef86e \ .1.3.6.1.6.3.10.1.2.2 0x0a32bdb
http://www.net-snmp.org/docs/man/snmpd.conf.html:
„It is recommended you use the net-snmp-config command to do this“
18
Luxus auf Client-Seite
● Client Konfiguration für snmpget, snmpwalk, snmpset, ...# ~/.snmp/snmp.conf
defSecurityName gbeinedefSecurityLevel authPrivdefAuthType MD5defAuthPassphrase strenggeheimdefPrivType DESdefPrivPassphrase strenggeheimdefVersion 3
● Schon deutlich einfacher:~$ snmpget snmp.dev sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (5871) 0:00:58.71
19
Sicherheit erhöhen
● Verschlüsselung auf Seite des Servers erzwingen:# /etc/snmp/snmpd.conf# ...rwuser gbeine priv
● Danach ist -l authNoPriv nicht mehr möglich
● Passwort durch Diffie-Hellman-Keys ersetzen:~$ snmpusm snmp.dev changekey gbeinenew auth key: 0x0404e48a606a7dc5ce0fe23d83257f91new priv key: 0x092d15bea5298a286911692b28a9fc64SNMPv3 Key(s) successfully changed.
● Client Konfiguration anpassen:# ~/.snmp/snmp.conf
defSecurityName gbeinedefSecurityLevel authPrivdefVersion 3defAuthLocalizedKey 0x0404e48a606a7dc5ce0fe23d83257f91defPrivLocalizedKey 0x092d15bea5298a286911692b28a9fc64
20
Verbesserungen gegenüber SNMPv1 und SNMPv2c
● Authentifizierung erfolgt über Benutzer-Account● Übertragung kann mit persönlichen Credentials verschlüsselt werden● Verschlüsselung durch Server erzwungen● Credentials durch sichere Diffie-Hellman-Keys ausgetauscht● Beschränkung der Benutzer auf Teilbäume des MIB-Tree● Festlegung von Lese-/Schreibrechten auf OID-Ebene
21
Zugriffsbeschränkungen
● Zugriff von Usern oder Communities auf OIDs beschränken# /etc/snmp/snmpd.conf# ...rwuser gbeine priv .1.3.6.1.2.1.1# alternativ etwas besser lesbar# rwuser gbeine priv system
● Lese-/Schreibzugriff pro Benutzer festgelegt● Zugriff für jeden Benutzer auf Subtree der OID eingeschränkt● Lösung dazu ist VACM (SNMPv3 View Based Access Control)
22
SNMPv3 VACM
● Zugriff von Usern oder Communities auf OIDs beschränken# /etc/snmp/snmpd.conf# ...rwuser gbeine priv -V basic
view basic included systemview basic included interfaces
● View können OID-Subtree ein- und ausschließen● Mehrere Einträge mit gleichem Namen werden zusammengefasst● Weitere Einschränkungen möglich mit com2sec, group, access
23
Net-SNMP mit DTLS/TLS
24
Net-SNMP mit DTLS/TLS
● Net-SNMP beherrscht sowohl UDP als auch TCP● Dank OpenSSL kann TLS und Datagram TLS (DTLS) verwendet werden● Net-SNMP bringt eigene Tools zur Verwaltung von Zertifikaten mit● Verfügbar ab Net-SNMP 5.6● Debian liefert Net-SNMP 5.4 (zu alt)● openSUSE liefert Net-SNMP 5.7, leider ohne DTLS/TLS Support● Rebuild notwendig mit folgenden Optionen:
~$ ./configure .. \ --with-security-modules=tsm \ --with-transports=TLSTCP,DTLSUDP
25
Zertifikate erstellen
● Certificate Authority zum signieren von Zertifikaten~$ net-snmp-cert genca -I -n ca.snmp.devCA Generated: ca-certs/ca.snmp.dev.crt private/ca.snmp.dev.key
● Server-Zertifikat erstellen (wichtig ist -t snmpd)~$ net-snmp-cert gencsr -I -t snmpd -n snmp.devCertificate Signing Request Generated: newcerts/snmpd.csr private/snmpd.key
● Client-Zertifikat erstellen (wichtig ist -n gbeine)~$ net-snmp-cert gencsr -I -t manager -n gbeineCertificate Signing Request Generated: newcerts/manager.csr private/manager.key
● Zertifikate signieren~$ net-snmp-cert signcsr -I --with-ca ca.snmp.dev --csr managerSigned Certificate Signing Request: newcerts/manager.csr...~$ net-snmp-cert signcsr -I --with-ca ca.snmp.dev --csr snmpdSigned Certificate Signing Request: newcerts/snmpd.csr...
26
Konfiguration des Servers
● Fingerprint der Zertifikate auslesen~$ net-snmp-cert showcerts --fingerprint /etc/snmp/tls:
certs/manager.crt:SHA1 Fingerprint=50:43:06:3E:5A:94:2C:51:3D:8B:32:81:68:B4:D3:BB:97:B2:9C:C4
certs/snmpd.crt:SHA1 Fingerprint=78:11:C4:BE:D2:79:D6:00:4C:E0:0E:BC:0A:95:3B:92:1E:D3:26:41
● Konfiguration anpassen:# /etc/snmp/snmpd.confsyslocation Server Roomsyscontact Sysadmin (root@localhost)
# listen on all interfacesagentAddress udp:161, dtlsudp:10161
# new userrwuser gbeine
# certificate for user gbeinecertSecName 10 \50:43:06:3E:5A:94:2C:51:3D:8B:32:81:68:B4:D3:BB:97:B2:9C:C4 --cn
27
Konfiguration des Clients
● SNMPv3 über DTLS~$ snmpget -v 3 --defSecurityModel=tsm -u gbeine -l authPriv \ -T our_identity=50:43:06:3E:5A:94:2C:51:3D:8B:32:81:68:B4:D3:BB:97:B2:9C:C4 \ -T their_identity=78:11:C4:BE:D2:79:D6:00:4C:E0:0E:BC:0A:95:3B:92:1E:D3:26:41 \ dtlsudp:localhost:10161 sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (120) 0:00:01.20
● Client Konfiguration anpassen:# ~/.snmp/snmp.conf
defSecurityLevel authPrivdefVersion 3defSecurityModel tsmlocalCert 50:43:06:3E:5A:94:2C:51:3D:8B:32:81:68:B4:D3:BB:97:B2:9C:C4peerCert 78:11:C4:BE:D2:79:D6:00:4C:E0:0E:BC:0A:95:3B:92:1E:D3:26:41
● SNMPv3 über DTLS~$ snmpget dtlsudp:localhost:10161 sysUpTime.0DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (120) 0:00:01.20
28
SNMP-Zugriff von Java
29
Einfaches SNMP v1 Get
public class SimpleGet {
private static String hostName = "snmp.dev";private static String port = "161";// OID via snmptranslate -On -IR sysUpTime.0private static String oid = ".1.3.6.1.2.1.1.3.0";private static int snmpVersion = SnmpConstants.version1;private static String community = "public";
public static void main(String[] args) throws Exception{ // Create Target Address object CommunityTarget target = new CommunityTarget(); target.setAddress(new UdpAddress(hostName + "/" + port)); target.setVersion(snmpVersion); target.setCommunity(new OctetString(community));
// Create the PDU object PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(oid))); pdu.setType(PDU.GET);
// Create TransportMapping and send SNMP get TransportMapping<UdpAddress>transport = new DefaultUdpTransportMapping(); transport.listen(); Snmp snmp = new Snmp(transport); ResponseEvent response = snmp.get(pdu, target); snmp.close();...
30
Einfaches SNMP v1 Get
... // Process Agent Response if (response != null) { PDU responsePDU = response.getResponse();
if (responsePDU != null) { int errorStatus = responsePDU.getErrorStatus(); int errorIndex = responsePDU.getErrorIndex(); final String errorStatusText = responsePDU.getErrorStatusText();
if (errorStatus == PDU.noError) { System.out.println("Snmp Get Response = " + responsePDU.getVariableBindings()); } else { System.out.println("Error: Request Failed"); System.out.println("Error Status = " + errorStatus); System.out.println("Error Index = " + errorIndex); System.out.println("Error Status Text = " + errorStatusText); } } else { System.out.println("Error: Response PDU is null"); } } else { System.out.println("Error: Agent Timeout... "); }}}
31
SNMP v3 Get mit Authentifizierung und Verschlüsselung
public class V3Get {
private static String hostName = "snmp.dev";private static String port = "161";private static int snmpVersion = SnmpConstants.version3;private static int securityLevel = SecurityLevel.AUTH_PRIV;private static OID securityAuth = AuthMD5.ID;private static OID securityPriv = PrivDES.ID;private static String username = "gbeine";private static String password = "strenggeheim";
// OID via snmptranslate -On -IR sysUpTime.0private static String oid = ".1.3.6.1.2.1.1.3.0";
public static void main(String[] args) throws Exception{ final OctetString secUserName = new OctetString(username); final OctetString secPassword = new OctetString(password);
// Create Target Address object UserTarget target = new UserTarget(); target.setAddress(new UdpAddress(hostName + "/" + port)); target.setVersion(snmpVersion); target.setSecurityLevel(securityLevel); target.setSecurityName(secUserName);
// Create the PDU object ScopedPDU pdu = new ScopedPDU(); pdu.add(new VariableBinding(new OID(oid))); pdu.setType(PDU.GET);...
32
SNMP v3 Get mit Authentifizierung und Verschlüsselung
... // Create TransportMapping TransportMapping<UdpAddress>transport = new DefaultUdpTransportMapping(); transport.listen(); Snmp snmp = new Snmp(transport);
// Initialize security model USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0); SecurityModels.getInstance().addSecurityModel(usm);
// User authentication data (priv is forced) UsmUser user = new UsmUser(secUserName, securityAuth, secPassword, securityPriv, secPassword); snmp.getUSM().addUser(secUserName, user); // Send SNMP get ResponseEvent response = snmp.get(pdu, target); snmp.close();...
33
SNMP v3 Get mit Authentifizierung und Verschlüsselung
... // Process Agent Response if (response != null) { PDU responsePDU = response.getResponse();
if (responsePDU != null) { int errorStatus = responsePDU.getErrorStatus(); int errorIndex = responsePDU.getErrorIndex(); final String errorStatusText = responsePDU.getErrorStatusText();
if (errorStatus == PDU.noError) { System.out.println("Snmp Get Response = " + responsePDU.getVariableBindings()); } else { System.out.println("Error: Request Failed"); System.out.println("Error Status = " + errorStatus); System.out.println("Error Index = " + errorIndex); System.out.println("Error Status Text = " + errorStatusText); } } else { System.out.println("Error: Response PDU is null"); } } else { System.out.println("Error: Agent Timeout... "); }}}
34
Literaturempfehlungen
● Net-SNMP: http://www.net-snmp.org/docs/● SNMP4J: http://www.snmp4j.org/● Evan McGinnis, David Perkins: Understanding SNMP Mibs
http://www.amazon.de/Understanding-SNMP-Mibs-Evan-McGinnis/dp/0134377087/
● Douglas R. Mauro, Kevin J. Schmidt: Essential SNMPhttp://www.amazon.de/Essential-SNMP-System-Network-Administrators/dp/0596008406/
35
Viel Spaß noch auf denChemnitzer Linux Tagen 2014!