Ошибка аутентификации в SNMP4j при обработке SNMP-информов

Вопрос или проблема

В случае, если несколько агентов имеют одинаковые authpassphrase и privpassphrase для разных протоколов, скажем:

  1. агент 1 настроен на MD5 и AES-128 с authpassphrase и privpassphrase, оба как TestingPassword
  2. агент 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. Присвойте уникальные идентификаторы движка для каждого агента. Например, для агента 1 и агента 2 вы можете использовать:

    • engine-id для агента 1: EngineId1 (или хеш-значение)
    • engine-id для агента 2: EngineId2 (или хеш-значение)
  2. Обновите добавление пользователей с используемыми уникальными идентификаторами движка:

// 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);
  1. Проверьте, чтобы ваши агентские настройки соответствовали новым уникальным идентификаторам движка, отправляя INFORM-сообщения.

Дополнительные рекомендации

  • Проверьте конфигурации механизмов аутентификации и шифрования на каждом из агентов.
  • Тестируйте отправку INFORM-сообщений с различных агентов, чтобы убедиться, что аутентификация и шифрование работают корректно.

Таким образом, избегая структурного конфликта в USM, вы сможете устранить проблемы с аутентификацией и проводить обработку INFORM-сообщений корректно.

Оцените материал
Добавить комментарий

Капча загружается...