Вопрос или проблема
В случае, если несколько агентов имеют одинаковые authpassphrase и privpassphrase для разных протоколов, скажем:
- агент 1 настроен на
MD5
иAES-128
с authpassphrase и privpassphrase, оба какTestingPassword
- агент 2 настроен на
MD5
иDES
с authpassphrase и privpassphrase, оба какTestingPassword
Оба агента сконфигурированы с engine-id SNMP4J уведомлений (т.е. локальный engine-id или постоянный engine-id) для отправки информов. Затем добавляется запись в пользователей USM, как ниже
// authPriv с "MD5" и "AES-128"
OctetString authPrivMD5AES128EngineId = OctetString.fromHexStringPairs("Постоянный Engine Id");
UsmUser authPrivMD5AES128User = new UsmUser(securityName, AuthMD5.ID, authAndPrivKey, PrivAES128.ID,
authAndPrivKey);
authPrivMD5AES128User = authPrivMD5AES128User.localizeUser(authPrivMD5AES128EngineId, null,
null, secProtocols);
snmp.getUSM().addUser(authPrivMD5AES128User);
// authPriv с "MD5" и "DES"
OctetString authPrivMD5DESEngineId = OctetString.fromHexStringPairs("Постоянный Engine Id");
UsmUser authPrivMD5DESUser = new UsmUser(securityName, AuthMD5.ID, authAndPrivKey, PrivDES.ID,
authAndPrivKey);
authPrivMD5DESUser = authPrivMD5DESUser.localizeUser(authPrivMD5DESEngineId, null,
null, secProtocols);
snmp.getUSM().addUser(authPrivMD5DESUser);
Таблица пользователей USM будет иметь только одну запись, которая является последним добавленным пользователем (потому что комбинация имени безопасности и engine id используется в качестве ключа), так что в случае, когда информы от переопределенного агента (агент 1) обрабатываются, это приводит к неправильному дайджесту, что и ожидается, поскольку пользователь USM имеет локализованный ключ от агента 2, а информы поступают с локализационным ключом агента 1.
Что можно сделать для решения этой проблемы?
Ответ или решение
Ваша проблема связана с тем, что в SNMP4j используется уникальное сочетание имени безопасности и идентификатора движка (engine-id) для идентификации пользователей USM (User-based Security Model). Когда вы добавляете пользователей с одинаковыми именами безопасности и идентификаторами движка, то все пользователи с таким сочетанием заменяют предыдущие записи, так как они используют одну и ту же пару ключей.
В вашем случае вы добавляете двух пользователей с одинаковыми значениями для securityName
и engine-id
. Это приводит к тому, что в таблице пользователей остаётся только запись последнего добавленного пользователя, а предыдущие записи заменяются. В результате, когда SNMP-агенты (агент 1 и агент 2) отправляют INFORM-сообщения, возникает несоответствие криптографических ключей, что и приводит к ошибке в проверке аутентификации.
Решение проблемы
Для того чтобы избежать этой проблемы, вам нужно использовать уникальные идентификаторы движка для каждого пользователя. Это позволит сделать так, чтобы каждый пользователь имел собственную запись в таблице USM и ключи локализации не конфликтовали. Вы можете сделать это следующим образом:
-
Присвойте уникальные идентификаторы движка для каждого агента. Например, для агента 1 и агента 2 вы можете использовать:
engine-id
для агента 1:EngineId1
(или хеш-значение)engine-id
для агента 2:EngineId2
(или хеш-значение)
-
Обновите добавление пользователей с используемыми уникальными идентификаторами движка:
// authPriv с "MD5" и "AES-128"
OctetString authPrivMD5AES128EngineId = OctetString.fromHexStringPairs("EngineId1");
UsmUser authPrivMD5AES128User = new UsmUser(securityName, AuthMD5.ID, authAndPrivKey, PrivAES128.ID,
authAndPrivKey);
authPrivMD5AES128User = authPrivMD5AES128User.localizeUser(authPrivMD5AES128EngineId, null,
null, secProtocols);
snmp.getUSM().addUser(authPrivMD5AES128User);
// authPriv с "MD5" и "DES"
OctetString authPrivMD5DESEngineId = OctetString.fromHexStringPairs("EngineId2");
UsmUser authPrivMD5DESUser = new UsmUser(securityName, AuthMD5.ID, authAndPrivKey, PrivDES.ID,
authAndPrivKey);
authPrivMD5DESUser = authPrivMD5DESUser.localizeUser(authPrivMD5DESEngineId, null,
null, secProtocols);
snmp.getUSM().addUser(authPrivMD5DESUser);
- Проверьте, чтобы ваши агентские настройки соответствовали новым уникальным идентификаторам движка, отправляя INFORM-сообщения.
Дополнительные рекомендации
- Проверьте конфигурации механизмов аутентификации и шифрования на каждом из агентов.
- Тестируйте отправку INFORM-сообщений с различных агентов, чтобы убедиться, что аутентификация и шифрование работают корректно.
Таким образом, избегая структурного конфликта в USM, вы сможете устранить проблемы с аутентификацией и проводить обработку INFORM-сообщений корректно.