2. モデルの要素
このセクションには、このメモで定義されているセキュリティモデルを実現するために必要な定義が含まれています。
2.1. ユーザーベースセキュリティモデルのユーザー
このセキュリティモデルを使用する管理操作は、定義されたユーザーIDのセットを使用します。特定のSNMPエンジンで管理操作が承認されているユーザーの場合、そのSNMPエンジンはそのユーザーに関する知識を持っている必要があります。別のSNMPエンジンと通信したいSNMPエンジンは、そのエンジンに既知のユーザーに関する知識(そのユーザーの適用可能な属性の知識を含む)も持っている必要があります。
ユーザーとその属性は次のように定義されます:
-
userName ユーザーの名前を表す文字列。
-
securityName セキュリティモデルに依存しない形式でユーザーを表す人間が読める文字列。userNameとsecurityNameの間には一対一の関係があります。
-
authProtocol このユーザーに代わって送信されるメッセージを認証できるかどうか、およびできる場合は使用される認証プロトコルのタイプの指示。このメモでは、次の2つのプロトコルが定義されています:
- HMAC-MD5-96認証プロトコル。
- HMAC-SHA-96認証プロトコル。
-
authKey このユーザーに代わって送信されるメッセージを認証できる場合、認証プロトコルで使用する(プライベート)認証鍵。ユーザーの認証鍵は、通常、異なる権威あるSNMPエンジンで異なることに注意してください。authKeyはSNMPを介してアクセスできません。authKeyの長さ要件は、使用中のauthProtocolによって定義されます。
-
authKeyChangeおよびauthOwnKeyChange 認証鍵をリモートで更新する唯一の方法。プライバシー保護を使用する必要なく更新を完了できるように、安全な方法でこれを行います。
-
privProtocol このユーザーに代わって送信されるメッセージを開示から保護できるかどうか、およびできる場合は使用されるプライバシープロトコルのタイプの指示。このメモでは、次のプロトコルが定義されています:CBC-DES対称暗号化プロトコル。
-
privKey このユーザーに代わって送信されるメッセージを暗号化/復号化できる場合、プライバシープロトコルで使用する(プライベート)プライバシー鍵。ユーザーのプライバシー鍵は、通常、異なる権威あるSNMPエンジンで異なることに注意してください。privKeyはSNMPを介してアクセスできません。privKeyの長さ要件は、使用中のprivProtocolによって定義されます。
-
privKeyChangeおよびprivOwnKeyChange 暗号化鍵をリモートで更新する唯一の方法。プライバシー保護を使用する必要なく更新を完了できるように、安全な方法でこれを行います。
2.2. リプレイ保護
各SNMPエンジンは3つのオブジェクトを維持します:
-
snmpEngineID、これは(少なくとも管理ドメイン内で)SNMPエンジンを一意かつ明確に識別します。
-
snmpEngineBoots、これはsnmpEngineIDが最後に設定されてからSNMPエンジンが再起動/再初期化された回数のカウントです。
-
snmpEngineTime、これはsnmpEngineBootsカウンターが最後にインクリメントされてからの秒数です。
各SNMPエンジンは、自身のSNMPエンティティ内のこれらのオブジェクトに関して常に権威があります。権威のないSNMPエンジンは、必要に応じて権威のあるSNMPエンジンと同期する責任があります。
権威あるSNMPエンジンは、そのsnmpEngineIDとsnmpEngineBootsの値を不揮発性ストレージに保持する必要があります。
2.2.1. msgAuthoritativeEngineID
認証されたメッセージに含まれるmsgAuthoritativeEngineID値は、あるSNMPエンジンから別のSNMPエンジンへのメッセージが別のSNMPエンジンにリプレイされる攻撃を阻止するために使用されます。これは、メッセージの交換に関与する権威あるSNMPエンジンのsnmpEngineIDを表します。
権威あるSNMPエンジンが最初にインストールされると、企業固有のアルゴリズムに従ってsnmpEngineIDのローカル値を設定します(SNMPアーキテクチャドキュメント[RFC3411]のSnmpEngineIDのテキスト表記法の定義を参照)。
2.2.2. msgAuthoritativeEngineBootsとmsgAuthoritativeEngineTime
認証されたメッセージに含まれるmsgAuthoritativeEngineBootsとmsgAuthoritativeEngineTime値は、メッセージが無効になったときにリプレイされる攻撃を阻止するために使用されます。これらは、メッセージの交換に関与する権威あるSNMPエンジンのsnmpEngineBootsとsnmpEngineTime値を表します。
snmpEngineBootsとsnmpEngineTimeを使用することにより、SNMPエンジンがオフになっている場合でも(つまり、時間の経過とともに増加する)ティックする不揮発性クロックを持つ必要はありません。むしろ、SNMPエンジンが再起動するたびに、snmpEngineBootsを取得し、インクリメントし、不揮発性ストレージに保存し、snmpEngineTimeをゼロにリセットします。
SNMPエンジンが最初にインストールされると、snmpEngineBootsとsnmpEngineTimeのローカル値をゼロに設定します。snmpEngineTimeが最大値(2147483647)に達すると、SNMPエンジンが再起動したかのようにsnmpEngineBootsがインクリメントされ、snmpEngineTimeがゼロにリセットされ、再びインクリメントを開始します。
権威あるSNMPエンジンが再起動するたびに、その権威あるSNMPエンジンのsnmpEngineBootsとsnmpEngineTime値を保持しているSNMPエンジンは、その権威あるSNMPエンジンに正しく認証されたメッセージを送信する前に再同期する必要があります((再)同期手順についてはセクション2.3を参照)。ただし、手順では、受信SNMPエンジンが最後に(再)同期して以来再起動した権威あるSNMPエンジンによって送信された場合、通知を受信SNMPエンジンが本物として受け入れることを規定しています。
権威あるSNMPエンジンが最新のsnmpEngineBoots値を判定できない場合は、snmpEngineBoots値を2147483647に設定する必要があります。
snmpEngineBootsのローカル値が2147483647の値を持つ場合は常に、その値でラッチし、認証されたメッセージは常にnotInTimeWindow認証失敗を引き起こします。
snmpEngineBoots値が2147483647の値に達したSNMPエンジンをリセットするには、手動による介入が必要です。エンジンに物理的にアクセスして再設定する必要があります。新しいsnmpEngineID値を使用するか、そのSNMPエンジンに既知のすべてのユーザーの認証プロトコルとプライバシープロトコルの新しいシークレット値を使用します。SNMPエンジンが1秒に1回再起動しても、2147483647の最大値に達するまでに約68年かかることに注意してください。
2.2.3. タイムウィンドウ
タイムウィンドウは、任意のユーザーに代わって生成されたメッセージが有効である時間のウィンドウを指定する値です。このメモは、すべてのユーザーに対して同じタイムウィンドウ値150秒が使用されることを指定しています。
2.3. 時刻同期
権威のないSNMPエンジンが本物の通信を進めるために必要な時刻同期は、権威のないSNMPエンジンが権威あるSNMPエンジンから権威あるSNMPエンジンのsnmpEngineBootsとsnmpEngineTime値のローカル概念を取得したときに発生します。これらの値は、権威あるSNMPエンジンのタイムウィンドウ内にある(そしてとどまる)必要があります。したがって、権威あるSNMPエンジンの値のローカル概念は、権威あるSNMPエンジンに保存されている値と緩やかに同期を保つ必要があります。権威あるSNMPエンジンからのsnmpEngineBootsとsnmpEngineTimeのローカルコピーを保持することに加えて、権威のないSNMPエンジンは1つのローカル変数latestReceivedEngineTimeも保持する必要があります。この値は、権威のないSNMPエンジンが権威あるSNMPエンジンから受信したsnmpEngineTimeの最高値を記録し、権威のないSNMPエンジンのsnmpEngineTimeの概念が進むのを妨げるメッセージのリプレイの可能性を排除するために使用されます。
権威のないSNMPエンジンは、通信したい権威あるSNMPエンジンごとに、これらの値(snmpEngineBoots、snmpEngineTime、latestReceivedEngineTime)のローカル概念を保持する必要があります。各権威あるSNMPエンジンはそのsnmpEngineID値によって一意かつ明確に識別されるため、権威のないSNMPエンジンは、これらの値のローカル概念をキャッシュするためのキーとしてこの値を使用できます。
時刻同期は、SNMPメッセージを受信する手順の一部として発生します(セクション3.2、ステップ7b)。したがって、権威のないSNMPエンジンによる明示的な時刻同期手順は必要ありません。snmpEngineIDのローカル値が変更されたとき(たとえば、ディスカバリーを通じて)、または権威あるSNMPエンジンとの安全な通信が最初に確立されたときは常に、snmpEngineBootsとlatestReceivedEngineTimeのローカル値をゼロに設定する必要があることに注意してください。これにより、次の本物のメッセージが受信されたときに時刻同期が発生します。
2.4. このセキュリティモデルを使用するSNMPメッセージ
このセキュリティモデルを使用するSNMPメッセージの構文は、バージョン固有のメッセージ処理モデルドキュメント(たとえば[RFC3412])で定義されているメッセージ形式に準拠しています。
SNMPv3メッセージのフィールドmsgSecurityParametersは、OCTET STRINGのデータ型を持っています。その値は、次のASN.1シーケンスのBERシリアル化です:
USMSecurityParametersSyntax DEFINITIONS IMPLICIT TAGS ::= BEGIN
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
}
END
このシーケンスのフィールドは次のとおりです:
-
msgAuthoritativeEngineIDは、メッセージの交換に関与する権威あるSNMPエンジンのsnmpEngineIDを指定します。
-
msgAuthoritativeEngineBootsは、メッセージの交換に関与する権威あるSNMPエンジンのsnmpEngineBoots値を指定します。
-
msgAuthoritativeEngineTimeは、メッセージの交換に関与する権威あるSNMPエンジンのsnmpEngineTime値を指定します。
-
msgUserNameは、メッセージが交換されているユーザー(プリンシパル)を指定します。長さゼロのuserNameはどのユーザーとも一致しませんが、snmpEngineIDディスカバリーに使用できることに注意してください。
-
msgAuthenticationParametersは、usmUserTableのユーザーのエントリのusmUserAuthProtocol列で定義されているように、メッセージに使用される認証プロトコルによって定義されます。
-
msgPrivacyParametersは、usmUserTableのユーザーのエントリのusmUserPrivProtocol列で定義されているように、メッセージに使用されるプライバシープロトコルによって定義されます。
フィールドmsgSecurityParametersのBERエンコーディングの例については、付録A.4を参照してください。
2.5. ユーザーベースセキュリティモデルが提供するサービス
このセクションでは、ユーザーベースセキュリティモデルが提供するサービスとその入力および出力について説明します。
サービスは、抽象サービスインターフェイスのプリミティブとして記述され、入力と出力は、これらの抽象サービスプリミティブで渡される抽象データ要素として記述されます。
2.5.1. 送信SNMPメッセージを生成するためのサービス
メッセージ処理(MP)サブシステムがユーザーベースセキュリティモジュールを呼び出して送信SNMPメッセージを保護する場合、セキュリティモジュールが提供する適切なサービスを使用する必要があります。次の2つのサービスが提供されます:
- リクエストメッセージを生成するサービス。抽象サービスプリミティブは次のとおりです:
statusInformation = -- 成功またはエラー表示
generateRequestMsg(
IN messageProcessingModel -- 通常はSNMPバージョン
IN globalData -- メッセージヘッダー、管理データ
IN maxMessageSize -- 送信SNMPエンティティの最大メッセージサイズ
IN securityModel -- 送信メッセージ用
IN securityEngineID -- 権威あるSNMPエンティティ
IN securityName -- このプリンシパルに代わって
IN securityLevel -- 要求されたセキュリティレベル
IN scopedPDU -- メッセージ(平文)ペイロード
OUT securityParameters -- セキュリティモジュールによって記入
OUT wholeMsg -- 完全に生成されたメッセージ
OUT wholeMsgLength -- 生成されたメッセージの長さ
)
- レスポンスメッセージを生成するサービス。抽象サービスプリミティブは次のとおりです:
statusInformation = -- 成功またはエラー表示
generateResponseMsg(
IN messageProcessingModel -- 通常はSNMPバージョン
IN globalData -- メッセージヘッダー、管理データ
IN maxMessageSize -- 送信SNMPエンティティの最大メッセージサイズ
IN securityModel -- 送信メッセージ用
IN securityEngineID -- 権威あるSNMPエンティティ
IN securityName -- このプリンシパルに代わって
IN securityLevel -- 要求されたセキュリティレベル
IN scopedPDU -- メッセージ(平文)ペイロード
IN securityStateReference -- 元のリクエストからの
-- セキュリティ状態情報への参照
OUT securityParameters -- セキュリティモジュールによって記入
OUT wholeMsg -- 完全に生成されたメッセージ
OUT wholeMsgLength -- 生成されたメッセージの長さ
)
抽象サービスプリミティブのパラメータとして渡される抽象データ要素は次のとおりです:
-
statusInformation メッセージのエンコーディングと保護が成功したかどうかの表示。成功しなかった場合は、問題の表示。
-
messageProcessingModel 生成するメッセージのSNMPバージョン番号。このデータは、ユーザーベースセキュリティモジュールでは使用されません。
-
globalData メッセージヘッダー(つまり、その管理情報)。このデータは、ユーザーベースセキュリティモジュールでは使用されません。
-
maxMessageSize メッセージに含まれる最大メッセージサイズ。このデータは、ユーザーベースセキュリティモジュールでは使用されません。
-
securityParameters これらはセキュリティパラメータです。ユーザーベースセキュリティモジュールによって記入されます。
-
securityModel 使用中のsecurityModel。ユーザーベースセキュリティモデルである必要があります。このデータは、ユーザーベースセキュリティモジュールでは使用されません。
-
securityName snmpEngineIDと一緒に、メッセージを保護するために使用されるusmUserTableの行を識別します。securityNameは、セキュリティモデルに依存しない形式を持っています。レスポンスの場合、このパラメータは無視され、キャッシュからの値が使用されます。
-
securityLevel ユーザーベースセキュリティモジュールがメッセージを開示から保護する必要があるかどうか、およびメッセージを認証する必要があるかどうかを判断するセキュリティレベル。
-
securityEngineID データリクエストメッセージの送信先となる権威あるSNMPエンジンのsnmpEngineID。レスポンスの場合、処理SNMPエンジンのsnmpEngineIDであることが暗黙的であり、指定された場合は無視されます。
-
scopedPDU メッセージペイロード。ユーザーベースセキュリティモデルに関する限り、データは不透明です。
-
securityStateReference 送信レスポンスメッセージを保護するときに使用されるcachedSecurityDataへのハンドル/参照。これは、このレスポンスメッセージが対象とする受信リクエストメッセージを処理するときにユーザーベースセキュリティモジュールによって生成されたものとまったく同じハンドル/参照です。
-
wholeMsg 完全にエンコードおよび保護されたメッセージで、ワイヤ上で送信する準備ができています。
-
wholeMsgLength エンコードおよび保護されたメッセージ(wholeMsg)の長さ。
プロセスが完了すると、ユーザーベースセキュリティモジュールはstatusInformationを返します。プロセスが成功した場合、指定されたsecurityLevelで要求された場合、プライバシーと認証が適用された完成したメッセージが返されます。プロセスが成功しなかった場合、errorIndicationが返されます。
2.5.2. 受信SNMPメッセージを処理するためのサービス
メッセージ処理(MP)サブシステムがユーザーベースセキュリティモジュールを呼び出して受信メッセージの適切なセキュリティを検証する場合、受信メッセージ用に提供されるサービスを使用する必要があります。抽象サービスプリミティブは次のとおりです:
statusInformation = -- エラー表示または成功
-- エラーの場合はエラーカウンタOID/値
processIncomingMsg(
IN messageProcessingModel -- 通常はSNMPバージョン
IN maxMessageSize -- 送信SNMPエンティティの最大メッセージサイズ
IN securityParameters -- 受信メッセージ用
IN securityModel -- 受信メッセージ用
IN securityLevel -- セキュリティレベル
IN wholeMsg -- ワイヤ上で受信されたもの
IN wholeMsgLength -- ワイヤ上で受信された長さ
OUT securityEngineID -- 権威あるSNMPエンティティ
OUT securityName -- プリンシパルの識別
OUT scopedPDU, -- メッセージ(平文)ペイロード
OUT maxSizeResponseScopedPDU -- レスポンスPDUの最大サイズ
OUT securityStateReference -- セキュリティ状態への参照
) -- レスポンスに必要な情報
抽象サービスプリミティブのパラメータとして渡される抽象データ要素は次のとおりです:
-
statusInformation プロセスが成功したかどうかの表示。成功しなかった場合、statusInformationには、インクリメントされたエラーカウンタのOIDと値が含まれます。
-
messageProcessingModel メッセージで受信されたSNMPバージョン番号。このデータは、ユーザーベースセキュリティモジュールでは使用されません。
-
maxMessageSize メッセージに含まれる最大メッセージサイズ。ユーザーベースセキュリティモジュールは、この値を使用してmaxSizeResponseScopedPDUを計算します。
-
securityParameters これらは、メッセージで受信されたセキュリティパラメータです。
-
securityModel 使用中のsecurityModel。ユーザーベースセキュリティモデルである必要があります。このデータは、ユーザーベースセキュリティモジュールでは使用されません。
-
securityLevel ユーザーベースセキュリティモジュールがメッセージを開示から保護する必要があるかどうか、およびメッセージを認証する必要があるかどうかを判断するセキュリティレベル。
-
wholeMsg 受信されたメッセージ全体。
-
wholeMsgLength 受信されたメッセージ(wholeMsg)の長さ。
-
securityEngineID フィールドmsgAuthoritativeEngineIDから抽出され、usmUserTableのシークレットを検索するために使用されたsnmpEngineID。
-
securityName メッセージが受信されたユーザーを表すセキュリティ名。securityNameは、セキュリティモデルに依存しない形式を持っています。
-
scopedPDU メッセージペイロード。ユーザーベースセキュリティモデルに関する限り、データは不透明です。
-
maxSizeResponseScopedPDU 可能なレスポンスメッセージに含めるscopedPDUの最大サイズ。ユーザーベースセキュリティモジュールは、msgMaxSize(メッセージで受信)とそのようなレスポンスメッセージのメッセージヘッダー(securityParametersを含む)に必要なスペースに基づいて、このサイズを計算します。
-
securityStateReference 送信レスポンスメッセージを保護するときに使用されるcachedSecurityDataへのハンドル/参照。メッセージ処理サブシステムがユーザーベースセキュリティモジュールを呼び出してこの受信メッセージへのレスポンスを生成する場合、このハンドル/参照を渡す必要があります。
プロセスが完了すると、ユーザーベースセキュリティモジュールはstatusInformationを返し、プロセスが成功した場合は、メッセージのさらなる処理のための追加のデータ要素を返します。プロセスが成功しなかった場合、errorIndicationと、インクリメントされたエラーカウンタのOIDと値のペアが返されます。
2.6. 鍵ローカリゼーションアルゴリズム
ローカライズされた鍵は、ユーザーUと1つの権威あるSNMPエンジンEの間で共有されるシークレット鍵です。ユーザーがネットワーク全体で1つのパスワードしか持っていないため、1つの鍵しか持っていない場合でも、ユーザーと各権威あるSNMPエンジンの間で共有される実際のシークレットは異なります。これは、鍵ローカリゼーション[Localized-key]によって実現されます。
まず、ユーザーがパスワードを使用する場合、付録A.2.1およびA.2.2で説明されている2つのアルゴリズムのいずれかを使用して、ユーザーのパスワードが鍵Kuに変換されます。
鍵Kuを権威あるSNMPエンジンEのユーザーUのローカライズされた鍵Kulに変換するには、権威あるSNMPエンジンのsnmpEngineIDを鍵Kuに追加し、次に鍵Kuを結果に追加して、ユーザーの鍵Kuの2つのコピー内にsnmpEngineIDをエンベロープします。次に、安全なハッシュ関数を実行します(どれを使用するかは、権威あるSNMPエンジンEのこのユーザーUに定義されている認証プロトコルによって異なります。このドキュメントでは、MD5とSHAに基づく関連アルゴリズムを持つ2つの認証プロトコルを定義しています)。ハッシュ関数の出力は、権威あるSNMPエンジンEのユーザーUのローカライズされた鍵Kulです。