Share via


Web Application Firewall 제외 목록

Azure Application Gateway WAF(Web Application Firewall)는 웹 애플리케이션을 보호합니다. 이 문서에서는 WAF 제외 목록의 구성에 대해 설명합니다. 이러한 설정은 Application Gateway와 연결된 WAF 정책에 있습니다. WAF 정책에 관한 자세한 내용은 Azure Application Gateway의 Azure Web Application FirewallApplication Gateway용 Web Application Firewall 정책 만들기를 참조하세요.

경우에 따라 WAF에서 애플리케이션에 허용하려는 요청을 차단할 수 있습니다. WAF 제외 목록을 통해 WAF 평가에서 특정 요청 특성을 생략할 수 있습니다. 나머지 요청은 정상으로 평가됩니다.

예를 들어 Active Directory가 인증에 사용되는 토큰을 삽입합니다. 요청 헤더에 사용되는 경우 이러한 토큰에는 WAF 규칙에서 가양성 탐지를 트리거할 수 있는 특수 문자가 포함될 수 있습니다. 헤더를 제외 목록에 추가하여 헤더를 무시하도록 WAF를 구성할 수 있지만 WAF는 여전히 나머지 요청을 평가합니다.

특정 WAF 규칙이 평가될 때 적용하거나 모든 WAF 규칙 평가에 전역적으로 적용하도록 제외를 구성할 수 있습니다. 제외 규칙은 전체 웹 애플리케이션에 적용됩니다.

제외할 요청 특성 식별

WAF 제외를 구성하는 경우 WAF 평가에서 제외해야 하는 요청의 특성을 지정해야 합니다. WAF 제외는 다음 요청 특성에 대해 구성할 수 있습니다.

  • 요청 헤더
  • 요청 쿠키
  • 요청 특성 이름(인수)은 다음과 같이 제외 요소로 추가할 수 있습니다.
    • 양식 필드 이름
    • JSON 엔터티
    • URL 쿼리 문자열 인수

정확히 일치하는 요청 헤더, 본문, 쿠키 또는 쿼리 문자열 특성을 지정할 수 있습니다. 또는 부분 일치를 지정할 수 있습니다. 다음 연산자를 사용하여 제외를 구성합니다.

  • Equals: 정확한 일치에 사용됩니다. 예를 들어 bearerToken이라는 헤더를 선택하는 경우 선택기가 bearerToken으로 설정된 equals 연산자를 사용합니다.
  • starts with: 이 연산자는 지정된 선택기 값으로 시작하는 모든 필드와 일치합니다.
  • Ends with: 이 연산자는 지정된 선택기 값으로 끝나는 모든 요청 필드와 일치합니다.
  • contains: 이 연산자는 지정된 선택기 값을 포함하는 모든 요청 필드와 일치합니다.
  • Equals any: 이 연산자는 모든 요청 필드와 일치합니다. *는 선택기 값이 됩니다. 예를 들어 지정된 일치 변수의 정확한 값을 알지 못하지만 요청 트래픽이 규칙 평가에서 계속 제외되도록 하려는 경우 이 연산자를 사용합니다.

제외를 처리할 때 WAF 엔진은 아래 표를 기반으로 대/소문자 구분/구분 안 함 일치를 수행합니다. 또한 선택기와 XML 요청 본문이 지원되지 않으므로 정규식은 허용되지 않습니다.

요청 본문 부분 CRS 3.1 이하 CRS 3.2 이상
헤더* 대/소문자 구분 안 함 대/소문자 구분 안 함
쿠키* 대/소문자 구분 안 함 대/소문자 구분
쿼리 문자열* 대/소문자 구분 안 함 대/소문자 구분
URL로 인코딩된 본문 대/소문자 구분 안 함 대/소문자 구분
JSON 본문 대/소문자 구분 안 함 대/소문자 구분
XML 본문 지원되지 않음 지원되지 않음
다중 부분 본문 대/소문자 구분 안 함 대/소문자 구분

*애플리케이션에 따라 헤더, 쿠키 및 쿼리 인수의 이름과 값은 대/소문자를 구분하거나 구분하지 않을 수 있습니다.

참고 항목

자세한 내용과 문제 해결 도움말은 WAF 문제 해결을 참조하세요.

키 및 값별 특성 요청

제외를 구성하는 경우 WAF 평가에서 키 또는 값을 제외할지 여부를 결정해야 합니다.

예를 들어 요청에 다음 헤더가 포함되어 있다고 가정합니다.

My-Header: 1=1

헤더(1=1)의 값은 WAF에서 공격으로 탐지될 수 있습니다. 그러나 이 값이 시나리오에 적합한 값이라는 것을 알고 있는 경우 헤더의 에 대한 제외를 구성할 수 있습니다. 이를 수행하려면 RequestHeaderValues 일치 변수, 연산자 포함 및 선택기(My-Header)를 사용합니다. 이 구성은 헤더 My-Header에 대한 모든 값의 평가를 중지합니다.

참고 항목

키 및 값별 요청 특성은 CRS 3.2 이상 및 Bot Manager 1.0 이상에서만 사용할 수 있습니다.

이름별 요청 특성은 값별 요청 특성과 동일한 방식으로 작동하며, CRS 3.1 및 이전 버전과의 호환성을 위해 포함되었습니다. 이름별 특성 대신 값별 요청 특성을 사용하는 것이 좋습니다. 예를 들어 RequestHeaderNames 대신 RequestHeaderValues를 사용합니다.

반대로 WAF에서 헤더의 이름(My-Header)을 공격으로 탐지하는 경우 RequestHeaderKeys 요청 특성을 사용하여 헤더 key에 대한 제외를 구성할 수 있습니다. RequestHeaderKeys 특성은 CRS 3.2 이상 및 Bot Manager 1.0 이상에서만 사용할 수 있습니다.

요청 특성 예

아래 표는 특정 일치 변수에 대한 제외를 구성하는 방법에 대한 몇 가지 예를 보여 줍니다.

제외할 특성 matchVariable selectorMatchOperator 예 선택기 예제 요청 제외되는 항목
쿼리 문자열 RequestArgKeys 같음 /etc/passwd URI: http://localhost:8080/?/etc/passwd=test /etc/passwd
쿼리 문자열 RequestArgKeys EqualsAny 해당 없음 URI: http://localhost:8080/?/etc/passwd=test&.htaccess=test2 /etc/passwd.htaccess
쿼리 문자열 RequestArgNames 같음 text URI: http://localhost:8080/?text=/etc/passwd /etc/passwd
쿼리 문자열 RequestArgNames EqualsAny 해당 없음 URI: http://localhost:8080/?text=/etc/passwd&text2=.cshrc /etc/passwd.cshrc
쿼리 문자열 RequestArgValues 같음 text URI: http://localhost:8080/?text=/etc/passwd /etc/passwd
쿼리 문자열 RequestArgValues EqualsAny 해당 없음 URI: http://localhost:8080/?text=/etc/passwd&text2=.cshrc /etc/passwd.cshrc
요청 본문 RequestArgKeys 포함 sleep 요청 본문: {"sleep(5)": "test"} sleep(5)
요청 본문 RequestArgKeys EqualsAny 해당 없음 요청 본문: {".zshrc": "value", "sleep(5)":"value2"} .zshrcsleep(5)
요청 본문 RequestArgNames 같음 test 요청 본문: {"test": ".zshrc"} .zshrc
요청 본문 RequestArgNames EqualsAny 해당 없음 요청 본문: {"key1": ".zshrc", "key2":"sleep(5)"} .zshrcsleep(5)
요청 본문 RequestArgValues 같음 test 요청 본문: {"test": ".zshrc"} .zshrc
요청 본문 RequestArgValues EqualsAny 해당 없음 요청 본문: {"key1": ".zshrc", "key2":"sleep(5)"} .zshrcsleep(5)
헤더 RequestHeaderKeys 같음 X-Scanner 헤더: {"X-Scanner": "test"} X-scanner
헤더 RequestHeaderKeys EqualsAny 해당 없음 헤더: {"X-Scanner": "test", "x-ratproxy-loop": "value"} X-Scannerx-ratproxy-loop
헤더 RequestHeaderNames 같음 head1 헤더: {"head1": "X-Scanner"} X-scanner
헤더 RequestHeaderNames EqualsAny 해당 없음 헤더: {"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234(hydra)
헤더 RequestHeaderValues 같음 head1 헤더: {"head1": "X-Scanner"} X-scanner
헤더 RequestHeaderValues EqualsAny 해당 없음 헤더: {"head1": "myvar=1234", "User-Agent": "(hydra)"} myvar=1234(hydra)
쿠키 RequestCookieKeys 포함 /etc/passwd 헤더: {"Cookie": "/etc/passwdtest=hello1"} /etc/passwdtest
쿠키 RequestCookieKeys EqualsAny 해당 없음 헤더: {"Cookie": "/etc/passwdtest=hello1", "Cookie": ".htaccess=test1"} /etc/passwdtest.htaccess
쿠키 RequestCookieNames 같음 arg1 헤더: {"Cookie": "arg1=/etc/passwd"} /etc/passwd
쿠키 RequestCookieNames EqualsAny 해당 없음 헤더: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd.cshrc
쿠키 RequestCookieValues 같음 arg1 헤더: {"Cookie": "arg1=/etc/passwd"} /etc/passwd
쿠키 RequestCookieValues EqualsAny 해당 없음 헤더: {"Cookie": "arg1=/etc/passwd", "Cookie": "arg1=.cshrc"} /etc/passwd.cshrc

참고 항목

selectorMatchOperator EqualsAny를 사용하여 제외를 만드는 경우 제외를 만들 때 선택기 필드에 배치한 모든 항목이 백 엔드에 의해 "*"로 변환됩니다.

제외 범위

특정 WAF 규칙 집합, 규칙 집합 또는 전역적으로 모든 규칙에 적용되는 제외를 구성할 수 있습니다.

공격자가 시스템을 악용할 수 있는 공간을 실수로 남기지 않도록 가능한 한 매우 제한적이고 구체적인 제외를 만드는 것이 좋습니다. 제외 규칙을 추가해야 하는 경우 가능하면 규칙별 제외를 사용합니다.

규칙별 제외

특정 규칙, 규칙 그룹 또는 규칙 집합에 대한 제외를 구성할 수 있습니다. 제외가 적용되는 규칙을 지정해야 합니다. 또한 WAF 평가에서 제외해야 하는 요청 특성을 지정해야 합니다. 전체 규칙 그룹을 제외하려면 ruleGroupName 매개 변수만 제공합니다. rules 매개 변수는 제외를 그룹의 특정 규칙으로 제한하려는 경우에만 유용합니다.

규칙별 제외는 OWASP(CRS) 규칙 집합 버전 3.2 이상 또는 Bot Manager 규칙 집합 버전 1.0 이상 사용 시 사용할 수 있습니다.

예시

WAF에서 User-Agent 요청 헤더의 값을 무시해야 한다고 가정합니다. User-Agent 헤더에는 네트워크 프로토콜 피어에서 요청하는 소프트웨어 사용자 에이전트의 애플리케이션 유형, 운영 체제, 소프트웨어 공급업체 또는 소프트웨어 버전을 식별할 수 있도록 하는 특성 문자열이 포함됩니다. 자세한 내용은 User-Agent를 참조하세요.

이 헤더 평가를 사용하지 않는 데는 다양한 이유가 있을 수 있습니다. WAF에서 탐지하고 악의적이라고 가정하는 문자열이 있을 수 있습니다. 예를 들어 User-Agent 헤더의 문자열에는 x=x라는 클래식 SQL 삽입 공격이 포함될 수 있습니다. 경우에 따라 적합한 트래픽일 수 있습니다. 따라서 WAF 평가에서 이 헤더를 제외해야 할 수 있습니다.

다음 방법을 사용하여 모든 SQL 삽입 규칙에 따라 평가에서 User-Agent 헤더를 제외할 수 있습니다.

Azure Portal을 사용하여 규칙별 제외를 구성하려면 다음 단계를 수행합니다.

  1. WAF 정책으로 이동하고 관리되는 규칙을 선택합니다.

  2. 제외 추가를 선택합니다.

    Screenshot of the Azure portal that shows how to add a new per-rule exclusion for the W A F policy.

  3. 적용 대상에서 제외를 적용할 CRS 규칙 집합(예: OWASP_3.2)을 선택합니다.

    Screenshot of the Azure portal that shows the per-rule exclusion configuration for the W A F policy.

  4. 규칙 추가를 선택하고 제외를 적용할 규칙을 선택합니다.

  5. 일치 변수, 연산자 및 선택기를 구성합니다. 그런 다음 저장을 선택합니다.

여러 제외를 구성할 수 있습니다.

규칙 942270에 의해서만 평가에서 User-Agent 헤더를 제외할 수도 있습니다.

앞의 예제에 설명된 단계를 수행하고 4단계에서 규칙 942270을 선택합니다.

전역 제외

제외는 모든 WAF 규칙에 적용되도록 구성할 수 있습니다.

예시

URL을 통해 요청에 전달되는 user 매개 변수의 값을 제외해야 한다고 가정합니다. 예를 들어 WAF에서 악성 콘텐츠로 간주하여 차단하는 문자열이 포함된 user 쿼리 문자열 인수가 사용자 환경에서 일반적이라고 가정합니다. WAF에서 필드 값을 평가하지 않도록 이름이 user라는 단어로 시작하는 모든 쿼리 문자열 인수를 제외할 수 있습니다.

다음 예제에서는 평가에서 user 쿼리 문자열 인수를 제외할 수 있는 방법을 보여 줍니다.

Azure Portal을 사용하여 전역 제외를 구성하려면 다음 단계를 수행합니다.

  1. WAF 정책으로 이동하고 관리되는 규칙을 선택합니다.

  2. 제외 추가를 선택합니다.

    Screenshot of the Azure portal that shows how to add a new global exclusion for the W A F policy.

  3. 적용 대상에서 전역을 선택합니다.

    Screenshot of the Azure portal that shows the global exclusion configuration for the W A F policy.

  4. 일치 변수, 연산자 및 선택기를 구성합니다. 그런 다음 저장을 선택합니다.

여러 제외를 구성할 수 있습니다.

따라서 WAF에서 URL http://www.contoso.com/?user%3c%3e=joe를 검사하면 joe 문자열을 평가하지 않지만 매개 변수 이름 user%3c%3e는 계속 평가합니다.

다음 단계