# Simple Network Management Protocol

Simple Network Management Protocol (SNMP) is een toepassingslaag-protocol dat zorgt voor een gemakkelijke overdracht van managementinformatie tussen netwerkmachines. Het werkt op verscheidene protocols zoals UDP, IP, CLNS, DDP en IPX. Het maakt deel uit van het Transmission Control Protocol/Internet Protocol (TCP/IP) protocol suite, zoals gedefinieerd door het Internet Engineering Task Force IETF. Met het SNMP-protocol kan op een eenvoudige manier bijvoorbeeld de status van een disk opgevraagd worden, of de hoeveelheid verkeer over een netwerk. Bijna iedere provider ondersteunt dit protocol dat via kleine programma's (zogenaamde agents) het netwerk monitort en hieruit statistische informatie genereert. SNMP vereist weinig bandbreedte en dat maakt het protocol populair om bepaalde toepassingen op afstand aan te sturen. Bij fouten kan een centraal management systeem verwittigd worden aan de hand van speciale berichten.
SNMPv2, het vervolg op SNMPv1, is al verscheidene jaren in gebruik en staat een intelligenter systeem toe. Een nog nieuwere standaard is SNMPv3, dat boven op de mogelijkheden van SNMPv2 een extra beveiligingslaag heeft, waar SNMPv1 en SNMPv2 tekortkwamen. Deze nieuwe standaard zou als basis dienen voor high-end LAN-, WAN- en mobiele (wifi-)systemen.

## Basiscomponenten

Een SNMP-beheerd netwerk bestaat uit drie basiscomponenten: managed devices, agents en een Network Management System (NMS).
* Managed device: een netwerk node die een SNMP-agent bevat en zich in een SNMP-beheerd netwerk bevindt. Managed devices gaan management-informatie verzamelen en opslaan. Deze informatie maken ze beschikbaar voor Network Management Systems via het SNMP-protocol. Het kunnen routers zijn, switches, printers, enz.
* Agent: een NMS-module die zich op een managed device bevindt en opdrachten van het NMS uitvoert. Een agent weet welke management-informatie zijn node bezit en zet deze informatie om naar een vorm die compatibel is met SNMP.
* Network Management System (NMS): voert applicaties uit die managed devices beheren en controleren. Het bevat de processing power en geheugencapaciteiten die nodig zijn voor netwerk management. Om een SNMP-beheerd netwerk te vormen moet er altijd minstens één NMS zijn.

## Werking

Het SNMP-protocol werkt op basis van commando's die over het netwerk verstuurd worden van een NMS naar een managed device en terug. De commando's kunnen in het algemeen worden opgesplitst in vier hoofdgroepen: read, write, trap en traversal commando's.
* Read: read-commando's worden gebruikt door een NMS om managed devices te monitoren. Er kunnen verschillende variabelen onderzocht worden die opgeslagen zijn door het managed device.
* Write: write-commando's worden gebruikt door een NMS om managed devices te besturen. Hiermee worden waardes van een managed device aangepast.
* Trap: trap-commando's worden gebruikt om asynchroon (niet gelijk met een systeemklok) foutmeldingen door te sturen van een managed device naar een NMS.
* Traversal: traversal commando's worden gebruikt om te kijken wat voor informatie een managed device bijhoudt en om die informatie sequentieel op te halen.

## Management Information Base

Wanneer een management applicatie door middel van het SNMP-protocol informatie opvraagt van apparatuur waarop het SNMP-protocol actief is, wordt de informatie gepresenteerd in tabelvorm. Dit wordt niet geregeld door het SNMP-protocol. Zo'n tabel is een virtuele database die een Management Information Base (MIB) wordt genoemd. Zij structureert haar informatie hiërarchisch aan de hand van managed objects of object instances die waarden bevatten. Deze managed objects worden geïdentificeerd aan de hand van object identifiers. Voor het beschrijven van deze datastructuren en voor de communicatie tussen verschillende soorten systemen wordt de Abstract Syntax Notation One (ASN.1) gebruikt volgens de specificaties van de Structure of Management Information (SMI), een subset van ASN.1. Voor de eerste versie staat dit beschreven in RFC 1155. Voor de managed objects zijn drie datatypes vereist: name, syntax en encoding.
* Name: naam die gebruikt wordt als object identifier.
* Syntax: bepaalt wat voor type data het bevat (integer/octet/string).
* Encoding: in welk formaat de data over het netwerk wordt verzonden.

## SNMP Version 1

SNMP Version 1 (SNMPv1) is de eerste implementatie van het SNMP protocol, ontwikkeld in 1980. Het is een simpel request/response protocol dat beschreven staat in RFC 1098 en RFC 1157. Deze versie werd zeer frequent gebruikt en is met zijn opvolgers uitgegroeid tot een standaard in netwerk management. Door het uitsturen van een request krijgt het een response van een managed device.

### Basiscommando's

Voor dit systeem zijn 5 basiscommando's voorzien: Get, GetNext, Set, Trap en Response.
* Get: het NMS haalt een waarde op van één of meer object instances (van de MIB) van een managed device via de agent.
* GetNext: het NMS haalt de waarde op van de volgende object instance in de lijst.
* Set: het NMS stelt de waarde(s) in van de object instance(s) binnenin de MIB.
* Trap: wordt gebruikt door een agent om een NMS in te lichten over een belangrijke gebeurtenis.
* Response: stuurt de opgevraagde waardes terug naar het NMS.

### Berichtformaat

Berichten bestaan uit twee delen: een message header en een protocol data unit (PDU). De message header bevat twee velden:
* Version number: geeft aan welke versie van SNMP gebruikt wordt.
* Community name: bepaalt een toegangsomgeving voor meerdere NMS (vorm van authenticatie).
De protocol data unit bevat een commando en heeft volgende velden:
* PDU type: bepaalt het type van de PDU.
* Request ID: associeert SNMP-requests met responses.
* Error status: geeft aan welke fout zich voordoet.
* Error index: associeert foutmeldingen met een object instance.
* Variable bindings: bevat waardes die in object instances geschreven kunnen worden.
Bij een Trap-commando ziet het er anders uit:
* Enterprise: duidt aan welke object instance de Trap genereert.
* Agent address: geeft het adres van de object instance die de Trap genereert.
* Generic trap code: bepaalt het generieke type van de Trap.
* Specific trap code: bepaalt het type Trap-code.
* Time stamp: geeft aan hoeveel tijd er zich heeft voorgedaan tussen de laatste herinitialisatie van het netwerk en de Trap.
* Variable bindings: bevat waarden die in object instances geschreven kunnen worden.

## SNMP Version 2

SNMPv2 (beschreven in RFC 1441 tot RFC 1452) is ontwikkeld in 1993. Het heeft buiten de Trap-operatie en enkele verbeteringen qua veiligheid, snelheid en betrouwbaarheid dezelfde operaties als SNMPv1. De Trap-operatie heeft nog steeds dezelfde functie, maar gebruikt een ander formaat voor zijn bericht.

### Basiscommando's

Er worden twee nieuwe basiscommando's toegevoegd: GetBulk en Inform.
* GetBulk: wordt gebruikt door het NMS om grote hoeveelheden waardes op te halen.
* Inform: te vergelijken met de Trap-operatie, maar voegt nog een bevestiging van ontvangst toe wanneer het bericht van het NMS aankomt.

### Achterwaartse compatibiliteit

SNMPv2 is niet achterwaarts compatibel met SNMPv1 op twee gebieden: berichtformaat en operaties. De berichten van SNMPv2 hebben andere headers en andere PDU-formaten. Het gebruikt ook twee nieuwe operaties die bij SNMPv1 nog niet bestonden. Het is echter wel mogelijk van ze samen te laten werken als er gebruik wordt gemaakt van een proxy agent. Deze zal de Get, GetNext en Set operaties doorsturen en de nieuwe operaties (Trap, GetBulk en Inform) omzetten naar SNMPv1-operaties.

## SNMP Version 3

De ontwikkeling van SNMPv3 werd gestart in maart 1997 en in januari 1998 werden er een set RFC's gepubliceerd welke de veranderingen, maar vooral de nieuwe beveiligingen, beschrijven (RFC 2271 t/m RFC 2275). De vorige versies hadden als enige beveiliging een wachtwoord (community string) dat als Plaintext (niet gecodeerde tekst) over het netwerk werd verzonden. Bij versie 3 worden er bij elk bericht veiligheidsparameters verzonden.

## Voordelen

Het grootste voordeel aan SNMP is dat het een zeer eenvoudige architectuur heeft. Hierdoor kan het gemakkelijk in verschillende soorten netwerken geïmplementeerd worden. Ook de kosten voor het ontwikkelen van software worden sterk gedrukt. Nog een voordeel is dat er maar zeer weinig en zeer eenvoudige commando's zijn, waardoor ontwikkelaars van software het protocol snel zullen begrijpen en kunnen gebruiken. Ten slotte is er nog het voordeel dat dit protocol bijna overal wordt gebruikt en dus compatibel is met bijna alle netwerk management systemen.

## Nadelen

Door de simpele architectuur van het protocol is het bijna niet mogelijk om grote hoeveelheden data door te sturen. Als dit toch gebeurt, zal het NMS waarschijnlijk crashen en het netwerk daarmee platleggen. Ook is er bij SNMPv1 en SNMPv2 buiten een community string geen enkele vorm van authenticatie aanwezig. Het is dus zeer kwetsbaar voor hackers die mogelijk ongewenste veranderingen aanbrengen via Set-operaties. Via packet-sniffing kan de community string heel gemakkelijk onderschept worden, aangezien deze niet gecodeerd is. De Set-operatie wordt dus vaak uitgeschakeld, waardoor SNMP enkel gebruikt kan worden om te monitoren.