Modelo de segurança baseado em usuário (USM)

O USM é especificado pela RFC3414. Foi projetado de forma a proteger os pacotes do SNMPv3 das ameaças provenientes de disfarces, modificação de mensagens, modificação do fluxo de mensagens e vazamento de informação.

Isto é alcançado através da implementação do conceito de múltiplos usuários, onde cada um tem suas chaves secretas para autenticação (authKey) e privacidade (privKey). Estas chaves não são registradas na MIB do agente, não podendo ser acessadas diretamente por funções SET ou GET.

Descoberta de agentes

A USM requer que os parâmetros da engine de autoridade snmpEngineID, snmpEngineBoots e snmpEngineTime sejam colocados no campo msgSecurityParameters da mensagem. Para que a NMS conheça estes parâmetros do agente, é necessário um processo de descoberta. Este ocorre em duas etapas:

  1. Descoberta da snmpEngineID do agente: a NMS envia um pacote SNMPv3 para o agente com o campo msgAuthoritativeEngineID contendo um valor incorreto. Quando o agente recebe este pacote, o mesmo é descartado e um pacote de descoberta com a snmpEngineID correta é enviado à NMS.
  2. Descoberta de snmpEngineBoots e snmpEngineTime: esta etapa só é necessária se em modo autenticado (authPriv e authNoPriv), pois estes campos são usados pelo módulo de temporização, que faz parte do processo de autenticação. A NMS envia um pacote autenticado com a authKey do usuário especificado em msgUserName para o agente, porém com valores incorretos nos campos msgAuthoritativeEngineBoots e msgAuthoritativeEngineTime. Desta forma, após autenticação do pacote pelo módulo de autenticação, o agente descarta o pacote e envia um pacote de descoberta com os snmpEngineBoots e snmpEngineTime corretos.

Módulo de temporização (Timeliness)

O módulo de temporização tem a função de prover proteção contra atraso de mensagens e repetição. Uma vez que o processo de descoberta esteja concluído em modo autenticado, é preciso que a NMS mantenha sua própria noção do valor dos campos snmpEngineBoots e snmpEngineTime do agente. Desta forma a NMS deve incrementar o campo snmpEngineTime a cada segundo e reiniciar os contadores quando necessário, mantendo seus valores relativamente próximos dos valores reais presentes no agente. Uma NMS deve armazenar e manter atualizados estes campos para todos os agentes com os quais esteja se comunicando.

A função deste módulo é considerada parte do processo de autenticação e ocorre imediatamente após a autenticação do pacote recebido:

  1. Se o campo snmpEngineBoots possuir um valor incorreto, o pacote é automaticamente descartado e é enviado um pacote de descoberta à NMS.
  2. Se o campo snmpEngineTime diferir do valor esperado em mais de 150 segundos, o pacote é descartado. Este valor é estabelecido pela RFC, podendo ser alterado de acordo com a velocidade esperada da rede que esta sendo gerenciada.
  3. Se ambas as etapas superiores obtiverem sucesso, o pacote é considerado temporizado e o processo continua.

Autenticação

Embora a especificação do SNMPv3 contida na RFC suporte a adição de novos modelos de segurança, dois algorítmos para autenticação de pacotes são indicados nesta, os Message Digest 5 (MD5) e Secure Hash Algorithm 1 (SHA-1).

Como estes algorítmos não podem ser usados diretamente como forma de autenticação, em virtude de não receberem como parâmetro uma chave secreta, o algorítmo Keyed Hashing for Message Authentication (HMAC) é utilizado por cima de um dos dois, truncados em 8 bytes, dando origem aos mecanismos de autenticação HMAC-SHA-96 e HMAC-MD5-96. O HMAC descreve o procedimento de anexar uma chave secreta aos dados antes de calcular o resultado do função de resumo, garantindo que as entidades que desejem computar um resultado idêntico para um mesmo conjunto de dados devam ambos utilizar a mesma chave secreta.

Enviando um pacote autenticado:

  1. O pacote é criado. O bit sinalizador de autenticação é ativado no campo msgFlags, e o campo msgAuthenticationParameters é preenchido com zeros.
  2. A função resumo é computada pelo pacote utilizando a authKey para o usuário especificado em msgUserName. O algorítmo utilizado é determinado pelo protocolo de autenticação especificado para o usuário na tabela de usuários do agente.
  3. O resultado computado pela função resumo é inserido no campo msgAuthenticationParameters.
  4. O pacote é enviado.

Recebendo um pacote autenticado:

  1. O pacote é recebido.
  2. Se o campo msgFlags possui o bit de autenticação ativo o processo continua, caso contrário, é ignorado.
  3. O campo msgAuthenticationParameters é armazenado e em seguida preenchido com zeros.
  4. A função resumo é computada pelo pacote utilizando a authKey para o usuário especificado em msgUserName. O algorítmo utilizado é determinado pelo protocolo de autenticação especificado para o usuário na tabela de usuários do agente. Se o usuário não exista na tabela, o pacote e descartado.
  5. O resultado computado da função resumo é comparado com o valor armazenado previamente e se ambos formem idênticos o processo é continua, caso contrário, o pacote é descartado.

Privacidade

A USM especifica uso de algorítmo Cipher Block Chaining mode to the Data Encryption Standard (CBC-DES) para encriptação e decriptação de pacotes do SNMPv3. O escopo de encritação abrange somente o campo scopedPDU. Este algorítmo necessita de três parâmetros de entrada, são estes: os dados a serem encriptados, uma chave secreta de 56 bits (privKey) e um número aleatório de 56 bits (salt). Para duas entidades serem capazes de usar encriptação durante sua comunicação é preciso que ambas compartilhem a privKey e o salt, a primeira estará armazenada na tabela de usuários do agente, a segunda é enviada com a mensagem.

Enviando um pacote encriptado:

  1. O pacote é criado. Os bits sinalizadores de autenticação e encriptação são ativados no campo msgFlags.
  2. Um valor aleatório para o salt é computado.
  3. O campo scopedPDU é encriptado com a privKey do usuário especificado em msgUserName e o salt.
  4. O salt é inserido no campo msgPrivacyParameters.
  5. O pacote é autenticado.
  6. O pacote é enviado.

Recebendo um pacote encriptado:

  1. O pacote é recebido.
  2. O pacote é autenticado, se durante este processo o campo msgFlags possuir o bit de autenticação inativo, o processo de decriptação é ignorado. Se a autenticação falha o pacote é descartado.
  3. Se o campo msgFlags possui o bit de encriptação ativo o processo continua, caso contrário, é ignorado.
  4. O campo scopedPDU é decriptado com a privKey do usuário especificado em msgUserName e o salt recebido. O processo continua no próximo módulo.

Tabela de usuários

Cada agente mantém uma tabela de usuários onde são armazenadas as credenciais de todos os usuários que tem acesso ao sistema por meio do SNMP. Cada entrada na tabela contém os seguintes campos: