2.4. SNMP Messages Using this Security Model (このセキュリティモデルを使用する SNMP メッセージ)
2.4. SNMP Messages Using this Security Model (このセキュリティモデルを使用する SNMP メッセージ)
このセクションでは, ユーザーベースセキュリティモデルを使用する場合の SNMP メッセージの形式と構造について説明します。
SNMPv3 Message Format (SNMPv3 メッセージ形式)
USM を使用する SNMPv3 メッセージは以下の構造を持ちます:
SNMPv3Message ::= SEQUENCE {
msgVersion INTEGER (3),
msgGlobalData HeaderData,
msgSecurityParameters OCTET STRING,
msgData ScopedPduData
}
Message Components (メッセージコンポーネント)
1. msgVersion (メッセージバージョン)
- タイプ (Type): INTEGER
- 値 (Value): 3 (SNMPv3 の場合)
- 目的 (Purpose): SNMP バージョンを識別
2. msgGlobalData (HeaderData) (グローバルメッセージデータ)
グローバルメッセージヘッダー情報を含みます:
HeaderData ::= SEQUENCE {
msgID INTEGER (0..2147483647),
msgMaxSize INTEGER (484..2147483647),
msgFlags OCTET STRING (SIZE(1)),
msgSecurityModel INTEGER (1..2147483647)
}
フィールド (Fields):
-
msgID (メッセージ ID): リクエストとレスポンスメッセージを調整するための一意の識別子
- 範囲: 0 から 2147483647
- リクエスト/レスポンスモデルで使用され, レスポンスをリクエストに一致させる
-
msgMaxSize (最大メッセージサイズ): 送信者が受け入れることができる最大メッセージサイズ
- 最小値: 484 オクテット
- メッセージサイズのネゴシエーションに使用
-
msgFlags (メッセージフラグ): ビットフラグを含む 1 オクテットの OCTET STRING
- ビット 0 (LSB):
authFlag- 認証が使用される場合は 1, それ以外は 0 - ビット 1:
privFlag- プライバシー (暗号化) が使用される場合は 1, それ以外は 0 - ビット 2:
reportableFlag- エラー時にレポート-PDU を送信する必要がある場合は 1 - ビット 3-7: 予約済み, ゼロでなければならない
- ビット 0 (LSB):
-
msgSecurityModel (メッセージセキュリティモデル): 使用中のセキュリティモデルを識別
- 値: ユーザーベースセキュリティモデル (USM) の場合は 3
3. msgSecurityParameters (メッセージセキュリティパラメータ)
USM の場合, これは BER エンコードされた UsmSecurityParameters を含む OCTET STRING です:
UsmSecurityParameters ::= SEQUENCE {
msgAuthoritativeEngineID OCTET STRING,
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
msgAuthoritativeEngineTime INTEGER (0..2147483647),
msgUserName OCTET STRING (SIZE(0..32)),
msgAuthenticationParameters OCTET STRING,
msgPrivacyParameters OCTET STRING
}
フィールド (Fields):
-
msgAuthoritativeEngineID (権威あるエンジン ID): 権威ある SNMP エンジンの snmpEngineID
- リクエストの場合: コマンドレスポンダーの engineID
- 通知の場合: 通知発信者の engineID
- レスポンスの場合: コマンドレスポンダーの engineID
- レポートの場合: レポート送信者の engineID
-
msgAuthoritativeEngineBoots (権威あるエンジンブート): 権威あるエンジンのブートカウンター
- 範囲: 0 から 2147483647
- エンジンが再初期化されるときに増分
- リプレイ保護に使用
-
msgAuthoritativeEngineTime (権威あるエンジン時刻): 最後のブート以降の秒数
- 範囲: 0 から 2147483647
- 毎秒増分
- リプレイ保護とタイムウィンドウ検証に使用
-
msgUserName (ユーザー名): メッセージが送信される主体 (ユーザー)
- 長さ: 0 から 32 オクテット
- 権威あるエンジンの usmUserTable に存在する必要がある
- 大文字小文字を区別
-
msgAuthenticationParameters (認証パラメータ): 認証ダイジェスト
- 長さは認証プロトコルに依存:
- HMAC-MD5-96: 12 オクテット
- HMAC-SHA-96: 12 オクテット
- 認証がない場合は空 (ゼロ長)
- メッセージ全体に対して計算 (このフィールドは最初にゼロに設定)
- 長さは認証プロトコルに依存:
-
msgPrivacyParameters (プライバシーパラメータ): プライバシープロトコルパラメータ
- CBC-DES の場合: 8 オクテット (ソルト値)
- プライバシーがない場合は空 (ゼロ長)
- 異なる暗号初期化ベクトルを確保するために使用
4. msgData (ScopedPduData) (メッセージデータ)
メッセージペイロード, 平文または暗号化のいずれか:
ScopedPduData ::= CHOICE {
plaintext ScopedPDU,
encryptedPDU OCTET STRING
}
プライバシーが使用されていない場合 (privFlag = 0):
- msgData には
plaintext ScopedPDU(平文) が含まれる
プライバシーが使用されている場合 (privFlag = 1):
- msgData には
encryptedPDU(OCTET STRING) が含まれる - 暗号化されたデータは BER エンコードされた ScopedPDU
ScopedPDU Format (スコープ付き PDU 形式)
ScopedPDU ::= SEQUENCE {
contextEngineID OCTET STRING,
contextName OCTET STRING,
data ANY -- PDU from RFC 3416
}
フィールド (Fields):
-
contextEngineID (コンテキストエンジン ID): コンテキストの snmpEngineID
- 非プロキシシナリオでは通常 msgAuthoritativeEngineID と同じ
- プロキシシナリオでは異なる可能性がある
-
contextName (コンテキスト名): コンテキスト名
- contextEngineID と共に使用して管理情報を識別
- 単一エンジン上で複数の仮想 SNMP コンテキストを有効にする
-
data (データ): 実際の SNMP PDU
- GetRequest, GetNextRequest, GetBulkRequest, SetRequest, InformRequest, SNMPv2-Trap, Response, または Report
Security Level Combinations (セキュリティレベルの組み合わせ)
msgFlags は 3 つのセキュリティレベルを決定します:
-
noAuthNoPriv (認証なしプライバシーなし):
authFlag=0, privFlag=0- 認証なし, プライバシーなし
- msgAuthenticationParameters は空
- msgPrivacyParameters は空
- msgData は平文
-
authNoPriv (認証ありプライバシーなし):
authFlag=1, privFlag=0- プライバシーなしの認証
- msgAuthenticationParameters にはダイジェストが含まれる
- msgPrivacyParameters は空
- msgData は平文
-
authPriv (認証ありプライバシーあり):
authFlag=1, privFlag=1- 認証とプライバシー
- msgAuthenticationParameters にはダイジェストが含まれる
- msgPrivacyParameters にはプライバシーパラメータが含まれる
- msgData は暗号化されている
注意: 認証なしプライバシーあり (authFlag=0, privFlag=1) は許可されていません。このようなメッセージは拒否する必要があります。
Message Flow Examples (メッセージフローの例)
例 1: noAuthNoPriv ディスカバリーリクエスト
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12345,
msgMaxSize: 65507,
msgFlags: 0x04 (reportableFlag 設定),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: "",
msgAuthoritativeEngineBoots: 0,
msgAuthoritativeEngineTime: 0,
msgUserName: "",
msgAuthenticationParameters: "",
msgPrivacyParameters: ""
},
msgData: plaintext ScopedPDU {
contextEngineID: "",
contextName: "",
data: GetRequest-PDU
}
}
例 2: authPriv 認証済みおよび暗号化されたリクエスト
SNMPv3Message {
msgVersion: 3,
msgGlobalData: {
msgID: 12346,
msgMaxSize: 65507,
msgFlags: 0x07 (authFlag, privFlag, reportableFlag),
msgSecurityModel: 3
},
msgSecurityParameters: {
msgAuthoritativeEngineID: 0x80001F8880...,
msgAuthoritativeEngineBoots: 15,
msgAuthoritativeEngineTime: 3045678,
msgUserName: "admin",
msgAuthenticationParameters: 0x9F3B7A2E... (12 オクテット),
msgPrivacyParameters: 0x0000000012345678 (8 オクテット)
},
msgData: encryptedPDU (暗号化された ScopedPDU)
}
Message Size Considerations (メッセージサイズの考慮事項)
実装がサポートしなければならない最小メッセージサイズは 484 オクテット です。これにより以下が保証されます:
- メッセージヘッダーのためのスペース
- 少なくとも最小限の PDU コンテンツ
- 認証ダイジェストを含むセキュリティパラメータ
実装は以下に対応するために, より大きなメッセージ (例: IPv4 上の UDP の場合 65507 オクテット) をサポートする必要があります:
- 大きな変数バインディング
- 多数のアイテムを持つ GetBulk レスポンス
- パディングオーバーヘッドを伴う暗号化されたメッセージ
Special Message Cases (特殊なメッセージケース)
Report Messages (レポートメッセージ)
レポート-PDU は, エラー通知と情報交換 (ディスカバリー, 時刻同期) に使用される特別なレスポンスです。これらは:
- 認証なしで送信される可能性がある (ディスカバリーの場合)
- 認証付きで送信される可能性がある (他のエラーの場合)
- エラーカウンター OID を持つ単一の変数バインディングを含む
- レポートの原因となったメッセージの msgID を使用
Notification Messages (通知メッセージ)
InformRequest および SNMPv2-Trap PDU の場合:
- 通知発信者 (notification originator) が権威あるエンジン
- msgAuthoritativeEngineID は発信者の engineID
- 通知受信者は発信者の時刻値をキャッシュする必要がある
これは, コマンドレスポンダーが権威あるコマンドレスポンダーモデルとは逆です。