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

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: 予約済み, ゼロでなければならない
  • 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 つのセキュリティレベルを決定します:

  1. noAuthNoPriv (認証なしプライバシーなし): authFlag=0, privFlag=0

    • 認証なし, プライバシーなし
    • msgAuthenticationParameters は空
    • msgPrivacyParameters は空
    • msgData は平文
  2. authNoPriv (認証ありプライバシーなし): authFlag=1, privFlag=0

    • プライバシーなしの認証
    • msgAuthenticationParameters にはダイジェストが含まれる
    • msgPrivacyParameters は空
    • msgData は平文
  3. 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 オクテット です。これにより以下が保証されます:

  1. メッセージヘッダーのためのスペース
  2. 少なくとも最小限の PDU コンテンツ
  3. 認証ダイジェストを含むセキュリティパラメータ

実装は以下に対応するために, より大きなメッセージ (例: IPv4 上の UDP の場合 65507 オクテット) をサポートする必要があります:

  • 大きな変数バインディング
  • 多数のアイテムを持つ GetBulk レスポンス
  • パディングオーバーヘッドを伴う暗号化されたメッセージ

Special Message Cases (特殊なメッセージケース)​

Report Messages (レポートメッセージ)​

レポート-PDU は, エラー通知と情報交換 (ディスカバリー, 時刻同期) に使用される特別なレスポンスです。これらは:

  • 認証なしで送信される可能性がある (ディスカバリーの場合)
  • 認証付きで送信される可能性がある (他のエラーの場合)
  • エラーカウンター OID を持つ単一の変数バインディングを含む
  • レポートの原因となったメッセージの msgID を使用

Notification Messages (通知メッセージ)​

InformRequest および SNMPv2-Trap PDU の場合:

  • 通知発信者 (notification originator) が権威あるエンジン
  • msgAuthoritativeEngineID は発信者の engineID
  • 通知受信者は発信者の時刻値をキャッシュする必要がある

これは, コマンドレスポンダーが権威あるコマンドレスポンダーモデルとは逆です。