35
1 SNMP Applied Sicheres Anwendungsmonitoring mit SNMP Gerrit Beine [email protected]

SNMP Applied - Sicheres Monitoring mit SNMP

Embed Size (px)

DESCRIPTION

Der Vortrag gibt Unix-Nutzern einen Einblick, wie man Net-SNMP zum Monitoring und Steuern beliebiger Anwendungen nutzen kann. Der Schwerpunkt liegt dabei auf dem Thema der Absicherung des SNMP-Dienstes mit Hilfe von SSL/TLS und Authentifizierung. Als Beispiele dienen hierzu SNMP4J und Net-SNMP.

Citation preview

Page 1: SNMP Applied - Sicheres Monitoring mit SNMP

1

SNMP Applied

Sicheres Anwendungsmonitoring mit SNMP

Gerrit [email protected]

Page 2: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 3: SNMP Applied - Sicheres Monitoring mit SNMP

3

Grundlegendes zu SNMP

Page 4: SNMP Applied - Sicheres Monitoring mit 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

Page 5: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 6: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 7: SNMP Applied - Sicheres Monitoring mit SNMP

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.

Page 8: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 9: SNMP Applied - Sicheres Monitoring mit SNMP

9

Net-SNMP

Page 10: SNMP Applied - Sicheres Monitoring mit 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/

Page 11: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 12: SNMP Applied - Sicheres Monitoring mit SNMP

12

Das Problem:Das ist alles total unsicher!

Page 13: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 14: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 15: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 16: SNMP Applied - Sicheres Monitoring mit SNMP

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!

Page 17: SNMP Applied - Sicheres Monitoring mit SNMP

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“

Page 18: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 19: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 20: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 21: SNMP Applied - Sicheres Monitoring mit SNMP

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)

Page 22: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 23: SNMP Applied - Sicheres Monitoring mit SNMP

23

Net-SNMP mit DTLS/TLS

Page 24: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 25: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 26: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 27: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 28: SNMP Applied - Sicheres Monitoring mit SNMP

28

SNMP-Zugriff von Java

Page 29: SNMP Applied - Sicheres Monitoring mit SNMP

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();...

Page 30: SNMP Applied - Sicheres Monitoring mit SNMP

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... "); }}}

Page 31: SNMP Applied - Sicheres Monitoring mit SNMP

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

Page 32: SNMP Applied - Sicheres Monitoring mit SNMP

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();...

Page 33: SNMP Applied - Sicheres Monitoring mit SNMP

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... "); }}}

Page 34: SNMP Applied - Sicheres Monitoring mit SNMP

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/

Page 35: SNMP Applied - Sicheres Monitoring mit SNMP

35

Viel Spaß noch auf denChemnitzer Linux Tagen 2014!