3.1. Generating an Outgoing SNMP Message (送信 SNMP メッセージの生成)
3.1. Generating an Outgoing SNMP Message (送信 SNMP メッセージの生成)
このセクションでは, SNMP エンジンが特定の securityLevel を使用してユーザーに代わって管理操作 (リクエスト, レスポンス, 通知, またはレポートなど) を含むメッセージを生成する際に従う手順について説明します。
ステップ 1: ユーザー情報の決定 (Determine User Information)
1a) レスポンスまたはレポートメッセージ (Response or Report Message)
securityStateReference が渡された場合 (レスポンスまたはレポートメッセージ), cachedSecurityData からユーザーに関する情報が抽出されます。cachedSecurityData は破棄できるようになります。
- securityEngineID はローカル snmpEngineID に設定されます
- securityLevel は呼び出し元モジュールによって指定された値に設定されます
1b) リクエストまたは通知メッセージ (Request or Notification Message)
それ以外の場合, securityName に基づいて, ローカル構成データストア (LCD, usmUserTable) から securityEngineID によって指定される宛先 snmpEngineID のユーザーに関する情報が抽出されます。
LCD にユーザーに関する情報がない場合, エラー指示 (unknownSecurityName) が呼び出し元モジュールに返されます。
ステップ 2: プライバシーサポートの確認 (Check Privacy Support)
securityLevel がメッセージを開示から保護することを指定しているが, ユーザーが認証プロトコルとプライバシープロトコルの両方をサポートしていない場合, メッセージを送信できません。
エラー指示 (unsupportedSecurityLevel) が呼び出し元モジュールに返されます。
注意: プライバシー (暗号化) には認証が必要です。noAuth + privacy の組み合わせは許可されていません。
ステップ 3: 認証サポートの確認 (Check Authentication Support)
securityLevel がメッセージを認証することを指定しているが, ユーザーが認証プロトコルをサポートしていない場合, メッセージを送信できません。
エラー指示 (unsupportedSecurityLevel) が呼び出し元モジュールに返されます。
ステップ 4: メッセージの暗号化 (必要な場合) (Encrypt the Message)
4a) プライバシーあり (authPriv)
securityLevel がメッセージを開示から保護することを指定している場合, シリアル化された scopedPDU を表すオクテットシーケンスがユーザーのプライバシープロトコルに従って暗号化されます。
そのために, 抽象プリミティブに従ってユーザーのプライバシープロトコルを実装するプライバシーモジュールが呼び出されます:
statusInformation = -- 成功または失敗
encryptData(
IN encryptKey -- ユーザーのローカライズされた privKey
IN dataToEncrypt -- シリアル化された scopedPDU
OUT encryptedData -- シリアル化された encryptedPDU
OUT privParameters -- シリアル化されたプライバシーパラメータ
)
パラメータ (Parameters):
-
statusInformation: 暗号化プロセスが成功したかどうかを示します
-
encryptKey: ユーザーのローカライズされたプライベート privKey は, 暗号化アルゴリズムで使用できる秘密鍵です
-
dataToEncrypt: シリアル化された scopedPDU は暗号化されるデータです
-
encryptedData: encryptedPDU は暗号化された scopedPDU を表し, OCTET STRING としてエンコードされます
-
privParameters: プライバシーパラメータ, OCTET STRING としてエンコードされます
エラー処理 (Error Handling):
プライバシーモジュールが失敗を返した場合, メッセージを送信できず, エラー指示 (encryptionError) が呼び出し元モジュールに返されます。
プライバシーモジュールが成功を返した場合:
- 返された privParameters は securityParameters の msgPrivacyParameters フィールドに入れられます
- encryptedPDU は準備中のメッセージのペイロードとして機能します
4b) プライバシーなし (noAuthNoPriv または authNoPriv)
securityLevel がメッセージを開示から保護しないことを指定している場合:
- ゼロ長の OCTET STRING が securityParameters の msgPrivacyParameters フィールドにエンコードされます
- 平文 scopedPDU が準備中のメッセージのペイロードとして機能します
ステップ 5: msgAuthoritativeEngineID の設定
securityEngineID は OCTET STRING として securityParameters の msgAuthoritativeEngineID フィールドにエンコードされます。
注意: リクエストメッセージの場合, 空の (ゼロ長) securityEngineID は問題ありません。これにより, リモート (権威ある) SNMP エンジンが, 返されるレポート PDU の securityParameters 内の msgAuthoritativeEngineID に適切な securityEngineID を含めたレポート PDU を返すようになります。これは発見メカニズムの一部です。
ステップ 6: snmpEngineBoots と snmpEngineTime の設定
6a) 認証済みメッセージ (Authenticated Message)
securityLevel がメッセージを認証することを指定している場合, LCD から securityEngineID に対応する現在の snmpEngineBoots および snmpEngineTime 値が使用されます。
6b) レスポンスまたはレポートメッセージ (未認証) (Response or Report Message - unauthenticated)
それ以外の場合, これがレスポンスまたはレポートメッセージの場合, LCD からローカル snmpEngineID に対応する現在の snmpEngineBoots および snmpEngineTime 値が使用されます。
6c) その他の未認証メッセージ (Other Unauthenticated Messages)
それ以外の場合 (これは未認証のリクエストまたは通知), snmpEngineBoots と snmpEngineTime の両方がゼロに設定されます。
ステップ 7: 時刻値のエンコード (Encode Time Values)
msgAuthoritativeEngineBoots および msgAuthoritativeEngineTime の値はステップ 6 で決定された値に設定され, INTEGER 値として securityParameters にエンコードされます。
ステップ 8: msgUserName の設定
msgUserName フィールドは securityName に設定され, OCTET STRING として securityParameters にエンコードされます。
ステップ 9: メッセージの認証 (必要な場合) (Authenticate the Message)
9a) 認証あり (authNoPriv または authPriv)
securityLevel がメッセージを認証することを指定している場合, メッセージはユーザーの認証プロトコルに従って認証されます。
msgAuthenticationParameters フィールドは, 認証プロトコルの規則に従ってシリアル化されたものに設定されます:
authenticationInformation =
authenticationAlgorithm(
IN authKey -- ユーザーのローカライズされた authKey
IN wholeMsg -- 未認証のメッセージ
)
プロセス (Process):
-
msgAuthenticationParameters フィールドは, 認証プロトコルによって決定される値 (通常 HMAC-MD5-96 および HMAC-SHA-96 の場合は 12 個のゼロオクテット) で一時的に埋められます
-
認証アルゴリズムが全体のシリアル化されたメッセージ (wholeMsg) に対して実行されます
-
認証アルゴリズムの出力 (MAC/ダイジェスト) が msgAuthenticationParameters の一時的な値を置き換えます
パラメータ (Parameters):
-
authKey: ユーザーのローカライズされたプライベート authKey は認証アルゴリズムが使用する秘密鍵です
-
wholeMsg: 未認証のメッセージ (msgAuthenticationParameters が一時的にゼロに設定されている)
-
authenticationInformation: 計算された認証ダイジェスト/MAC
計算された認証ダイジェストは msgAuthenticationParameters フィールドに配置されます。
9b) 認証なし (noAuthNoPriv)
securityLevel がメッセージを認証しないことを指定している場合, ゼロ長の OCTET STRING が msgAuthenticationParameters フィールドにエンコードされます。
ステップ 10: 完了して返す (Finalize and Return)
完成した wholeMsg は, 成功を示す statusInformation とともに呼び出し元モジュールに返されます。
Message Generation Flow Summary (メッセージ生成フローの概要)
1. ユーザー情報の検索 (キャッシュまたは LCD から)
2. セキュリティレベルサポートの検証
3. 認証サポートの確認
4. scopedPDU の暗号化 (authPriv の場合)
└─> msgPrivacyParameters の設定
5. msgAuthoritativeEngineID の設定
6. 時刻値の決定 (boots/time)
7. 時刻値のエンコード
8. msgUserName の設定
9. メッセージの認証 (authNoPriv または authPriv の場合)
└─> MAC/ダイジェストの計算
└─> msgAuthenticationParameters の設定
10. 完全な wholeMsg を返す
Special Cases (特殊なケース)
Discovery Messages (発見メッセージ)
発見メッセージの場合:
- securityEngineID は空 (ゼロ長)
- securityLevel は noAuthNoPriv
- msgAuthoritativeEngineID は空
- msgAuthoritativeEngineBoots と msgAuthoritativeEngineTime はゼロ
- msgUserName は空
- msgAuthenticationParameters は空
- msgPrivacyParameters は空
Notification Messages (通知メッセージ)
通知メッセージ (Trap, Inform) の場合:
- 通知発信者 (notification originator) が権威あるエンジン
- securityEngineID はローカル snmpEngineID
- ローカル snmpEngineBoots と snmpEngineTime 値を使用
Error Conditions (エラー条件)
次のエラー指示が返される可能性があります:
| エラー (Error) | 条件 (Condition) |
|---|---|
| unknownSecurityName | LCD でユーザーが見つからない |
| unsupportedSecurityLevel | ユーザーが必要な認証またはプライバシープロトコルを欠いている |
| encryptionError | プライバシーモジュールがデータの暗号化に失敗した |
Implementation Notes (実装に関する注意事項)
-
キャッシュされたセキュリティデータ (Cached Security Data): レスポンスおよびレポートメッセージの場合, 元のリクエストメッセージの処理中に保存されたキャッシュデータからセキュリティ情報が取得されます
-
時刻同期 (Time Synchronization): 認証済みメッセージは, ターゲット権威あるエンジンの LCD からの時刻値を使用します。これらの値は同期を保つ必要があります (発見に関するセクション 4 を参照)
-
鍵の使用 (Key Usage): 特定の securityEngineID のローカライズされた authKey と privKey を使用する必要があります
-
メッセージサイズ (Message Size): 実装は, 生成されたメッセージがリモートエンジンとネゴシエートされた maxMessageSize を超えないようにする必要があります