XMLThreatProtection 정책

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

내용

XML 취약점을 해결하고 API의 공격을 최소화합니다. 구성된 제한 항목을 기반으로 XML 페이로드 공격을 감지하세요. 다음 접근 방식을 사용한 XML 위협 차단

  • XML 스키마(.xsd)를 기준으로 메시지 유효성 검사
  • 제외할 특정 키워드 또는 패턴의 메시지 콘텐츠 평가
  • 메시지가 파싱되기 전에 손상되거나 잘못된 메시지 감지

요소 참조

요소 참조는 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자(영문 기준)를 초과할 수 없습니다.

원하는 경우 <DisplayName> 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름을 사용하여 정책에 라벨을 지정합니다.

N/A 필수
continueOnError

정책이 실패할 경우 오류가 반환되도록 하려면 false로 설정합니다. 이는 대부분의 정책에서 예상되는 동작입니다.

정책이 실패해도 흐름 실행이 계속되도록 하려면 true로 설정합니다.

false 선택사항
enabled

정책을 시행하려면 true로 설정합니다.

정책을 중지하려면 false로 설정합니다. 정책이 흐름에 연결되어 있어도 정책이 시행되지 않습니다.

true 선택사항
async

이 속성은 지원이 중단되었습니다.

false 지원 중단됨

<DisplayName> 요소

name 속성 외에도 이 요소를 사용하여 관리 UI 프록시 편집기의 정책에 다른 자연어 이름으로 라벨을 지정합니다.

<DisplayName>Policy Display Name</DisplayName>
기본 계정

N/A

이 요소를 생략하면 정책 name 속성 값이 사용됩니다.

현재 상태 선택사항
유형 문자열

<NameLimits> 요소

정책에서 검토하고 적용할 글자 수 제한을 지정합니다.

<NameLimits>
   <Element>10</Element>
   <Attribute>10</Attribute>
   <NamespacePrefix>10</NamespacePrefix>
   <ProcessingInstructionTarget>10</ProcessingInstructionTarget>     
</NameLimits>
기본값: N/A
현재 상태: 선택사항
유형: N/A

<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을 적용합니다.
Presence: 선택사항
유형: 정수

<NameLimits>/<Attribute> 요소

XML 문서의 모든 속성 이름에 허용되는 최대 문자 수에 대한 제한을 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

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

위 XML을 분석할 때 아래 정책 스니펫의 <Attribute> 요소 값은 속성 이름 category10자를 초과하지 않는지 확인합니다.

<NameLimits>
   <Element>10</Element>
   <Attribute>10</Attribute>
   <NamespacePrefix>10</NamespacePrefix>
   <ProcessingInstructionTarget>10</ProcessingInstructionTarget>     
</NameLimits>
기본값: 제한을 지정하지 않으면 시스템은 무제한과 동일한 기본값 -1을 적용합니다.
Presence: 선택사항
유형: 정수

<NameLimits>/<NamespacePrefix> 요소

XML 문서의 네임스페이스 프리픽스에 허용되는 최대 문자 수에 대한 제한을 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

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

위 XML을 분석할 때 아래 정책 스니펫의 <NamespacePrefix> 요소 값은 네임스페이스 프리픽스 ns110자를 초과하지 않는지 확인합니다.

<NameLimits>
   <Element>10</Element>
   <Attribute>10</Attribute>
   <NamespacePrefix>10</NamespacePrefix>
   <ProcessingInstructionTarget>10</ProcessingInstructionTarget>     
</NameLimits>
기본값: 제한을 지정하지 않으면 시스템은 무제한과 동일한 기본값 -1을 적용합니다.
Presence: 선택사항
유형: 정수

<NameLimits>/<processinginstructionsTarget> 요소

XML 문서의 모든 처리 지침 대상에서 허용되는 최대 문자 수에 대한 제한을 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

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

위 XML을 분석할 때 아래 정책 스니펫의 <ProcessingInstructionTarget> 요소 값은 처리 명령 대상 xml-stylesheet10자를 초과하지 않는지 확인합니다.

<NameLimits>
   <Element>10</Element>
   <Attribute>10</Attribute>
   <NamespacePrefix>10</NamespacePrefix>
   <ProcessingInstructionTarget>10</ProcessingInstructionTarget>     
</NameLimits>
기본값: 제한을 지정하지 않으면 시스템은 무제한과 동일한 기본값 -1을 적용합니다.
Presence: 선택사항
유형: 정수

<Source> 요소

XML 페이로드 공격에 대해 검사할 메시지입니다. 클라이언트 앱에서 인바운드 요청을 검증해야 하므로, 이 요소는 request로 설정하는 것이 가장 일반적입니다. 이 요소는 message로 설정하면 요청 흐름에 연결될 때 자동으로 요청 메시지를 평가하고 응답 흐름에 연결될 때 응답 메시지를 자동으로 평가합니다.

<Source>request</Source>
기본값: 요청
Presence: 선택사항
유형:

문자열.

request, response, 또는 message 중에서 선택합니다.

<StructuralLimits> 요소

정책에서 검토하고 적용할 구조 제한을 지정합니다.

<StructureLimits>
   <NodeDepth>5</NodeDepth>
   <AttributeCountPerElement>2</AttributeCountPerElement>
   <NamespaceCountPerElement>3</NamespaceCountPerElement>
   <ChildCount includeComment="true" includeElement="true" includeProcessingInstruction="true" includeText="true">3</ChildCount>
</StructureLimits>
기본값: N/A
현재 상태: 선택사항
유형: N/A

<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을 적용합니다.
Presence: 선택사항
유형:

정수

<StructuralLimits>/<AttributeCountPerElement> 요소

모든 요소에 허용되는 최대 속성 수를 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

<book category="WEB">
   <title>Learning XML</title>
   <author>Erik T. Ray</author>
   <year>2003</year>
</book>
위의 XML을 분석할 때 아래 정책 스니펫의 <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을 적용합니다.
Presence: 선택사항
유형:

정수

<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을 적용합니다.
Presence: 선택사항
유형:

정수

<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을 적용합니다.
Presence: 선택사항
유형:

정수

특성

속성 기본 계정 Presence
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>
기본값: N/A
현재 상태: 선택사항
유형:

N/A

<ValueLimits>/<Text> 요소

XML 문서에 있는 모든 텍스트 노드의 글자 수 제한을 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

<book category="WEB">
   <title>Learning XML</title>
   <author>Erik T. Ray</author>
   <year>2003</year>
</book>
위의 XML을 분석할 때 아래 정책 스니펫의 <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을 적용합니다.
Presence: 선택사항
유형:

정수

<ValueLimits>/<Attribute> 요소

XML 문서에 있는 모든 속성 값의 글자 수 제한을 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

<book category="WEB">
   <title>Learning XML</title>
   <author>Erik T. Ray</author>
   <year>2003</year>
</book>
위의 XML을 분석할 때 아래 정책 스니펫의 <Attribute> 요소 값은 속성 값 WEB10자를 초과하지 않는지 확인합니다.
<ValueLimits>
   <Text>15</Text>
   <Attribute>10</Attribute>
   <NamespaceURI>10</NamespaceURI>
   <Comment>10</Comment>
   <ProcessingInstructionData>10</ProcessingInstructionData>
</ValueLimits>
기본값: 제한을 지정하지 않으면 시스템은 무제한과 동일한 기본값 -1을 적용합니다.
Presence: 선택사항
유형:

정수

<ValueLimits>/<NamespaceURI> 요소

XML 문서에 있는 네임스페이스 URI의 글자 수 제한을 지정합니다.

예를 들어 다음 XML을 고려해 보세요.

<ns1:myelem xmlns:ns1="http://ns1.com"/>
위의 XML을 분석할 때 아래 정책 스니펫의 <NamespaceURI> 요소 값은 네임스페이스 URI 값 http://ns1.com10자를 초과하지 않는지 확인합니다.
<ValueLimits>
   <Text>15</Text>
   <Attribute>10</Attribute>
   <NamespaceURI>10</NamespaceURI>
   <Comment>10</Comment>
   <ProcessingInstructionData>10</ProcessingInstructionData>
</ValueLimits>
기본값: 제한을 지정하지 않으면 시스템은 무제한과 동일한 기본값 -1을 적용합니다.
Presence: 선택사항
유형:

정수

<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 comment10자를 초과하지 않는지 확인합니다.
<ValueLimits>
   <Text>15</Text>
   <Attribute>10</Attribute>
   <NamespaceURI>10</NamespaceURI>
   <Comment>10</Comment>
   <ProcessingInstructionData>10</ProcessingInstructionData>
</ValueLimits>
기본값: 제한을 지정하지 않으면 시스템은 무제한과 동일한 기본값 -1을 적용합니다.
Presence: 선택사항
유형:

정수

<ValueLimits>/<processinginstructionsData> 요소

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을 적용합니다.
Presence: 선택사항
유형:

정수

오류 참조

이 섹션에서는 반환되는 오류 코드, 오류 메시지, 정책이 오류를 트리거할 때 Edge에서 설정하는 오류 변수를 설명합니다. 오류를 처리하기 위해 오류 규칙을 개발 중인 경우, 이 정보는 중요합니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항오류 처리를 참조하세요.

런타임 오류

이러한 오류는 정책이 실행될 때 발생할 수 있습니다.

오류 코드 HTTP 상태 원인 수정
steps.xmlthreatprotection.ExecutionFailed 500 XMLThreatProtection 정책은 다양한 유형의 ExecutionFailed 오류를 발생시킬 수 있습니다. 이러한 오류의 대부분은 정책에 설정된 특정 임계값을 초과할 때 발생합니다. 이러한 오류의 유형에는 요소 이름 길이, 하위 요소 수, 노드 깊이, 속성 수, 속성 이름 길이 등이 포함됩니다. XMLThreatProtection 정책 런타임 오류 문제 해결 주제에서 전체 목록을 확인할 수 있습니다.
steps.xmlthreatprotection.InvalidXMLPayload 500 이 오류는 XMLThreatProtection 정책의 <Source> 요소에서 지정된 입력 메시지 페이로드가 유효한 XML 문서가 아닌 경우에 발생합니다.
steps.xmlthreatprotection.SourceUnavailable 500 이 오류는 <Source> 요소에 지정된 message 변수가 다음 중 하나일 때 발생합니다.
  • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
  • 유효한 값 request, response 또는 message 중 하나가 아님
steps.xmlthreatprotection.NonMessageVariable 500 이 오류는 <Source> 요소가 message 유형이 아닌 변수로 설정된 경우 발생합니다.

참고:

  • 오류 이름 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 문서가 있으면 서버가 사용가능한 것보다 많은 메모리를 할당하게 하여, CPU 및 메모리 리소스를 연결하고, 파서가 다운되고, 일반적으로 메시지 처리를 일반적으로 애플리케이션 수준의 서비스 거부 공격이 발생할 수 있습니다.

위협 방지 오류 구성

이 정책에 FaultRules를 만들 때 필요한 정보: 기본적으로 Edge는 메시지가 JSON 또는 XML 위협 방지 정책을 통과하지 못하면 HTTP 500 내부 서버 오류 상태 코드와 ExecutionFailed 오류 코드를 발생시킵니다. 새로운 조직 수준 속성으로 이 오류 동작을 변경할 수 있습니다. 조직 속성 features.isPolicyHttpStatusEnabled를 true로 설정하면 다음과 같은 동작이 발생합니다.

  • 요청: 위협 방지 정책이 모든 요청 흐름에 연결되어 잘못된 메시지는 ExecutionFailed뿐 아니라 해당 정책 오류 코드와 함께 400 잘못된 요청 상태 코드를 반환합니다.
  • 응답: 위협 방지 정책이 모든 응답 흐름에 연결되어 잘못된 메시지는 여전히 500 내부 서버 오류 상태 코드를 반환하고 ExecutionFailed뿐 아니라 해당하는 정책 오류 코드 중 하나를 반환합니다.

클라우드 고객은 Apigee Edge 지원팀에 문의하여 조직 속성을 설정해야 합니다.

관련 주제

JSON 위협 방지 정책

정규 표현식 보호 정책