четверг, 19 декабря 2019 г.

Реализация SNMP v3 на примере Coriant hiT7300


3 версия протокола SNMP (Simple Network Management Protocol) появилась достаточно давно в ответ на слабые возможности 2 версии в аспекте безопасности. Однако, несмотря на доступность и широкое распространение описаний версии 3 протокола[1], существует мало описаний реализаций, основанных на SNMP v3. Текущий пост отражает опыт автора по исследованию дампов обмена ‘Coriant Element Manager GUI’ (далее EM) и Multi-Haul Transport Platform hiT7300 (далее hiT).

Мы рассмотрим серию SNMP get и set запросов, выдаваемых EM в момент запуска и аутентификации приложения, и ответы hiT на эти запросы. Прежде чем углубиться в последовательность и содержание запросов, необходимо обратить внимание на следующее:

  1)      Клиент(EM), для успешной аутентификации, должен обладать информацией о следующих USM параметрах (RFC 3414):
·         Username – напр. ‘Administrator’,
·         Authentication protocol – MD5,
·         Authentication key - напр. ‘12345’,
·         Privacy protocol – AES,
·         Privacy key – напр. ‘12345’,
·         Context name – ‘tnms’.

  2)      При создании UDP соединения на клиентской стороне операционной системой производится выделение ‘source port’ (не путать с ‘destination port’, который для SNMP по умолчанию 161). Значение ‘source port’ может изменяться при различных запусках клиентского приложения. В рассматриваемой реализации значение ‘source port’ используется при динамическом формировании OID. Например, при выделении ‘source port’ = 60583, имеем побайтово 0xEC и 0xA7, и динамический суффикс в составе OID вида ‘.236.167’.
  
  3)      Собственный IP адрес известен клиентской стороне и используется при динамическом формировании OID. Например, для IP адреса клиента ’10.60.1.5’ в составе OID некоторых запросов будет присутствовать часть ’.10.60.1.5.’.

  4)      Упомянутое выше значение Username используется также при формировании OID. Например, для Administratorв составе OID некоторых запросов будет присутствовать часть ’ .65.100.109.105.110.105.115.116.114.97.116.111.114.’ (ASCII).

Обратимся теперь к последовательности и содержанию get и set запросов при запуске EM, аутентификации и создании сессии (часть дампа далее не приводится):

Запросы 1 и 2. В соответствии с RFC 5343 производим "discovery" параметров EngineID, EngineBoots и EngineTime,

Request:
data: get-request,
msgData: plaintext,
variable-bindings: -


Answer:
data: report,
msgData: plaintext,
variable-bindings: (1 item)
1.3.6.1.6.3.15.1.1.4 (usmStatsUnknownEngineIDs)(Integer32) ==> 1.

Интересно, что полученные значения EngineBoots и EngineTime используются, начиная с запроса 4, а в запросе 3 для них необходимо установить нулевые значения.

Запрос 3. Запрос usmStatsNotInTimeWindows

Request:
data: get-request,
msgData: encryptedPDU,
variable-bindings: -

Answer:
data: report,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.6.3.15.1.1.2.0 (usmStatsNotInTimeWindows)(Integer32) ==> 0.

Общее количество пакетов, полученных SNMP engine вне авторитативного окна.

Запрос 4. Запрос snmpAgentState.

Request:
data: get-request,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.4.1.42229.1.1.1.7.128.6.0

Answer:
data: get-responce,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.4.1.42229.1.1.1.7.128.6.0 (snmpAgentState)(Integer32) ==> 3(ENABLED).

Состояние агента.

Запрос 5. Запрос sysDescr

Request:
data: get-request,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.2.1.1.1.0 (sysDescr)

Answer:
data: get-responce,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.2.1.1.1.0 (sysDescr)==> ’--------- Copyright 2019 Coriant. All rights reserved.’ (OctetString)

Запрос 6. Запрос interfaceVersion структурно аналогичен 4 и 5.

Запрос 7. Запрос usmXUserLastSuccessfulLogin

Request:
data: get-request,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.4.1.42229.1.1.1.9.2.1.13.13.65.100.109.105.110.105.115.116.114.97.116.111.114

Answer:
data: get-responce,
msgData: encryptedPDU,
variable-bindings: (1 item)
1.3.6.1.4.1.42229.1.1.1.9.2.1.13.13.65.100.109.105.110.105.115.116.114.97.116.111.114 (usmXUserLastSuccessfulLogin)
==> 07:e3:09:0a:06:1f:36:00:2b:00:00(OctetString)
 ==>2019-09-10 и т.д.

Непосредственно в OID включено Username (‘Administrator’) -.65.100.109.105.110.105.115.116.114.97.116.111.114.’ , для которого запрашивается время его последней успешной аутентификации.

Запрос 8. Запрос создания сессии

Request:
data: set-request,
msgData: encryptedPDU,
variable-bindings: (4 items)
1.3.6.1.4.1.42229.1.1.1.9.6.1.2.6.10.60.1.5.236.167==>4(Integer32)==> createAndGo    1.3.6.1.4.1.42229.1.1.1.9.6.1.5.6.10.60.1.5.236.167==>2(Integer32)==> sessionRemoteLogin
1.3.6.1.4.1.42229.1.1.1.9.6.1.3.6.10.60.1.5.236.167==>41646d696e6973747261746f72(OctetString)==> sessionUserName(‘Administrator’)
1.3.6.1.4.1.42229.1.1.1.9.6.1.4.6.10.60.1.5.236.167==> 4043542020(OctetString)==>sessionManager ==> 'root'

Answer:
data: get-responce,
msgData: encryptedPDU,
variable-bindings: (4 items)
1.3.6.1.4.1.42229.1.1.1.9.6.1.2.6.10.60.1.5.236.167==>4(Integer32)==> createAndGo    1.3.6.1.4.1.42229.1.1.1.9.6.1.5.6.10.60.1.5.236.167==>2(Integer32)==> sessionRemoteLogin
1.3.6.1.4.1.42229.1.1.1.9.6.1.3.6.10.60.1.5.236.167==>41646d696e6973747261746f72(OctetString)==> sessionUserName(‘Administrator’)
1.3.6.1.4.1.42229.1.1.1.9.6.1.4.6.10.60.1.5.236.167==> 4043542020(OctetString)==>sessionManager ==> 'root'
Непосредственно в OID включены IP адрес и порт-источник : ‘.10.60.1.5.236.167’.

В посте кратко проиллюстрированы особенности реализации SNMP v3, присущие hiT7300.

[1] Douglas R. Mauro and Kevin J. Schmidt “Essential SNMP” (second edition).