XMLThreatProtection ポリシー

概要

XML の脆弱性を解決し、API に対する攻撃を最小限に抑えます。また、構成済みの制限に基づいて、XML ペイロードによる攻撃を検出します。XML の脅威を次の方法でスクリーニングします。

  • XML スキーマ(.xsd)と比較してメッセージを検証する
  • ブラックリストのキーワードまたはパターンに一致するコンテンツがないかどうかメッセージを評価する
  • メッセージの解析前に、破損したメッセージや不正な形式のメッセージを検出する

セキュリティ対策についての短い動画を見る

動画: デベロッパー向けの 4 分動画(4MV4D)シリーズの脅威対策ポリシーに関する短い動画をご覧ください。

要素リファレンス

この要素リファレンスでは、XMLThreatProtection ポリシーの要素と属性について説明します。

    <XMLThreatProtection async="false" continueOnError="false" enabled="true" name="XML-Threat-Protection-1">
       <DisplayName>XML Threat Protection 1</DisplayName>
       <NameLimits>
          <Element>10</Element>
          <Attribute>10</Attribute>
          <NamespacePrefix>10</NamespacePrefix>
          <ProcessingInstructionTarget>10</ProcessingInstructionTarget>
       </NameLimits>
       <Source>request</Source>
       <StructureLimits>
          <NodeDepth>5</NodeDepth>
          <AttributeCountPerElement>2</AttributeCountPerElement>
          <NamespaceCountPerElement>3</NamespaceCountPerElement>
          <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
       </StructureLimits>
       <ValueLimits>
          <Text>15</Text>
          <Attribute>10</Attribute>
          <NamespaceURI>10</NamespaceURI>
          <Comment>10</Comment>
          <ProcessingInstructionData>10</ProcessingInstructionData>
       </ValueLimits>
    </XMLThreatProtection>
    

<XMLThreatProtection> 属性

    <XMLThreatProtection async="false" continueOnError="false" enabled="true" name="XML-Threat-Protection-1">
    

次の表に、ポリシーのすべての親要素に共通の属性を記載します。

属性 説明 デフォルト 要否
name

ポリシーの内部名。name 属性の値には、文字、数字、スペース、ハイフン、アンダースコア、ピリオドを使用できます。255 文字を超える値を指定することはできません。

必要に応じて、管理 UI プロキシ エディタで <DisplayName> 要素を使用してポリシーに別のわかりやすい名前でラベルを付けます。

なし 必須
continueOnError

ポリシーが失敗した場合にエラーを返すには、false に設定します。これはほとんどのポリシーで想定される動作です。

ポリシーが失敗してもフロー実行を続行するには、true に設定します。

false 省略可
enabled

ポリシーを適用するには true に設定します。

ポリシーを無効にするには false に設定します。その場合、ポリシーはフローに接続されていているとしても適用されません。

true 省略可
async

この属性は非推奨となりました。

false 非推奨

<DisplayName> 要素

name 属性に加えて、管理 UI プロキシ エディタのポリシーに別のわかりやすい名前でラベルを付けるために使います。

<DisplayName>Policy Display Name</DisplayName>
デフォルト:

なし

この要素を省略した場合、ポリシーの name 属性の値が使用されます

要否: 省略可
型: 文字列

<NameLimits> 要素

ポリシーで確認して適用する文字数制限を指定します。

    <NameLimits>
       <Element>10</Element>
       <Attribute>10</Attribute>
       <NamespacePrefix>10</NamespacePrefix>
       <ProcessingInstructionTarget>10</ProcessingInstructionTarget>
    </NameLimits>
    
デフォルト: なし
必須?: 省略可
型: なし

<NameLimits> / <Element> 要素

XML ドキュメントの要素名に許可する最大文字数を指定します。

たとえば、次の XML について考えてみましょう。

    <book category="WEB">
       <title>Learning XML</title>
       <author>Erik T. Ray</author>
       <year>2003</year>
    </book>
    

上の XML を分析するときに、以下のポリシーの <Element> 要素値により、要素名(booktitleauthoryear)10 文字を超えていないかどうか検証されます。

    <NameLimits>
       <Element>10</Element>
       <Attribute>10</Attribute>
       <NamespacePrefix>10</NamespacePrefix>
       <ProcessingInstructionTarget>10</ProcessingInstructionTarget>
    </NameLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型: Integer

<NameLimits> / <Attribute> 要素

XML ドキュメントの属性名に許可する最大文字数を指定します。

たとえば、次の XML について考えてみましょう。

    <book category="WEB">
       <title>Learning XML</title>
       <author>Erik T. Ray</author>
       <year>2003</year>
    </book>
    

上の XML を分析するときに、以下のポリシーの <Attribute> 要素値により、属性名(category)が 10 文字を超えていないかどうか検証されます。

    <NameLimits>
       <Element>10</Element>
       <Attribute>10</Attribute>
       <NamespacePrefix>10</NamespacePrefix>
       <ProcessingInstructionTarget>10</ProcessingInstructionTarget>
    </NameLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型: Integer

<NameLimits> / <NamespacePrefix> 要素

XML ドキュメントの名前空間プレフィックスに許可する最大文字数を指定します。

たとえば、次の XML について考えてみましょう。

    <ns1:myelem xmlns:ns1="http://ns1.com"/>
    

上の XML を分析するときに、以下のポリシーの <NamespacePrefix> 要素値により、名前空間プレフィックス(ns1)が 10 文字を超えていないかどうか検証されます。

    <NameLimits>
       <Element>10</Element>
       <Attribute>10</Attribute>
       <NamespacePrefix>10</NamespacePrefix>
       <ProcessingInstructionTarget>10</ProcessingInstructionTarget>
    </NameLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型: Integer

<NameLimits> / <ProcessingInstructionTarget> 要素

XML ドキュメントの処理命令のターゲットに許可される最大文字数を指定します。

たとえば、次の XML について考えてみましょう。

    <?xml-stylesheet type="text/xsl" href="style.xsl"?>
    

上の XML を分析するときに、以下のポリシーの <ProcessingInstructionTarget> 要素値により、処理命令のターゲット(xml-stylesheet)が 10 文字を超えていないかどうか検証されます。

    <NameLimits>
       <Element>10</Element>
       <Attribute>10</Attribute>
       <NamespacePrefix>10</NamespacePrefix>
       <ProcessingInstructionTarget>10</ProcessingInstructionTarget>
    </NameLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型: 整数

<Source> 要素

XML ペイロード攻撃に対してスクリーニングされるメッセージ。通常、クライアント アプリからの内向きのリクエストを検証する必要があるため、request に設定するのが最も一般的です。message に設定した場合、この要素は、リクエスト フローに付加されたときにはリクエスト メッセージを自動的に評価し、レスポンス フローに付加されたときにはレスポンス メッセージを自動的に評価します。

    <Source>request</Source>
    
デフォルト: request
要否: 省略可
型:

String。

requestresponse または message を選択します。

<StructuralLimits> 要素

ポリシーで確認し、適用する構造上の制限を指定します。

    <StructureLimits>
       <NodeDepth>5</NodeDepth>
       <AttributeCountPerElement>2</AttributeCountPerElement>
       <NamespaceCountPerElement>3</NamespaceCountPerElement>
       <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
    </StructureLimits>
    
デフォルト: なし
必須?: 省略可
型: なし

<StructuralLimits> / <NodeDepth> 要素

XML で許可される最大ノード深度を指定します。

    <StructureLimits>
       <NodeDepth>5</NodeDepth>
       <AttributeCountPerElement>2</AttributeCountPerElement>
       <NamespaceCountPerElement>3</NamespaceCountPerElement>
       <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
    </StructureLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<StructuralLimits> / <AttributeCountPerElement> 要素

要素で許可される最大属性数を指定します。

たとえば、次の XML について考えてみましょう。

    <book category="WEB">
       <title>Learning XML</title>
       <author>Erik T. Ray</author>
       <year>2003</year>
    </book>
    
上の XML を分析するときに、以下のポリシーの <AttributeCountPerElement> 要素値により、要素(booktitleauthoryear)の属性数がそれぞれ 2 を超えていないかどうか検証されます。名前空間の定義に使用される属性は対象外です。
    <StructureLimits>
       <NodeDepth>5</NodeDepth>
       <AttributeCountPerElement>2</AttributeCountPerElement>
       <NamespaceCountPerElement>3</NamespaceCountPerElement>
       <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
    </StructureLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<StructuralLimits> / <NameSpaceCountPerElement> 要素

要素で許可される名前空間定義の最大数を指定します。

たとえば、次の XML について考えてみましょう。

    <e1 attr1="val1" attr2="val2">
        <e2 xmlns="http://apigee.com" xmlns:yahoo="http://yahoo.com" one="1" yahoo:two="2"/>
    </e1>
    

上の XML を分析するときに、以下のポリシーの <NamespaceCountPerElement> 要素値により、要素(e1e2)の名前空間の定義がそれぞれ 2 を超えていないかどうか検証されます。この場合、<e1> の名前空間定義が 0 個で、<e2> の名前空間定義が 2 個(xmlns="http://apigee.com"xmlns:yahoo="http://yahoo.com")です。

    <StructureLimits>
       <NodeDepth>5</NodeDepth>
       <AttributeCountPerElement>2</AttributeCountPerElement>
       <NamespaceCountPerElement>3</NamespaceCountPerElement>
       <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
    </StructureLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<StructuralLimits> / <ChildCount> 要素

要素で許可される子要素の最大数を指定します。

    <StructureLimits>
       <NodeDepth>5</NodeDepth>
       <AttributeCountPerElement>2</AttributeCountPerElement>
       <NamespaceCountPerElement>3</NamespaceCountPerElement>
       <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
    </StructureLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

整数

属性

属性 デフォルト 要否
includeComment true 省略可
includeElement true 省略可
includeProcessingInstructions true 省略可
includeText true 省略可

<ValueLimits> 要素

ポリシーで確認して適用する値の文字数制限を指定します。

    <ValueLimits>
       <Text>15</Text>
       <Attribute>10</Attribute>
       <NamespaceURI>10</NamespaceURI>
       <Comment>10</Comment>
       <ProcessingInstructionData>10</ProcessingInstructionData>
    </ValueLimits>
    
デフォルト: なし
必須?: 省略可
型:

なし

<ValueLimits> / <Text> 要素

XML ドキュメントのテキストノードの文字数制限を指定します。

たとえば、次の XML について考えてみましょう。

    <book category="WEB">
       <title>Learning XML</title>
       <author>Erik T. Ray</author>
       <year>2003</year>
    </book>
    
上の XML を分析するときに、以下のポリシーの <Text> 要素値により、要素テキスト値(Learning XMLErik T. Ray,2003)それぞれが 15 文字を超えていないかどうか検証されます。
    <ValueLimits>
       <Text>15</Text>
       <Attribute>10</Attribute>
       <NamespaceURI>10</NamespaceURI>
       <Comment>10</Comment>
       <ProcessingInstructionData>10</ProcessingInstructionData>
    </ValueLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<ValueLimits> / <Attribute> 要素

XML ドキュメントの属性値も文字数制限を指定します。

たとえば、次の XML について考えてみましょう。

    <book category="WEB">
       <title>Learning XML</title>
       <author>Erik T. Ray</author>
       <year>2003</year>
    </book>
    
上の XML を分析するときに、以下のポリシーの <Attribute> 要素値により、属性値(WEB)が 10 文字を超えていないかどうか検証されます。
    <ValueLimits>
       <Text>15</Text>
       <Attribute>10</Attribute>
       <NamespaceURI>10</NamespaceURI>
       <Comment>10</Comment>
       <ProcessingInstructionData>10</ProcessingInstructionData>
    </ValueLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<ValueLimits> / <NamespaceURI> 要素

XML ドキュメントの名前空間 URI の文字数制限を指定します。

たとえば、次の XML について考えてみましょう。

    <ns1:myelem xmlns:ns1="http://ns1.com"/>
    
上の XML を分析するときに、以下のポリシーの <NamespaceURI> 要素値により、名前空間 URI 値(http://ns1.com)が 10 文字を超えていないかどうか検証されます。
    <ValueLimits>
       <Text>15</Text>
       <Attribute>10</Attribute>
       <NamespaceURI>10</NamespaceURI>
       <Comment>10</Comment>
       <ProcessingInstructionData>10</ProcessingInstructionData>
    </ValueLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<ValueLimits> / <Comment> 要素

XML ドキュメントのコメントの文字数制限を指定します。

たとえば、次の XML について考えてみましょう。

    <book category="WEB">
       <!-- This is a comment -->
       <title>Learning XML</title>
       <author>Erik T. Ray</author>
       <year>2003</year>
    </book>
    
上の XML を分析するときに、以下のポリシーの <Comment> 要素値により、コメント テキスト(This is a comment)が 10 文字を超えていないかどうか検証されます。
    <ValueLimits>
       <Text>15</Text>
       <Attribute>10</Attribute>
       <NamespaceURI>10</NamespaceURI>
       <Comment>10</Comment>
       <ProcessingInstructionData>10</ProcessingInstructionData>
    </ValueLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

Integer

<ValueLimits> / <ProcessingInstructionData> 要素

XML ドキュメントの処理命令テキストの文字数制限を指定します。

たとえば、次の XML について考えてみましょう。

    <?xml-stylesheet type="text/xsl" href="style.xsl"?>
    
上の XML を分析するときに、以下のポリシーの <ProcessingInstructionData> 要素値により、処理命令テキスト(type="text/xsl" href="style.xsl")が 10 文字を超えていないかどうか検証されます。
    <ValueLimits>
       <Text>15</Text>
       <Attribute>10</Attribute>
       <NamespaceURI>10</NamespaceURI>
       <Comment>10</Comment>
       <ProcessingInstructionData>10</ProcessingInstructionData>
    </ValueLimits>
    
デフォルト: 制限を指定しないと、デフォルト値の -1 が適用されます。これは、制限なしと同等です。
要否: 省略可
型:

整数

エラー リファレンス

このセクションでは、このポリシーでエラーが発生したときに返される障害コードとエラー メッセージ、Edge によって設定される障害変数について説明します。これは、障害を処理するルールを作成する際に重要な情報となります。詳細については、ポリシーエラーについて知っておくべきこと障害の処理をご覧ください。

ランタイム エラー

ポリシーの実行時に次のエラーが発生することがあります。

* 障害コード 障害文字列 * HTTP ステータス 原因
steps.xmlthreatprotection.AttrCountExceeded XMLThreatProtection stepDefinition {0}: Attribute count exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.AttrNameExceeded XMLThreatProtection stepDefinition {0}: Attribute name length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.AttrValueExceeded XMLThreatProtection stepDefinition {0}: Attribute value length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.ChildCountExceeded XMLThreatProtection stepDefinition {0}: Children count exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.CommentExceeded XMLThreatProtection stepDefinition {0}: Comment length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.ElemNameExceeded XMLThreatProtection stepDefinition {0}: Element name length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.ExecutionFailed XMLThreatProtection stepDefinition {0}: Execution failed. reason: {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.NodeDepthExceeded XMLThreatProtection stepDefinition {0}: Node depth exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.NonMessageVariable Variable {0} does not resolve to a Message 500 障害文字列をご覧ください。
steps.xmlthreatprotection.NSCountExceeded XMLThreatProtection stepDefinition {0}: Namespace count exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.NSPrefixExceeded XMLThreatProtection stepDefinition {0}: Namespace prefix length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.NSURIExceeded XMLThreatProtection stepDefinition {0}: Namespace uri length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.PIDataExceeded XMLThreatProtection stepDefinition {0}: Processing Instruction data length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.PITargetExceeded XMLThreatProtection stepDefinition {0}: Processing Instruction target length exceeded {1} 500 障害文字列をご覧ください。
steps.xmlthreatprotection.SourceUnavailable XMLThreatProtection stepDefinition {0}: Source {1} is not available 500 障害文字列をご覧ください。
steps.xmlthreatprotection.TextExceeded XMLThreatProtection stepDefinition {0}: Text length exceeded {1} 500 障害文字列をご覧ください。

* 注:

  • デフォルトのエラー名は ExecutionFailed です。検出されたエラーの種類に関係なく、このエラーが返されます。ただし、組織レベルのプロパティを設定すると、このデフォルト名を変更できます。このプロパティを設定すると、実際のエラーを反映した名前が使用されます。たとえば、TextExceeded や AttrValueExceeded などが使用されます。詳しくは、「使用上の注意」をご覧ください。
  • 500 HTTP ステータスがデフォルトですが、組織レベルのプロパティを設定すると、リクエスト フローエラーの HTTP ステータスを 400 に変更できます。詳しくは、「使用上の注意」をご覧ください。

デプロイエラー

なし

障害変数

ランタイム エラーが発生すると、次の変数が設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。

変数 説明
fault.name="fault_name" fault_name は障害名です。詳しくは、上のランタイム エラーの表をご覧ください。障害コードの最後の部分が障害名になります。 fault.name Matches "SourceUnavailable"
xmlattack.policy_name.failed policy_name は、障害が発生したユーザー指定のポリシー名です。 xmlattack.XPT-SecureRequest.failed = true

エラー レスポンスの例

    {
      "fault": {
        "faultstring": "XMLThreatProtection[XPT-SecureRequest]: Execution failed. reason: XMLThreatProtection[XTP-SecureRequest]: Exceeded object entry name length at line 2",
        "detail": {
          "errorcode": "steps.xmlthreatprotection.ExecutionFailed"
        }
      }
    }
    

障害ルールの例

    <FaultRule name="XML Threat Protection Policy Faults">
        <Step>
            <Name>AM-CustomErrorResponse</Name>
            <Condition>(fault.name Matches "ExecutionFailed") </Condition>
        </Step>
        <Condition>(xmlattack.XPT-SecureRequest.failed = true) </Condition>
    </FaultRule>
    

スキーマ

使用上の注意

意図的なものかどうかは関係なく、オンライン データを受信するサーバーは攻撃を受ける可能性があります。XML の柔軟性に目を付け、無効なドキュメントを作成してバックエンド システムへの侵入を試みる攻撃も発生しています。破損している XML ドキュメントや非常に複雑な XML ドキュメントにより、サーバーの負荷が増大し、CPU やメモリリソースの不足により、パーサーがクラッシュする可能性があります。また、メッセージ処理が不能になり、アプリケーション レベルでのサービス拒否状態になる可能性もあります。

脅威対策のエラー構成

このポリシーに FaultRules を作成する場合に重要な情報: メッセージが JSON または XML の Threat Protection ポリシーを通過しなかった場合、デフォルトでは、Edge は HTTP 500(内部サーバーエラー)のステータス コードと ExecutionFailed エラーコードを返します。このエラー動作を変更するには、新しい組織レベルのプロパティを使用します。組織プロパティ features.isPolicyHttpStatusEnabled を true にすると、次の処理が行われます。

  • リクエスト: リクエスト フローに追加した Threat Protection ポリシーにより、無効なメッセージが検出されると、400 Bad Request ステータス コードが返されます。さらに、ExecutionFailed 以外にも、該当するポリシー エラーコードが返されます。
  • レスポンス: レスポンス フローに追加した Threat Protection ポリシーにより、無効なメッセージが検出されると、500 Internal Server Error ステータス コードが返されます。さらに、ExecutionFailed 以外にも、該当するいずれかのポリシー エラーコードが返されます。

Cloud をご利用のお客様は、Apigee サポートにお問い合わせして組織のプロパティを設定できます。

関連トピック

JSON Threat Protection ポリシー

Regular Expression Protection ポリシー