概要
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 |
ポリシーの内部名。 管理 UI プロキシ エディタで |
なし | 必須 |
continueOnError |
ポリシーが失敗した場合にエラーを返すには、 ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、 ポリシーを無効にするには、 |
true | 省略可 |
async |
この属性は非推奨となりました。 |
false | 非推奨 |
<DisplayName> 要素
管理 UI プロキシ エディタで name
属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。
<DisplayName>Policy Display Name</DisplayName>
デフォルト |
なし この要素を省略した場合、ポリシーの |
---|---|
要否 | 省略可 |
タイプ | 文字列 |
<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>
要素値は、要素名を検証します(book
、title
、author
、year)
は 10
文字を超えない)。
<NameLimits> <Element>10</Element> <Attribute>10</Attribute> <NamespacePrefix>10</NamespacePrefix> <ProcessingInstructionTarget>10</ProcessingInstructionTarget> </NameLimits>
デフォルト: | 制限を指定しない場合、システムはデフォルト値の -1 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: | 整数 |
<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 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: | 整数 |
<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 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: | 整数 |
<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 |
要否: | 省略可 |
型: |
文字列。
|
<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 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<StructuralLimits> / <AttributeCountPerElement> 要素
要素で許可される最大属性数を指定します。
たとえば、次の XML について考えてみましょう。
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<AttributeCountPerElement>
要素値は、要素 book
、title
、author
、year
を検証します(それぞれ 2
属性を超えない)。名前空間の定義に使用される属性は対象外です。
<StructureLimits> <NodeDepth>5</NodeDepth> <AttributeCountPerElement>2</AttributeCountPerElement> <NamespaceCountPerElement>3</NamespaceCountPerElement> <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount> </StructureLimits>
デフォルト: | 制限を指定しない場合、システムはデフォルト値の -1 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<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>
要素値は、要素 e1
と e2
を検証します(それぞれ 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 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<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>
<Text>
要素値は、要素テキスト値 Learning XML
、Erik T.
Ray,
、2003
を検証します(それぞれ 15
文字を超えない)。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
デフォルト: | 制限を指定しない場合、システムはデフォルト値の -1 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<ValueLimits> / <Attribute> 要素
XML ドキュメントの属性値も文字数制限を指定します。
たとえば、次の XML について考えてみましょう。
<book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<Attribute>
要素値は、名前 WEB
を検証します(10
文字を超えない)。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
デフォルト: | 制限を指定しない場合、システムはデフォルト値の -1 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<ValueLimits> / <NamespaceURI> 要素
XML ドキュメントの名前空間 URI の文字数制限を指定します。
たとえば、次の XML について考えてみましょう。
<ns1:myelem xmlns:ns1="http://ns1.com"/>
<NamespaceURI>
要素値は、名前空間 URI 値 http://ns1.com
を検証します(10
文字を超えない)。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
デフォルト: | 制限を指定しない場合、システムはデフォルト値の -1 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<ValueLimits> / <Comment> 要素
XML ドキュメントのコメントの文字数制限を指定します。
たとえば、次の XML について考えてみましょう。
<book category="WEB"> <!-- This is a comment --> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> </book>
<Comment>
要素値は、コメントのテキスト This is a comment
を検証します(10
文字を超えない)。<ValueLimits> <Text>15</Text> <Attribute>10</Attribute> <NamespaceURI>10</NamespaceURI> <Comment>10</Comment> <ProcessingInstructionData>10</ProcessingInstructionData> </ValueLimits>
デフォルト: | 制限を指定しない場合、システムはデフォルト値の -1 を適用します。これは無制限に相当します。 |
要否: | 省略可 |
型: |
整数 |
<ValueLimits> / <ProcessingInstructionData> 要素
XML ドキュメントの処理命令テキストの文字数制限を指定します。
たとえば、次の XML について考えてみましょう。
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<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.ExecutionFailed |
500 | XMLThreatProtection ポリシーでは、さまざまな種類の ExecutionFailed エラーをスローできます。 エラーのほとんどは、ポリシーで設定された特定のしきい値を超えた場合に発生します。これらの エラーには次のようなものがあります。 要素名の長さ 子数、 ノード深度、 属性数、 属性名の長さ その他多数詳細なリストについては、XMLThreatProtection ポリシーのランタイム エラーのトラブルシューティングをご覧ください。 | build |
steps.xmlthreatprotection.InvalidXMLPayload |
500 | このエラーは、XMLThreatProtection ポリシーの <Source> 要素で指定された入力メッセージ ペイロードが有効な XML ドキュメントでない場合に発生します。 |
build |
steps.xmlthreatprotection.SourceUnavailable |
500 | このエラーは、<Source> 要素で指定された メッセージ変数が次のいずれかである場合に発生します。
|
build |
steps.xmlthreatprotection.NonMessageVariable |
500 | このエラーは、<Source> 要素がメッセージ型以外の変数に設定されている場合に発生します。 |
build |
注:
- エラー名 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 ポリシーを過ぎない場合、HTTP 500 Internal Server Error(内部サーバーエラー)のステータス コードと ExecutionFailed エラーコードがスローされます。このエラー動作を変更するには、新しい組織レベルのプロパティを使用します。組織プロパティ features.isPolicyHttpStatusEnabled
を true に設定すると、次のように動作します。
- リクエスト: リクエスト フローに脅威保護ポリシーが関連付けられている場合、無効なメッセージが 400 Bad Request(不正なリクエスト)ステータス コードと、対応するポリシー エラー コード(ExecutionFailed のみ)を返します。
- レスポンス: 脅威保護ポリシーがレスポンス フローに関連付けられている場合、無効なメッセージは 500 Internal Server Error(内部サーバーエラー)ステータス コードを返し、対応するポリシー エラー コード(ExecutionFailed のみ)のいずれかがスローされます。
Cloud をご利用のお客様は、Apigee サポートに連絡して組織プロパティの設定を依頼してください。