メインコンテンツまでスキップ

3. 手順の要素

このセクションでは、ユーザーベースセキュリティモデルに従ってSNMPメッセージを処理する際にSNMPエンジンが従うセキュリティ関連の手順について説明します。

3.1. 送信SNMPメッセージの生成

このセクションでは、特定のsecurityLevelで、ユーザーに代わって管理操作(リクエスト、レスポンス、通知、またはレポートなど)を含むメッセージを生成するたびにSNMPエンジンが従う手順について説明します。

  1. a) securityStateReferenceが渡された場合(レスポンスまたはレポートメッセージ)、ユーザーに関する情報がcachedSecurityDataから抽出されます。cachedSecurityDataは破棄できます。securityEngineIDはローカルsnmpEngineIDに設定されます。securityLevelは、呼び出し元モジュールによって指定された値に設定されます。

    それ以外の場合、

    b) securityNameに基づいて、securityEngineIDによって指定される宛先snmpEngineIDのユーザーに関する情報がローカル設定データストア(LCD、usmUserTable)から抽出されます。LCDにユーザーに関する情報がない場合、エラー表示(unknownSecurityName)が呼び出し元モジュールに返されます。

  2. securityLevelでメッセージを開示から保護する必要があることが指定されているが、ユーザーが認証プロトコルとプライバシープロトコルの両方をサポートしていない場合、メッセージを送信できません。エラー表示(unsupportedSecurityLevel)が呼び出し元モジュールに返されます。

  3. securityLevelでメッセージを認証する必要があることが指定されているが、ユーザーが認証プロトコルをサポートしていない場合、メッセージを送信できません。エラー表示(unsupportedSecurityLevel)が呼び出し元モジュールに返されます。

  4. a) securityLevelでメッセージを開示から保護する必要があることが指定されている場合、シリアル化されたscopedPDUを表すオクテットシーケンスがユーザーのプライバシープロトコルに従って暗号化されます。これを行うには、抽象プリミティブに従ってユーザーのプライバシープロトコルを実装するプライバシーモジュールへの呼び出しが行われます:

    statusInformation =       -- 成功または失敗
    encryptData(
    IN encryptKey -- ユーザーのローカライズされたprivKey
    IN dataToEncrypt -- シリアル化されたscopedPDU
    OUT encryptedData -- シリアル化されたencryptedPDU
    OUT privParameters -- シリアル化されたプライバシーパラメータ
    )
    • statusInformation 暗号化プロセスが成功したかどうかを示します。

    • encryptKey ユーザーのローカライズされたプライベートprivKeyは、暗号化アルゴリズムで使用できるシークレット鍵です。

    • dataToEncrypt シリアル化されたscopedPDUは、暗号化するデータです。

    • encryptedData encryptedPDUは、OCTET STRINGとしてエンコードされた暗号化されたscopedPDUを表します。

    • privParameters OCTET STRINGとしてエンコードされたプライバシーパラメータ。

    プライバシーモジュールが失敗を返した場合、メッセージを送信できず、エラー表示(encryptionError)が呼び出し元モジュールに返されます。

    プライバシーモジュールが成功を返した場合、返されたprivParametersがsecurityParametersのmsgPrivacyParametersフィールドに配置され、encryptedPDUが準備中のメッセージのペイロードとして機能します。

    それ以外の場合、

    b) securityLevelでメッセージを開示から保護する必要がないことが指定されている場合、長さゼロのOCTET STRINGがsecurityParametersのmsgPrivacyParametersフィールドにエンコードされ、プレーンテキストscopedPDUが準備中のメッセージのペイロードとして機能します。

  5. securityEngineIDは、securityParametersのmsgAuthoritativeEngineIDフィールドにOCTET STRINGとしてエンコードされます。リクエストメッセージの場合、空の(長さゼロの)securityEngineIDは問題ありません。これにより、リモート(権威ある)SNMPエンジンが、返されるレポートPDUのsecurityParametersのmsgAuthoritativeEngineIDに含まれる適切なsecurityEngineIDを含むレポートPDUを返すためです。

  6. a) securityLevelでメッセージを認証する必要があることが指定されている場合、LCDからsecurityEngineIDに対応する現在のsnmpEngineBootsとsnmpEngineTimeの値が使用されます。

    それ以外の場合、

    b) これがレスポンスまたはレポートメッセージの場合、LCDからローカルsnmpEngineIDに対応する現在のsnmpEngineBootsとsnmpEngineTimeの値が使用されます。

    それ以外の場合、

    c) これがリクエストメッセージの場合、snmpEngineBootsとsnmpEngineTimeの両方にゼロ値が使用されます。snmpEngineIDが空の場合、このゼロ値が使用されます。

    値は、securityParametersのmsgAuthoritativeEngineBootsとmsgAuthoritativeEngineTimeフィールドにそれぞれINTEGERとしてエンコードされます。

  7. userNameは、securityParametersのmsgUserNameフィールドにOCTET STRINGとしてエンコードされます。

  8. a) securityLevelでメッセージを認証する必要があることが指定されている場合、メッセージはユーザーの認証プロトコルに従って認証されます。これを行うには、抽象サービスプリミティブに従ってユーザーの認証プロトコルを実装する認証モジュールへの呼び出しが行われます:

    statusInformation =
    authenticateOutgoingMsg(
    IN authKey -- ユーザーのローカライズされたauthKey
    IN wholeMsg -- 認証されていないメッセージ
    OUT authenticatedWholeMsg -- 認証された完全なメッセージ
    )
    • statusInformation 認証が成功したかどうかを示します。

    • authKey ユーザーのローカライズされたプライベートauthKeyは、認証アルゴリズムで使用できるシークレット鍵です。

    • wholeMsg 認証する完全なシリアル化されたメッセージ。

    • authenticatedWholeMsg authenticateOutgoingMsgサービスに与えられた入力と同じですが、msgAuthenticationParametersが適切に記入されています。

    認証モジュールが失敗を返した場合、メッセージを送信できず、エラー表示(authenticationFailure)が呼び出し元モジュールに返されます。

    認証モジュールが成功を返した場合、msgAuthenticationParametersフィールドがsecurityParametersに配置され、authenticatedWholeMsgが準備中の認証されたメッセージのシリアル化を表します。

    それ以外の場合、

    b) securityLevelでメッセージを認証する必要がないことが指定されている場合、長さゼロのOCTET STRINGがsecurityParametersのmsgAuthenticationParametersフィールドにエンコードされます。wholeMsgがシリアル化され、準備中の認証されていないメッセージを表します。

  9. 完成したメッセージとその長さが、statusInformationを成功に設定して呼び出し元モジュールに返されます。

3.2. 受信SNMPメッセージの処理

このセクションでは、特定のsecurityLevelで、ユーザーに代わって管理操作を含むメッセージを受信するたびにSNMPエンジンが従う手順について説明します。

手順の要素を簡素化するために、状態情報の解放は常に明示的に指定されているわけではありません。一般的な規則として、メッセージが破棄されたときに状態情報が利用可能な場合、状態情報も解放する必要があります。また、エラー表示は、インクリメントされたカウンタのOIDと値、およびオプションでsecurityLevelの値、カウンタのcontextEngineIDまたはcontextNameの値を返すことができます。さらに、エラーが検出された時点でそのような情報が利用可能な場合、securityStateReferenceデータが返されます。

  1. 受信したsecurityParametersが、セクション2.4で定義されたUsmSecurityParametersに従ってフォーマットされたOCTET STRINGのシリアル化([RFC3417]の規約に従って)でない場合、snmpInASNParseErrsカウンタ[RFC3418]がインクリメントされ、エラー表示(parseError)が呼び出し元モジュールに返されます。この場合、レポートPDUを生成するのに十分な情報がないため、インクリメントされたカウンタのOIDと値なしで返されることに注意してください。

  2. セキュリティパラメータフィールドの値がsecurityParametersから抽出されます。呼び出し元に返されるsecurityEngineIDは、msgAuthoritativeEngineIDフィールドの値です。cachedSecurityDataが準備され、このデータを参照するためにsecurityStateReferenceが準備されます。キャッシュする値は次のとおりです:

    msgUserName

  3. securityParametersのmsgAuthoritativeEngineIDフィールドの値が不明な場合:

    a) ディスカバリーを実行する権威のないSNMPエンジンは、オプションでローカル設定データストア(LCD)に新しいエントリを作成し、処理を続けることができます。

    または

    b) usmStatsUnknownEngineIDsカウンタがインクリメントされ、エラー表示(unknownEngineID)とインクリメントされたカウンタのOIDと値が呼び出し元モジュールに返されます。

    長さゼロまたは他の不正なサイズのmsgAuthoritativeEngineIDが受信された場合、engineIDディスカバリーを容易にするためにb)を選択する必要があることに注意してください。それ以外の場合、a)とb)の選択は実装の問題です。

  4. msgUserNameとmsgAuthoritativeEngineIDフィールドの値に関する情報がローカル設定データストア(LCD、usmUserTable)から抽出されます。ユーザーに関する情報が利用できない場合、usmStatsUnknownUserNamesカウンタがインクリメントされ、エラー表示(unknownSecurityName)とインクリメントされたカウンタのOIDと値が呼び出し元モジュールに返されます。

  5. ユーザーに関する情報が、呼び出し元によって要求されたsecurityLevelをサポートしていないことを示している場合、usmStatsUnsupportedSecLevelsカウンタがインクリメントされ、エラー表示(unsupportedSecurityLevel)とインクリメントされたカウンタのOIDと値が呼び出し元モジュールに返されます。

  6. securityLevelでメッセージを認証する必要があることが指定されている場合、メッセージはユーザーの認証プロトコルに従って認証されます。これを行うには、抽象サービスプリミティブに従ってユーザーの認証プロトコルを実装する認証モジュールへの呼び出しが行われます:

    statusInformation =          -- 成功または失敗
    authenticateIncomingMsg(
    IN authKey -- ユーザーのローカライズされたauthKey
    IN authParameters -- ワイヤ上で受信されたもの
    IN wholeMsg -- ワイヤ上で受信されたもの
    OUT authenticatedWholeMsg -- 認証がチェックされた
    )
    • statusInformation 認証が成功したかどうかを示します。

    • authKey ユーザーのローカライズされたプライベートauthKeyは、認証アルゴリズムで使用できるシークレット鍵です。

    • wholeMsg 認証する完全なシリアル化されたメッセージ。

    • authenticatedWholeMsg authenticateIncomingMsgサービスに与えられた入力と同じですが、認証がチェックされた後。

    認証モジュールが失敗を返した場合、メッセージは信頼できないため、usmStatsWrongDigestsカウンタがインクリメントされ、エラー表示(authenticationFailure)とインクリメントされたカウンタのOIDと値が呼び出し元モジュールに返されます。

    認証モジュールが成功を返した場合、メッセージは本物であり、信頼できるため、処理が続行されます。

  7. securityLevelが認証されたメッセージを示している場合、msgAuthoritativeEngineIDフィールドの値に対応するsnmpEngineBoots、snmpEngineTime、latestReceivedEngineTimeのローカル値がローカル設定データストアから抽出されます。

    a) 抽出されたmsgAuthoritativeEngineIDの値が処理SNMPエンジンのsnmpEngineIDの値と同じ場合(これが権威あるSNMPエンジンであることを意味します)、次のいずれかの条件が真の場合、メッセージはタイムウィンドウの外にあると見なされます:

    - snmpEngineBootsのローカル値が2147483647である。

    - msgAuthoritativeEngineBootsフィールドの値がsnmpEngineBootsのローカル値と異なる。または、

    - msgAuthoritativeEngineTimeフィールドの値がsnmpEngineTimeのローカル概念と+/- 150秒以上異なる。

    メッセージがタイムウィンドウの外にあると見なされた場合、usmStatsNotInTimeWindowsカウンタがインクリメントされ、エラー表示(notInTimeWindow)とOID、インクリメントされたカウンタの値、およびエラーをauthNoPrivのsecurityLevelで報告する必要があるという表示が呼び出し元モジュールに返されます

    b) 抽出されたmsgAuthoritativeEngineIDの値が処理SNMPエンジンのsnmpEngineID値と同じでない場合(これが権威あるSNMPエンジンでないことを意味します)、次のようになります:

    1) 次の条件の少なくとも1つが真の場合:

    - 抽出されたmsgAuthoritativeEngineBootsフィールドの値がsnmpEngineBootsの値のローカル概念よりも大きい。または、

    - 抽出されたmsgAuthoritativeEngineBootsフィールドの値がsnmpEngineBootsの値のローカル概念と等しく、抽出されたmsgAuthoritativeEngineTimeフィールドの値がlatestReceivedEngineTimeの値よりも大きい。

    抽出されたmsgAuthoritativeEngineIDフィールドの値に対応するLCDエントリが更新され、次のように設定されます:

    - snmpEngineBootsの値のローカル概念がmsgAuthoritativeEngineBootsフィールドの値に、

    - snmpEngineTimeの値のローカル概念がmsgAuthoritativeEngineTimeフィールドの値に、および

    - latestReceivedEngineTimeがmsgAuthoritativeEngineTimeフィールドの値の値に。

    2) 次のいずれかの条件が真の場合、メッセージはタイムウィンドウの外にあると見なされます:

    - snmpEngineBootsの値のローカル概念が2147483647である。

    - msgAuthoritativeEngineBootsフィールドの値がsnmpEngineBootsの値のローカル概念よりも小さい。または、

    - msgAuthoritativeEngineBootsフィールドの値がsnmpEngineBootsの値のローカル概念と等しく、msgAuthoritativeEngineTimeフィールドの値がsnmpEngineTimeの値のローカル概念よりも150秒以上小さい。

    メッセージがタイムウィンドウの外にあると見なされた場合、エラー表示(notInTimeWindow)が呼び出し元モジュールに返されます。

    これは、古すぎる(おそらくリプレイされた)メッセージが検出され、本物でないと見なされることを意味することに注意してください。

    この手順では、メッセージ内のmsgAuthoritativeEngineBootsの値がsnmpEngineBootsの値のローカル概念よりも大きくなることを許可しており、受信SNMPエンジンが最後に(再)同期してから再起動した権威あるSNMPエンジンから受信したメッセージを本物として受け入れることができることに注意してください。
  8. a) securityLevelでメッセージが開示から保護されていることが示されている場合、encryptedPDUを表すOCTET STRINGがユーザーのプライバシープロトコルに従って復号化され、暗号化されていないシリアル化されたscopedPDU値が取得されます。これを行うには、抽象プリミティブに従ってユーザーのプライバシープロトコルを実装するプライバシーモジュールへの呼び出しが行われます:

    statusInformation =       -- 成功または失敗
    decryptData(
    IN decryptKey -- ユーザーのローカライズされたprivKey
    IN privParameters -- ワイヤ上で受信されたもの
    IN encryptedData -- 受信されたencryptedPDU
    OUT decryptedData -- シリアル化された復号化されたscopedPDU
    )
    • statusInformation 復号化プロセスが成功したかどうかを示します。

    • decryptKey ユーザーのローカライズされたプライベートprivKeyは、復号化アルゴリズムで使用できるシークレット鍵です。

    • privParameters OCTET STRINGとしてエンコードされたmsgPrivacyParameters。

    • encryptedData encryptedPDUは、OCTET STRINGとしてエンコードされた暗号化されたscopedPDUを表します。

    • decryptedData 復号化が成功した場合のシリアル化されたscopedPDU。

    プライバシーモジュールが失敗を返した場合、メッセージを処理できないため、usmStatsDecryptionErrorsカウンタがインクリメントされ、エラー表示(decryptionError)とインクリメントされたカウンタのOIDと値が呼び出し元モジュールに返されます。

    プライバシーモジュールが成功を返した場合、復号化されたscopedPDUが呼び出し元モジュールに返されるメッセージペイロードです。

    それ以外の場合、

    b) scopedPDUコンポーネントはプレーンテキストであると想定され、呼び出し元モジュールに返されるメッセージペイロードです。

  9. maxSizeResponseScopedPDUが計算されます。これは、可能なレスポンスメッセージのscopedPDUに許可される最大サイズです。受信したリクエストと同じsecurityLevelを許可するメッセージヘッダーが用意されています。

  10. ユーザーのsecurityNameがusmUserTableから取得されます。

  11. セキュリティデータがcachedSecurityDataとしてキャッシュされるため、このメッセージへの可能なレスポンスは同じ認証およびプライバシーシークレットを使用できます。保存/キャッシュする情報は次のとおりです:

    msgUserName、 usmUserAuthProtocol、usmUserAuthKey usmUserPrivProtocol、usmUserPrivKey

  12. statusInformationが成功に設定され、processIncomingMsgプリミティブで指定されているようにOUTパラメータを渡して呼び出し元モジュールに返されます。