3.2. Processing an Incoming SNMP Message (受信 SNMP メッセージの処理)
3.2. Processing an Incoming SNMP Message (受信 SNMP メッセージの処理)
このセクションでは, SNMP エンジンが特定の securityLevel を持つユーザーに代わって管理操作を含むメッセージを受信する際に従う手順について説明します。
General Notes (一般的な注意事項)
手順の要素を簡素化するために, 状態情報の解放が常に明示的に指定されているわけではありません。一般的な規則として, メッセージが破棄されるときに状態情報が利用可能な場合, 状態情報も解放する必要があります。
また, エラー指示は以下を返すことができます:
- 増分されたカウンターの OID と値
- オプションで securityLevel の値
- カウンターの contextEngineID または contextName の値
- エラーが検出された時点でそのような情報が利用可能な場合は securityStateReference データ
ステップ 1: securityParameters の解析 (Parse securityParameters)
受信した securityParameters がセクション 2.4 で定義された UsmSecurityParameters に従ってフォーマットされた OCTET STRING のシリアル化 (RFC 3417 の規則に従って) でない場合:
- snmpInASNParseErrs カウンター (RFC 3418) が増分されます
- エラー指示 (parseError) が呼び出し元モジュールに返されます
注意: この場合, レポート PDU を生成するのに十分な情報がないため, 増分されたカウンターの OID と値なしで戻ります。
ステップ 2: セキュリティパラメータの抽出 (Extract Security Parameters)
securityParameters からセキュリティパラメータフィールドの値が抽出されます。
- 呼び出し元に返される securityEngineID は msgAuthoritativeEngineID フィールドの値です
- cachedSecurityData が準備され, このデータを参照するために securityStateReference が準備されます
キャッシュされる値 (Values to be cached):
- msgUserName
- msgAuthoritativeEngineID
- msgAuthoritativeEngineBoots
- msgAuthoritativeEngineTime
- msgAuthenticationParameters
- msgPrivacyParameters
ステップ 3: msgAuthoritativeEngineID の確認 (Check msgAuthoritativeEngineID)
securityParameters の msgAuthoritativeEngineID フィールドの値が不明な場合:
オプション a) ディスカバリーモード (非権威あるエンジン) (Discovery Mode)
ディスカバリーを実行する非権威ある SNMP エンジンは, オプションでローカル構成データストア (LCD) に新しいエントリを作成し, 処理を続行できます。
オプション b) エラーを返す (Return Error)
usmStatsUnknownEngineIDs カウンターが増分され, エラー指示 (unknownEngineID) と共に増分されたカウンターの OID と値が呼び出し元モジュールに返されます。
注意: ゼロ長または他の不正なサイズの msgAuthoritativeEngineID を受信した場合, engineID ディスカバリーを容易にするためにオプション b) を選択する必要があります。それ以外の場合, a) と b) の選択は実装の問題です。
ステップ 4: ユーザー情報の検索 (Lookup User Information)
ローカル構成データストア (LCD, usmUserTable) から msgUserName および msgAuthoritativeEngineID フィールドの値に関する情報が抽出されます。
ユーザーに関する情報が利用できない場合:
- usmStatsUnknownUserNames カウンターが増分されます
- エラー指示 (unknownSecurityName) と共に増分されたカウンターの OID と値が呼び出し元モジュールに返されます
ステップ 5: セキュリティレベルサポートの確認 (Check Security Level Support)
ユーザーに関する情報が呼び出し元によって要求された securityLevel をサポートしていないことを示している場合:
- usmStatsUnsupportedSecLevels カウンターが増分されます
- エラー指示 (unsupportedSecurityLevel) と共に増分されたカウンターの OID と値が呼び出し元モジュールに返されます
ステップ 6: メッセージの認証 (必要な場合) (Authenticate Message)
securityLevel がメッセージを認証することを指定している場合, メッセージはユーザーの認証プロトコルに従って認証されます。
そのために, 抽象サービスプリミティブに従ってユーザーの認証プロトコルを実装する認証モジュールが呼び出されます:
statusInformation = -- 成功または失敗
authenticateIncomingMsg(
IN authKey -- ユーザーのローカライズされた authKey
IN authParameters -- ネットワーク上で受信されたもの
IN wholeMsg -- ネットワーク上で受信されたもの
OUT authenticatedWholeMsg -- 認証がチェックされた
)
パラメータ (Parameters):
-
statusInformation: 認証が成功したかどうかを示します
-
authKey: ユーザーのローカライズされたプライベート authKey は認証アルゴリズムが使用できる秘密鍵です
-
authParameters: メッセージで受信された msgAuthenticationParameters
-
wholeMsg: 認証される完全なシリアル化されたメッセージ
-
authenticatedWholeMsg: authenticateIncomingMsg サービスに与えられた入力と同じですが, 認証がチェックされた後
エラー処理 (Error Handling):
認証モジュールが失敗を返した場合, メッセージを信頼できないため:
- usmStatsWrongDigests カウンターが増分されます
- エラー指示 (authenticationFailure) と共に増分されたカウンターの OID と値が呼び出し元モジュールに返されます
認証モジュールが成功を返した場合, メッセージは本物であり信頼できるため, 処理が続行されます。
ステップ 7: タイムウィンドウの確認 (認証済みメッセージの場合) (Check Time Window)
securityLevel が認証済みメッセージを示している場合, ローカル構成データストアから msgAuthoritativeEngineID フィールドの値に対応する snmpEngineBoots, snmpEngineTime, latestReceivedEngineTime のローカル値が抽出されます。
7a) 権威あるエンジン (msgAuthoritativeEngineID == ローカル snmpEngineID)
抽出された msgAuthoritativeEngineID の値が処理 SNMP エンジンの snmpEngineID の値と同じ場合 (これが権威ある SNMP エンジンであることを意味する), 次のいずれかの条件が真である場合, メッセージはタイムウィンドウの外にあると見なされます:
-
snmpEngineBoots のローカル値が 2147483647 (最大値に達した)
-
msgAuthoritativeEngineBoots フィールドの値が snmpEngineBoots のローカル値と異なる
-
msgAuthoritativeEngineTime フィールドの値が snmpEngineTime のローカル概念と +/- 150 秒 以上異なる
タイムウィンドウの外の場合:
- usmStatsNotInTimeWindows カウンターが増分されます
- エラー指示 (notInTimeWindow) と共に OID, 増分されたカウンターの値, およびエラーが securityLevel authNoPriv で報告されなければならないという指示が呼び出し元モジュールに返されます
7b) 非権威あるエンジン (msgAuthoritativeEngineID != ローカル snmpEngineID)
抽出された msgAuthoritativeEngineID の値が処理 SNMP エンジンの snmpEngineID の値と異なる場合 (これが権威ある SNMP エンジンでないことを意味する):
7b.1) 時刻情報の更新 (新しい場合) (Update Time Information)
次の条件の少なくとも 1 つが真である場合:
-
msgAuthoritativeEngineBoots フィールドの抽出された値が snmpEngineBoots 値のローカル概念よりも大きい; または
-
msgAuthoritativeEngineBoots フィールドの抽出された値が snmpEngineBoots 値のローカル概念と等しく, msgAuthoritativeEngineTime フィールドの抽出された値が latestReceivedEngineTime の値よりも大きい
その場合, msgAuthoritativeEngineID フィールドの抽出された値に対応する LCD エントリが更新され, 次のように設定されます:
- snmpEngineBoots 値のローカル概念を msgAuthoritativeEngineBoots フィールドの値に
- snmpEngineTime 値のローカル概念を msgAuthoritativeEngineTime フィールドの値に
- latestReceivedEngineTime を msgAuthoritativeEngineTime フィールドの値に
7b.2) タイムウィンドウの確認 (Check Time Window)
次のいずれかの条件が真である場合, メッセージはタイムウィンドウの外にあると見なされます:
-
snmpEngineBoots 値のローカル概念が 2147483647
-
msgAuthoritativeEngineBoots フィールドの値が snmpEngineBoots 値のローカル概念よりも小さい
-
msgAuthoritativeEngineBoots フィールドの値が snmpEngineBoots 値のローカル概念と等しく, msgAuthoritativeEngineTime フィールドの値が snmpEngineTime 値のローカル概念よりも 150 秒以上少ない
タイムウィンドウの外の場合:
- usmStatsNotInTimeWindows カウンターが増分されます
- エラー指示 (notInTimeWindow) と共に増分されたカウンターの OID と値が呼び出し元モジュールに返されます
ステップ 8: メッセージの復号化 (必要な場合) (Decrypt Message)
securityLevel がメッセージが開示から保護されている (プライバシー) ことを示している場合, encryptedPDU を表す OCTET STRING がユーザーのプライバシープロトコルに従って復号化されます。
そのために, 抽象サービスプリミティブに従ってユーザーのプライバシープロトコルを実装するプライバシーモジュールが呼び出されます:
statusInformation = -- 成功または失敗
decryptData(
IN decryptKey -- ユーザーのローカライズされた privKey
IN privParameters -- ネットワーク上で受信されたもの
IN encryptedData -- 受信された encryptedPDU
OUT decryptedData -- 復号化された scopedPDU
)
パラメータ (Parameters):
-
statusInformation: 復号化プロセスが成功したかどうかを示します
-
decryptKey: ユーザーのローカライズされたプライベート privKey は復号化アルゴリズムが使用する秘密鍵です
-
privParameters: メッセージで受信された msgPrivacyParameters
-
encryptedData: メッセージからの encryptedPDU
-
decryptedData: 復号化された scopedPDU
エラー処理 (Error Handling):
プライバシーモジュールが失敗を返した場合, メッセージを処理できないため:
- usmStatsDecryptionErrors カウンターが増分されます
- エラー指示 (decryptionError) と共に増分されたカウンターの OID と値が呼び出し元モジュールに返されます
プライバシーモジュールが成功を返した場合, 復号化された scopedPDU はさらなる処理に使用されます。
ステップ 9: 結果を返す (Return Results)
次の値が呼び出し元メッセージ処理モジュールに返されます:
- securityEngineID: msgAuthoritativeEngineID
- securityName: msgUserName
- scopedPDU: 復号化された scopedPDU (プライバシーがある場合) または平文 scopedPDU
- maxSizeResponseScopedPDU: メッセージサイズ制約に基づいて計算
- securityStateReference: キャッシュされたセキュリティデータへの参照
Processing Flow Summary (処理フローの概要)
1. securityParameters を解析
2. セキュリティパラメータフィールドを抽出
3. msgAuthoritativeEngineID を確認 (不明 -> エラーまたはエントリを作成)
4. LCD でユーザーを検索 (不明なユーザー -> エラー)
5. セキュリティレベルサポートを確認 (サポートされていない -> エラー)
6. メッセージを認証 (authNoPriv または authPriv の場合)
└─> MAC/ダイジェストを検証 (間違っている -> エラー)
7. タイムウィンドウを確認 (認証済みの場合)
└─> 権威あるの場合: boots と time を検証
└─> 非権威あるの場合: 新しい場合は時刻情報を更新し, 次に検証
└─> ウィンドウの外 -> エラー
8. メッセージを復号化 (authPriv の場合)
└─> encryptedPDU を復号化 (失敗 -> エラー)
9. securityEngineID, securityName, scopedPDU などを返す
Error Conditions Summary (エラー条件の概要)
| エラー (Error) | カウンター (Counter) | 条件 (Condition) |
|---|---|---|
| parseError | snmpInASNParseErrs | 無効な securityParameters 形式 |
| unknownEngineID | usmStatsUnknownEngineIDs | 不明な msgAuthoritativeEngineID |
| unknownSecurityName | usmStatsUnknownUserNames | LCD でユーザーが見つからない |
| unsupportedSecurityLevel | usmStatsUnsupportedSecLevels | ユーザーが要求されたレベルをサポートしていない |
| authenticationFailure | usmStatsWrongDigests | 認証チェックが失敗 |
| notInTimeWindow | usmStatsNotInTimeWindows | メッセージが 150 秒ウィンドウの外 |
| decryptionError | usmStatsDecryptionErrors | 復号化が失敗 |
Implementation Notes (実装に関する注意事項)
-
状態管理 (State Management): 実装は securityStateReference データを適切に管理および解放する必要があります
-
レポート生成 (Report Generation): 多くのエラーは, 適切なエラーカウンターを含むレポート PDU が送信者に送り返されることにつながります
-
時刻同期 (Time Synchronization): 非権威あるエンジンは, 権威あるエンジンから新しい時刻値を持つメッセージを受信したときに, 自動的に時刻情報を更新します
-
ディスカバリー (Discovery): 非権威あるエンジンは, ディスカバリー中に LCD エントリを作成することで, 新しいエンジンについて学習することができます
-
レポート内のセキュリティレベル (Security Level in Reports): notInTimeWindow エラーは, 送信者がレポートを受信して処理できるように, securityLevel authNoPriv (authPriv ではなく) で報告する必要があります