15 Ağustos 2017 Salı

SNMP

SNMP Nedir?
SNMP UDP ile çalışır. Mantıksal olarak "Uygulama Katmanı" seviyesindedir. Yani HTTP ile aynı seviyededir. SNMP router ve switch gibi cihazlarda genellikle kurulu gelir. Windows/Linux sunucularına kurmak gerekir. SNMP yerine Windows dünyasında WMI da kullanılır.

MIB Nedir
Açıklaması şöyle. Nesnelerin tanımlarının saklandığı veritabanı gibi düşünülebilir.
SNMP MIB is a database containing the managed objects which a device will expose to SNMP via an SNMP agent. The MIB appears, at least externally, to be a tree structure.
Ağaç olarak bakınca şöyledir.

Örnek
Sıkça kullanılan sysUpTime şöyledir.
iso(1).identified-organization(3).dod(6).internet(1).mgmt(2).mib-2(1).system(1).sysUpTime(3).

SNMP Daemon
Çalışıyorsa logları /var/log/snmpd.log dosyasından görülebilir.

Belirtilen OID'lere okuma hakkı /etc/snmp/snmpd.config dosyasında şöyle verilir.
view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1

#  Full access from the local host
#rocommunity public  localhost
#  Default access to basic system info
rocommunity public  default    -V systemonly
#  rocommunity6 is for IPv6
rocommunity6 public  default   -V systemonly
Ayrıca snmd'nin hangi kaynakları izleyeceği de bu dosyada belirtilir.

SNMP Mesaj Tipleri
SNMP v1 ile 5 tane mesaj tipi tanımlanıyor

1. SNMP GET
SNMP Manager tarafından SNMP Agent'a bilgi istemek için gönderilir.

2. SNMP GET NEXT
SNMP Manager tarafından SNMP Agent'a MIB'deki bir sonraki bilgiyi istemek için gönderilir.

3. SNMP GET RESPONSE
SNMP Agent tarafında SNMP Manager'a SNMP GET isteğine cevap olarak gönderilir.

4. SNMP SET
SNMP Manager tarafından SNMP Agent'a bir değeri atamak için gönderilir.

5. SNMP TRAP
SNMP Agent tarafından bir olay gerçekleşince gönderilir. UDP kullanılır.

SNMP v2 ile 2 tane ilave mesaj tipi tanımlanıyor

6. SNMP INFORM
SNMP Trap UDP tabanlı olduğu için kaybolabilir. SNMP IINFORM ile SNMP Manager'ın gönderilen mesaja onay vermesi beklenir. Açıklaması şöyle
SNMP Inform Request
The SNMP Inform Request feature supports sending inform requests. SNMP asynchronous notifications are usually sent as SNMP traps.
Traps are less reliable than informs because an acknowledgment is not sent from the receiving end when a trap is received; however, an SNMP manager that receives an inform acknowledges the message with an SNMP response PDU. If the sender does not receive a response for an inform, the inform can be sent again.
7. SNMP GETBULK
SNMP Manager tarafından SNMP Agent'a büyük miktarda veri okumak için gönderilir.

SNMP ile Uygulamaları İzlemek
SNMP sadece cihazları değil uygulamaları izlemek için de kullanılabilir. SNMP ile aynı işi gören Java'da JMX teknolojisi var.

SNMPv3
Switch cihazlarında authpriv alanı şöyle yapılabilir.
authpriv = sha + aes256  veya
authpriv = md5 + des

SNMP'nin Bileşenleri
SNMP bileşenleri kabaca aşağıdaki gibidir.

OID
Object Identifier anlamına gelir. SNMP ağacı üzerinde erişilmek istenen alanı gösteren sayı dizisidir. OID nokta karakteri ile başlarlar. Eğer MIB dosyası mevcutsa, numaraların açıklamasını bulmak ta mümkündür. snmp4j kullanan bir örnek:
/**
41* OID - .1.3.6.1.2.1.1.1.0 => SysDec
42* OID - .1.3.6.1.2.1.1.5.0 => SysName
43* => MIB explorer will be usefull here, as discussed in previous article
44*/
45String sysDescr = client.getAsString(new OID(".1.3.6.1.2.1.1.1.0"));
46System.out.println(sysDescr);
47}
OID tanımlarını gösterren SNMP Object Navigator sayfaları da var. Örnek bir tanım şöyle
Object  cefcModuleOperStatus
OID     1.3.6.1.4.1.9.9.117.1.2.1.1.2
Type    ModuleOperType 

        1:unknown
        2:ok
        3:disabled
        ...
Permission  read-only
Status      current
MIB         CISCO-ENTITY-FRU-CONTROL-MIB 
Description This object shows the module's operational state.
 PDU
Protocol Data Unit anlamına gelir. Gönderilen istek paketi gibi düşünülebilir. PDU ile gönderilebilen en istekler GET, GETNEXT vs. gibi şeyler olabilirler. Get isteği gönderen bir PDU örneği:
80PDU pdu = new PDU();
81for (OID oid : oids) {
82pdu.add(new VariableBinding(oid));
83}
84pdu.setType(PDU.GET);
85ResponseEvent event = snmp.send(pdu, getTarget(), null);

Aşağıda ise PDU'nun mesaj yapısı var.
Variablebinding
PDU ile gönderilen anahtar/değer çiftlerini içerir.

Community String
SNMP Manager ve SNMP Agent tarafından kullanılan Community string aynı olmalıdır. İki çeşit community string vardır. Read-Only ve Read-Write

Böylece hangi SNMP bilgisine kimin erişebileceğini tanımlamak için kullanılabilir, ancak bu alan SNMP 1 ve 2 için şifresiz gönderildiğinden çok güvenli değildir.

 Örnek:
99CommunityTarget target = new CommunityTarget();
100target.setCommunity(new OctetString("public"));
101target.setAddress(targetAddress);
102target.setRetries(2);
103target.setTimeout(1500);
104target.setVersion(SnmpConstants.version2c);

TimeTicks
Bazı SNMP alanlarını değeri TimeTicks olarak belirtiliyor. Açıklaması şöyle
The TimeTicks type represents a non-negative integer which represents
the time, modulo 2^32 (4294967296 decimal), in hundredths of a second
between two epochs.  When objects are defined which use this ASN.1
type, the description of the object identifies both of the reference
epochs
Örnek
snmpwalk -v2c -c xx 10.xx.xxx.xxx sysUpTime
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (170158257) 19 days, 16:39:42.57

snmpwalk komutu
Bu komut ile OID'leri dolaşmak mümkün. Örnek:
snmpwalk -v 2c -c public <ip address network device>
veya tüm ağacı dolaşmak yerine belli bir OID sorgulanabilir.
snmpwalk -v 2c -c public <ip address network device> <OID>
OID yerine eğer MIB dosyaları yüklü ise MIB ismi kullanılabilir.
snmpwalk -v1 -c public localhost DISMAN-EVENT- MIB::sysUpTimeInstance
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (458675) 1:16:26.75
-c seçeneği
community anlamına gelir. Default olarak public'tir.

-v seçeneği
Kullanılması istenen versiyonu belirtir.


1 yorum: