20 de fev. de 2018

SNMP


Olá Pessoal Boa Tarde, hoje vou falar sobre SNMP, que é um protocolo de gerenciamento bastante utilizados em dispositivos de redes.

Também convido vocês a visitar o meu blog pessoal https://ciscoandlinux.wordpress.com/, onde estarei postando tópicos relacionados à certificação CCNA R&S...

SNMP é o acrônimo de Simple Network Management Protocol, como seu nome diz ele é um protocolo de gerenciamento, utilizado para coletar e ou receber informação de um elemento gerenciado.

SNMP armazena informações do elemento em uma pequena base de dados chamada de MIB, Management Information Base. A MIB é uma coleção de informação organizada hierárquicamente, dados como CPU, Memora, Quantidade Interfaces etc podem ser armazenadas na MIB.

Existem dois tipo de objetos dentro de uma MIB, escalares e tabulares. Objetos escalares estão associados a uma única instância, enquanto objetos tabulares contem várias instancias agrupadas em tabela.

Exemplo, um objeto escalar pode ser a data desde quando um dispositivo esta rodando, p.e sysUpTime, a única instância que temos é o tempo transcurrido.

jose@rejane:~/CCIE$ snmpwalk -v 2c -c public 192.168.200.1 SNMPv2-MIB::sysUpTime
SNMPv2-MIB::sysUpTime.0 = Timeticks: (55858) 0:09:18.58
jose@rejane:~/CCIE$

Um objeto tabular pode ser as interfaces de um roteador, onde cada linha da tabela é uma instancia, e cada coluna uma variavél, p.e ifTable.

jose@rejane:~/CCIE$ snmptable -v 2c -c public 192.168.200.1 IF-MIB::ifTable
SNMP table: IF-MIB::ifTable

ifIndex ifDescr ifType ifMtu ifSpeed ifPhysAddress ifAdminStatus ifOperStatus ifLastChange ifInOctets ifInUcastPkts ifInNUcastPkts ifInDiscards ifInErrors ifInUnknownProtos ifOutOctets ifOutUcastPkts ifOutNUcastPkts ifOutDiscards ifOutErrors ifOutQLen ifSpecific
 1 Ethernet0/0 ethernetCsmacd 1500 10000000 aa:bb:cc:0:2:0 up up 0:0:01:59.02 23733 212 ? 0 0 2 34321 251 ? 0 0 ? ?
 2 Ethernet0/1 ethernetCsmacd 1500 10000000 aa:bb:cc:0:2:10 up up 0:0:02:09.90 0 0 ? 0 0 0 4928 32 ? 0 0 ? ?
 3 Ethernet0/2 ethernetCsmacd 1500 10000000 aa:bb:cc:0:2:20 down down 0:0:00:11.38 0 0 ? 0 0 0 0 0 ? 0 0 ? ?
 4 Ethernet0/3 ethernetCsmacd 1500 10000000 aa:bb:cc:0:2:30 down down 0:0:00:11.40 0 0 ? 0 0 0 0 0 ? 0 0 ? ?

Dentro da MIB cada objeto tem um identificador, chamado de OID Object Identifiers. Um OID indentifica de forma única um objeto dentro da MIB.

A MIB é organizada de forma hierárquica, onde cada nível representa uma "organização".

MIB

Se diz que uma MIB é como se fosse uma árvore, que vai se expandendo na medida que descemos os níveis.

Na árvore da MIB o OID, identificaria a folha onde queremos procurar alguma informação. O OID é
formado pela concatenação dos diferentes níveis da MIB pelos quais passamos até chegar na folha desejada.

Exemplo se queremos ir para a folha da Cisco, precisamos ir para o OID="iso.org.dod.internet.private.enterprise.cisco", numericamente o equivalente seria OID="1.3.6.1.4.1.9".

Uma empresa privada que desenvolve uma MIB, solicita e lhe é assignada um número dentro do OID="iso.org.dod.internet.private.enterprise".

Os OIDs dentro da MIB, são definidos nos chamados arquivos MIBs, geralmente tem extensão .my ou .mib , eles são disponibilizados pelo fornecedor.

Dentro de um elemento gerenciado via SNMP, esta sendo executado o que se chama de SNMP Agent, agente SNMP, que é um software que se encarrega de coletar à informação do elemento e ir armazenando os valores na MIB. O agente SNMP responde quando um servidor chamado de SNMP Manager, gerente SNMP, executa alguma query na MIB via comando SNMP. O agente SNMP também tem como função enviar eventos que acontecem no elemento ao SNMP Manager, ditos eventos são chamados de traps.

Algumas das operações básicas utilizadas em SNMP, para poder ler e escrever na MIB são:
  • GET - Serve para ler o valor associado a um determinado OID.
  • GETNEXT -  Serve para ler o valor do próximo OID.
  • SET - Serve para modificar o valor associado a um determinado OID.
  • TRAP - Quando um evento ou erro acontece no elemento gerenciado o agente SNMP envia um "trap" ao gerente SNMP.
  • RESPONSE - é o resultado que o agente SNMP devolve ao gerente SNMP, depois de uma operação GET,GETNEXT, ou SET. Quando é GET, GETNEXT ele devolve o valor solicitado, quando é SET ele devolve o valor modificado.

SNMP

trap

O protocolo SNMP, utiliza UDP e as portas 161 e 162. A porta 161 são para as operações de GET, SET, RESPONSE e a 162 para os TRAPs.

Um gerente SNMP, se encarrega de coletar informação SNMP de diferentes fornecedores, Cisco, Juniper, Arista etc. Para isso ele precisa saber qual OID pertence à qual fornecedor , também precisa saber como decodificar as traps que chegam. Para isso são utilizados os arquivos MIB disponibilizados pelo fornecedor, as quais precisam ser carregadas no Gerente SNMP. O Gerente SNMP também recebe o nome de NMS Network Management Station.
Existem três versões de SNMP:
  • SNMPv1 - é a versão inicial do protocolo SNMP RFC-1028, não é utilizado nenhum tipo de encriptação para enviar os dados, somente autenticação via um string de texto chamado de "community". SNMPv1 utiliza variavéis tipo contador de no máximo 32 bits, o que nos tempos atuais não é muito aplicavél. Como já falado ele utiliza UDP portas 161/162.
  • SNMPv2c - é a versão mais utilizada nos dias de hoje, a diferençã básica é com SNMPv1é que agora existem contadores de 64 bits.
  • SNMPv3 - essa versão traz grande melhoria em termos de segurança, agora encriptação das mensagens SNMP é possivél, assim como diferentes niveis de segurança. Explicarei esses detalhes um pouco mais adiante.
Agora que temos uma base teórica, vamos configurar o SNMPv2c e SNMPv3 em um roteador de teste:
snmplab
O Manager SNMP será minha laptop.


Configurando SNMPv2c

SNMPv2c precisa autenticar via um string chamado de "community", além disso um pode configurar o acesso à MIB somente de leitura ou de leitura e escritura.


R1(config)#snmp-server community CISCO rw 
R1(config)#

A community utilizada é "CISCO" e vamos liberar o acesso à MIB de leitura e escrita rw.

Agora vou coletar informação do objeto sysName, ele é um objeto que existe dentro de qualquer elemento gerenciado via SNMP, o OID do sysName "1.3.6.1.2.1.1.5.0" faz parte de uma MIB chamada SNMPv2-MIB que é uma MIB padrão.


jose@rejane:~/CCIE$ snmpget -v 2c -c CISCO 192.168.200.1 1.3.6.1.2.1.1.5.0
iso.3.6.1.2.1.1.5.0 = STRING: "R1"
jose@rejane:~/CCIE$

Beleza, eu também posso em vez de utilizar o OID númerico, utilizar o nome do OID. Para isso eu preciso carregar a MIB no Manager, para propósitos de teste eu vou carregar a MIB OSPF-MIB e vou coletar informação do objeto tabular ospfAreaTable

jose@rejane:/usr/share/apps/snmpb/mibs$ snmptable -v 2c -c CISCO 192.168.200.1 OSPF-MIB::ospfAreaTable
SNMP table: OSPF-MIB::ospfAreaTable

ospfAreaId ospfAuthType ospfImportAsExtern ospfSpfRuns ospfAreaBdrRtrCount ospfAsBdrRtrCount ospfAreaLsaCount ospfAreaLsaCksumSum ospfAreaSummary ospfAreaStatus ospfAreaNssaTranslatorRole ospfAreaNssaTranslatorState ospfAreaNssaTranslatorStabilityInterval ospfAreaNssaTranslatorEvents
 0.0.0.0 none importExternal 1 0 0 1 13093 sendAreaSummary active ? ? ? ?
jose@rejane:/usr/share/apps/snmpb/mibs$

Caso seja de interesse, eu estou utilizando os comandos Linux, "snmpget" para obter o valor de um OID específico, "snmpwalk" para poder obter os valores de toda uma árvore de OIDs, e "snmptable" que me traz os valores de um objeto tabular.

A grande maioria das vezes, o acesso a um elemento gerenciado é via um Manager ou NMS, então podemos ajustar o acesso via uma access-list.



R1(config)#ip access-list standard ACESSO-NMS 
R1(config-std-nacl)#permit host 192.168.200.2 
R1(config-std-nacl)#exit
R1(config)#snmp-server community CISCO rw ACESSO-NMS
R1(config)#

Agora vamos configurar os "traps", de forma a que R1 enviara ao Manager, no caso minha laptop, um evento que tenha acontecido em R1. O evento que vamos simular é a queda do OSPF entre R1 e R2:

snmptrap2


R1(config)#snmp-server enable traps 
R1(config)#snmp-server host 192.168.200.2 traps CISCO
R1(config)#

Eu configurei o roteador para enviar qualquer trap, para o host 192.168.200.2 com o community CISCO, é possivél escolher quais traps queremos que sejam enviadas; quem sabe seja de nosso interesse somente o envio de traps BGP p.e


R1#sh snmp host 
R1#sh snmp host Notification 
host: 192.168.200.2 udp-port: 162 type: trapuser: CISCO security model: v1
R1#

R1#debug snmp packet  
R1#
R1#*Feb 19 18:40:27.859: SNMP: Queuing packet to 192.168.200.2
*Feb 19 18:40:27.859: SNMP: V1 Trap, ent ospfTrap.2, addr 192.168.200.1, gentrap 6, spectrap 2  
ospfGeneralGroup.1 = 192.168.200.1  
ospfNbrEntry.1 = 192.1.1.2  
ospfNbrEntry.2 = 0  
ospfNbrEntry.3 = 192.1.1.2  
ospfNbrEntry.6 = 1*Feb 19 18:40:28.113: SNMP: Packet sent via UDP to 192.168.200.2
*Feb 19 18:40:28.365: SNMP: Queuing packet to 192.168.200.2
*Feb 19 18:40:28.365: SNMP: V1 Trap, ent ospfTrap.2, addr 192.168.200.1, gentrap 6, spectrap 12  
ospfGeneralGroup.1 = 192.168.200.1  
ospfLsdbEntry.1 = 0.0.0.0  
ospfLsdbEntry.2 = 1  
ospfLsdbEntry.3 = 192.168.200.1  
ospfLsdbEntry.4 = 192.168.200.1
*Feb 19 18:40:28.368: SNMP: Queuing packet to 192.168.200.2
*Feb 19 18:40:28.368: SNMP: V1 Trap, ent ospfTrap.2, addr 192.168.200.1, gentrap 6, spectrap 13  
ospfGeneralGroup.1 = 192.168.200.1  
ospfLsdbEntry.1 = 0.0.0.0  
ospfLsdbEntry.2 = 2  
ospfLsdbEntry.3 = 192.1.1.1  
ospfLsdbEntry.4 = 192.168.200.1

De debug, Podemos ver os traps sendo enviados ao NMS.

Configurando SNMPv3

SNMPv3, adopta um modelo de segurança mais robusto, permitindo modelos de autenticação melhores e privacidade dos dados. SNMPv3 permite:

  • Integridade da Mensagem
  • Autenticação
  • Encriptação

Framework de Segurança definido em SNMPv3:

Quando foi desenvolvido SNMPv3 tentou-se procurar uma relação entre as três versões de SNMP, v1, v2c e v3. Dessa forma foram definidos os seguintes modelos de segurança:

  • Modelo SNMPv1
  • Modelo SNMPv2c
  • Modelo SNMPv3

Além disso foram definidos também três níveis de segurança:

  • noAuthNoPriv - A autenticação é feita somente via usuário, não existe encriptação.
  • authNoProv - Existe autenticação via MD5 ou SHA, não existe encriptação.
  • authPriv - Existe autenticação MD5 ou SHA, e encriptação DES,3DES, AES.

Os modelos SNMPv1 e SNMPv2c somente suportam o nível "noAuthNoPriv". Enquanto que SNMPv3 suporta os três níveis de segurança.

Grupos os grupos definem as políticas de acesso à MIB, isso é feito via views, e as views contem os objetos da MIB as quais queremos ter acesso. O modelo e o nível de segurança é definido no Grupo.

Usuários um usuário é sempre atachado a um grupo, e é dele que herda o modelo e nível de segurança, porém qual tipo de autenticação, MD5 ou SHA, e qual modelo de encriptação, DES, 3DES ou AES, é definido por usuário.

Um pode configurar por exemplo SNMPv2c utilizando o framework de segurança definido em SNMPv3, porém nesse caso o usuário vendria a ser a "community".

Vamos configurar SNMPv3 em nosso roteador R1:

Configurando o grupo NMSACCESS, com acesso à todas as MIBs para leitura e com um nível de segurança authPriv:

R1(config)#snmp-server group NMSACCESS v3 priv 
R1(config)#

Configurando o usuário NMS1 pertencente ao grupo NMSACCESS com autenticação SHA e encriptação DES. O usuário NMS1 vai ter dois passwords um para autenticação e outro para encriptação, no exemplo eu escolhi CISCO123.

R1(config)#snmp-server user NMS1 NMSACCESS v3 auth sha CISCO123 priv des CISCO123 
R1(config)#

Vejamos alguns comandos show para verificação:

R1#sh snmp group 
groupname: ILMI security model:v1 
contextname:  storage-type: permanent
readview : *ilmi writeview: *ilmi 
notifyview:  
row status: active

groupname: ILMI security model:v2c 
contextname:  storage-type: permanent
readview : *ilmi writeview: *ilmi 
notifyview:  
row status: active

groupname: NMSACCESS security model:v3 priv 
contextname:  storage-type: nonvolatile
readview : v1default writeview:  
notifyview:  
row status: active

R1#
R1#sh snmp user 
User name: NMS1
Engine ID: 800000090300AABBCC000200
storage-type: nonvolatile active
Authentication Protocol: SHA
Privacy Protocol: DES
Group-name: NMSACCESS
R1#

Fazemos um teste de coletar o OID sysName:

jose@rejane:/var/log$ snmpget -v 3 -l authPriv -u NMS1 -a SHA -A CISCO123 -x DES -X CISCO123 192.168.200.1 1.3.6.1.2.1.1.5.0
iso.3.6.1.2.1.1.5.0 = STRING: "R1"
jose@rejane:/var/log$

Podemos também utilizar uma view, para restringir o acesso a alguns objetos da MIB, vamos restringir o acesso somente aos objetos OSPF da MIB:

R1(config)#snmp-server view OSPF ospf
R1(config)#snmp-server group NMSACCESS v3 priv read OSPF write OSPF 
R1(config)#

Fazendo o teste novamente de obter o sysName:

jose@rejane:/var/log$ snmpget -v 3 -l authPriv -u NMS1 -a SHA -A CISCO123 -x DES -X CISCO123 192.168.200.1 1.3.6.1.2.1.1.5.0
iso.3.6.1.2.1.1.5.0 = No Such Object available on this agent at this OID
jose@rejane:/var/log$

Dessa vez nao consegui :(... Vamos testar coletar dados do OSPF:

jose@rejane:/var/log$ snmptable -v 3 -l authPriv -u NMS1 -a SHA -A CISCO123 -x DES -X CISCO123 192.168.200.1 OSPF-MIB::ospfAreaTable
SNMP table: OSPF-MIB::ospfAreaTable

ospfAreaId ospfAuthType ospfImportAsExtern ospfSpfRuns ospfAreaBdrRtrCount ospfAsBdrRtrCount ospfAreaLsaCount ospfAreaLsaCksumSum ospfAreaSummary ospfAreaStatus ospfAreaNssaTranslatorRole ospfAreaNssaTranslatorState ospfAreaNssaTranslatorStabilityInterval ospfAreaNssaTranslatorEvents
 0.0.0.0 none importExternal 2 0 0 3 84562 sendAreaSummary active ? ? ? ?
jose@rejane:/var/log$

Beleza!, a coleta de dados de OSPF esta OK..Você pode utilizar views não somente em SNMPv3 também pode em SNMPv2.

Agora vamos configurar o envio de traps encriptados:


R1(config)#snmp-server enable traps
R1(config)#snmp-server host 192.168.200.2 traps version 3 priv NMS1 
R1#sh snmp host 
Notification host: 192.168.200.2 udp-port: 162 type: trap
user: NMS1 security model: v3 priv
R1#
R1(config)#
*Feb 20 16:50:25.648: %OSPF-5-ADJCHG: Process 1, Nbr 192.1.1.2 on Ethernet0/1 from FULL to DOWN, Neighbor Down: Dead timer expired
R1(config)#
*Feb 20 16:50:55.652: SNMP: Queuing packet to 192.168.200.2
*Feb 20 16:50:55.652: SNMP: V2 Trap, reqid 1, errstat 0, erridx 0 
 sysUpTime.0 = 804133 
 snmpTrapOID.0 = ospfTrap.2.2 
 ospfGeneralGroup.1 = 192.168.200.1 
 ospfNbrEntry.1 = 192.1.1.2 
 ospfNbrEntry.2 = 0 
 ospfNbrEntry.3 = 192.1.1.2 
 ospfNbrEntry.6 = 1

Da para brincar com access list também para restringir o acesso de ips ao roteador en SNMPv3.

Por hoje é isso pessoal espero que tenham gostado do post!!.

Abçs e Obrigado
Jose CCIE#35681

Nenhum comentário:

Postar um comentário