7. v3MPの手順要素
このセクションでは、SNMPv3メッセージ処理モデルがSNMPメッセージを生成および処理するときに従う手順について説明します。SNMPv3メッセージ処理モデルは、メッセージの生成および処理時にセキュリティサブシステムと相互作用します。
7.1. 送信SNMPメッセージの準備
このセクションでは、SNMPv3メッセージ処理モデルが送信SNMPメッセージを準備するときに従う手順について説明します。
この手順は、抽象サービスインターフェースprepareOutgoingMessageを使用してディスパッチャによって呼び出されます。
手順:
-
メッセージ処理モデルは、ローカル構成データストア(LCD)を使用して、ローカルSNMPエンジンがサポートする最大メッセージサイズを決定します。これは、[RFC3411] のsnmpEngineMaxMessageSizeで表されます。メッセージ処理モデルはまた、ローカルSNMPエンジンのsnmpEngineIDを決定します。これは、[RFC3411] のsnmpEngineIDで表されます。
-
contextEngineIDの長さがゼロであるか、ローカルSNMPエンジンのsnmpEngineIDと等しくない場合:
a) pduTypeの値が確認済みクラスPDUタイプ(Get、GetNext、GetBulk、Set、またはInform)の場合:
- v3MPはmsgIDを作成します。msgIDは、リクエストとレスポンスを調整するために使用されます。
b) pduTypeの値が未確認クラスPDUタイプ(Trap、Report、Response)の場合:
- v3MPはmsgIDを作成します。msgIDは、リクエストとレスポンスを調整するためには使用されませんが、v3MP内部で使用されます。
-
v3MPはmsgMaxSizeを作成します。msgMaxSizeは、以下の最小値です:
- ローカルSNMPエンジンがサポートする最大メッセージサイズ(snmpEngineMaxMessageSize)、および
- メッセージを送信するために使用されるトランスポートドメインとトランスポートアドレスがサポートできる最大メッセージサイズ。
-
v3MPはmsgFlagsを作成します。msgFlagsはsecurityLevelに基づいて作成されます:
- securityLevelがnoAuthNoPrivを指定する場合、msgFlags authビット = 0 かつ privビット = 0。
- securityLevelがauthNoPrivを指定する場合、msgFlags authビット = 1 かつ privビット = 0。
- securityLevelがauthPrivを指定する場合、msgFlags authビット = 1 かつ privビット = 1。
-
pduTypeが確認済みクラスPDUタイプの場合、msgFlags reportableビットは1に設定されます。それ以外の場合、msgFlags reportableビットは0に設定されます。
-
v3MPは、contextEngineID、contextName、およびPDUの値を使用してscopedPDUを作成します。
-
v3MPは、送信メッセージのmsgSecurityParametersフィールドを作成します。これは、securityModelパラメータで識別されるセキュリティモデルを呼び出し、必要に応じて抽象サービスインターフェースgenerateRequestMsgまたはgenerateResponseMsgを使用することによって行われます。
a) リクエストまたは通知を準備する場合、v3MPは抽象generateRequestMsgサービスインターフェースを使用してセキュリティモデルを呼び出します:
statusInformation = generateRequestMsg(
IN messageProcessingModel -- この場合はSNMPv3
IN globalData -- msgID、msgMaxSize、msgFlags、msgSecurityModel
IN maxMessageSize -- 上記で決定された最大メッセージサイズ
IN securityModel -- 使用中のセキュリティモデル
IN securityEngineID -- 権威あるSNMPエンジン
IN securityName -- プリンシパル
IN securityLevel -- 要求されるセキュリティレベル
IN scopedPDU -- 保護されるメッセージ
OUT securityParameters -- セキュリティモデルによって埋められる
OUT wholeMsg -- 完全に生成されたメッセージ
OUT wholeMsgLength -- 生成されたメッセージの長さ
)
b) レスポンスを準備する場合、v3MPは抽象generateResponseMsgサービスインターフェースを使用してセキュリティモデルを呼び出します:
statusInformation = generateResponseMsg(
IN messageProcessingModel -- この場合はSNMPv3
IN globalData -- msgID、msgMaxSize、msgFlags、msgSecurityModel
IN maxMessageSize -- 上記で決定された最大メッセージサイズ
IN securityModel -- 使用中のセキュリティモデル
IN securityEngineID -- 権威あるSNMPエンジン
IN securityName -- プリンシパル
IN securityLevel -- セキュリティレベル
IN scopedPDU -- 保護されるメッセージ
IN securityStateReference -- セキュリティ状態情報への参照
OUT securityParameters -- セキュリティモデルによって埋められる
OUT wholeMsg -- 完全に生成されたメッセージ
OUT wholeMsgLength -- 生成されたメッセージの長さ
)
-
statusInformationがエラーを示す場合、v3MPはstatusInformationをディスパッチャに返します。メッセージの処理は停止されます。
-
statusInformationが成功を示す場合、v3MPはoutgoingMessageとoutgoingMessageLengthをディスパッチャに返します。
7.2. 受信SNMPメッセージからのデータ要素の準備
このセクションでは、SNMPv3メッセージ処理モデルが受信SNMPメッセージからデータ要素を準備するときに従う手順について説明します。
この手順は、抽象サービスインターフェースprepareDataElementsを使用してディスパッチャによって呼び出されます。
手順:
-
v3MPは、受信メッセージを解析して以下のフィールドを抽出します:
- msgVersion
- msgID
- msgMaxSize
- msgFlags
- msgSecurityModel
- msgSecurityParameters
- scopedPduData
-
msgVersionが3でない場合、v3MPはディスパッチャにエラーを返します。メッセージの処理は停止されます。
-
scopedPduDataを解析できない場合、snmpInASNParseErrsカウンター [RFC3418] がインクリメントされます。v3MPはディスパッチャにエラーを返します。メッセージの処理は停止されます。
-
msgFlagsを解析して、auth、priv、およびreportableビットを抽出します。
-
authビットが0でprivビットが1の場合、これはエラーです。snmpInvalidMsgsカウンター [RFC3418] がインクリメントされます。v3MPはディスパッチャにエラーを返します。メッセージの処理は停止されます。
-
msgFlagsからsecurityLevelを決定します:
- authビット = 0 かつ privビット = 0 の場合、securityLevel = noAuthNoPriv
- authビット = 1 かつ privビット = 0 の場合、securityLevel = authNoPriv
- authビット = 1 かつ privビット = 1 の場合、securityLevel = authPriv
-
v3MPは、抽象processIncomingMsgサービスインターフェースを使用して、msgSecurityModelで識別されるセキュリティモデルを呼び出します:
statusInformation = processIncomingMsg(
IN messageProcessingModel -- この場合はSNMPv3
IN maxMessageSize -- 送信者が決定した最大メッセージサイズ
IN securityParameters -- 受信メッセージからのセキュリティパラメータ
IN securityModel -- 使用中のセキュリティモデル
IN securityLevel -- セキュリティレベル
IN wholeMsg -- メッセージ全体
IN wholeMsgLength -- メッセージ全体の長さ
OUT securityEngineID -- 権威あるSNMPエンジン
OUT securityName -- プリンシパルの識別
OUT scopedPDU -- メッセージ(平文)
OUT maxSizeResponseScopedPDU -- レスポンスPDUの最大サイズ
OUT securityStateReference -- セキュリティ状態情報への参照
)
-
statusInformationがエラーを示す場合:
a) reportableビットが1でpduTypeが確認済みクラスPDUの場合、v3MPは、usmStatsUnknownEngineIDs、usmStatsNotInTimeWindows、usmStatsUnknownUserNames、usmStatsWrongDigests、usmStatsDecryptionErrors、またはその他の適切なエラーカウンターを使用してレポートPDUを構築し、returnResponsePduサービスインターフェースを使用してディスパッチャを呼び出します。
b) v3MPはディスパッチャにエラーを返します。メッセージの処理は停止されます。
-
statusInformationが成功を示す場合:
a) scopedPDUを解析して以下を抽出します:
- contextEngineID
- contextName
- data(PDU)
b) scopedPDUを解析できない場合、snmpInASNParseErrsカウンターがインクリメントされます。v3MPはディスパッチャにエラーを返します。メッセージの処理は停止されます。
-
PDUを解析して、pduTypeおよびその他のPDU固有の情報を決定します:
a) PDUを解析できない場合、snmpInASNParseErrsカウンターがインクリメントされます。v3MPはディスパッチャにエラーを返します。メッセージの処理は停止されます。
- v3MPは、以下のデータ要素をディスパッチャに返します:
- messageProcessingModel(SNMPv3の場合は3)
- securityModel
- securityName
- securityLevel
- contextEngineID
- contextName
- pduVersion
- PDU
- pduType
- sendPduHandle(該当する場合、PDU内のrequest-idから抽出)
- maxSizeResponseScopedPDU
- statusInformation (success)
- stateReference(セキュリティモデルからのsecurityStateReference)
- 処理が完了しました。