XMLThreatProtection 정책

이 페이지는 ApigeeApigee Hybrid에 적용됩니다.

Apigee Edge 문서 보기

정책 아이콘

제목

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

  • 제외할 특정 키워드 또는 패턴의 메시지 콘텐츠 평가
  • 메시지가 파싱되기 전에 손상되거나 잘못된 메시지 감지

이 정책은 확장 가능한 정책이며, 이 정책을 사용하면 Apigee 라이선스에 따라 비용 또는 사용률이 영향을 받을 수 있습니다. 정책 유형 및 사용 영향에 대한 자세한 내용은 정책 유형을 참조하세요.

위협 보호에 관한 짧은 동영상 보기

동영상: 개발자용 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자(영문 기준)를 초과할 수 없습니다.

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

해당 없음 필수
continueOnError

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

정책이 실패해도 흐름 실행이 계속되도록 하려면 true로 설정합니다. 관련 주제에 대한 추가 정보

false 선택사항
enabled

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

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

선택사항
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> 요소 값은 요소 이름(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>/<ProcessingInstructionTarget> 요소

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>
기본값: 해당 없음
현재 상태: 선택사항
유형: 해당 사항 없음

<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, authoryear가 각각 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 선택사항
includeElement 선택사항
includeProcessingInstructions 선택사항
includeText 선택사항

<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 XML, Erik T. Ray,, 200315자를 초과하지 않는지 확인합니다.
<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>/<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을 적용합니다.
Presence: 선택사항
유형:

정수

오류 참조

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

런타임 오류

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

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

배포 오류

없음

오류 변수

이러한 변수는 런타임 오류가 발생하면 설정됩니다. 자세한 내용은 정책 오류에 대해 알아야 할 사항을 참조하세요.

변수 각 항목의 의미는 다음과 같습니다. 예시
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를 만드는 경우의 중요 정보: 기본적으로 Apigee는 메시지가 JSON 또는 XML 위협 보호 조치 정책을 통과하지 못한 경우 HTTP 500 내부 서버 오류 상태 코드와 ExecutionFailed 오류 코드를 표시합니다. 새로운 조직 수준 속성으로 이 오류 동작을 변경할 수 있습니다. 조직 속성 features.isPolicyHttpStatusEnabled를 true로 설정하면 다음과 같은 동작이 발생합니다.

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

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

curl -u email:password -X POST -H "Content-type:application/xml" http://host:8080/v1/o/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <Environments/>
    <Properties>
        <Property name="features.isPolicyHttpStatusEnabled">true</Property>
        ...
    </Properties>
</Organization>"

관련 주제

JSON 위협 방지 정책

정규 표현식 보호 정책