Web Application Firewall 제외 목록
Azure Application Gateway WAF(Web Application Firewall)는 웹 애플리케이션을 보호합니다. 이 문서에서는 WAF 제외 목록의 구성에 대해 설명합니다. 이러한 설정은 Application Gateway와 연결된 WAF 정책에 있습니다. WAF 정책에 관한 자세한 내용은 Azure Application Gateway의 Azure Web Application Firewall 및 Application 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"} |
.zshrc 및 sleep(5) |
요청 본문 | RequestArgNames | 같음 | test |
요청 본문: {"test": ".zshrc"} |
.zshrc |
요청 본문 | RequestArgNames | EqualsAny | 해당 없음 | 요청 본문: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc 및 sleep(5) |
요청 본문 | RequestArgValues | 같음 | test |
요청 본문: {"test": ".zshrc"} |
.zshrc |
요청 본문 | RequestArgValues | EqualsAny | 해당 없음 | 요청 본문: {"key1": ".zshrc", "key2":"sleep(5)"} |
.zshrc 및 sleep(5) |
헤더 | RequestHeaderKeys | 같음 | X-Scanner |
헤더: {"X-Scanner": "test"} |
X-scanner |
헤더 | RequestHeaderKeys | EqualsAny | 해당 없음 | 헤더: {"X-Scanner": "test", "x-ratproxy-loop": "value"} |
X-Scanner 및 x-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을 사용하여 규칙별 제외를 구성하려면 다음 단계를 수행합니다.
WAF 정책으로 이동하고 관리되는 규칙을 선택합니다.
제외 추가를 선택합니다.
적용 대상에서 제외를 적용할 CRS 규칙 집합(예: OWASP_3.2)을 선택합니다.
규칙 추가를 선택하고 제외를 적용할 규칙을 선택합니다.
일치 변수, 연산자 및 선택기를 구성합니다. 그런 다음 저장을 선택합니다.
여러 제외를 구성할 수 있습니다.
규칙 942270에 의해서만 평가에서 User-Agent
헤더를 제외할 수도 있습니다.
앞의 예제에 설명된 단계를 수행하고 4단계에서 규칙 942270을 선택합니다.
전역 제외
제외는 모든 WAF 규칙에 적용되도록 구성할 수 있습니다.
예시
URL을 통해 요청에 전달되는 user 매개 변수의 값을 제외해야 한다고 가정합니다. 예를 들어 WAF에서 악성 콘텐츠로 간주하여 차단하는 문자열이 포함된 user
쿼리 문자열 인수가 사용자 환경에서 일반적이라고 가정합니다. WAF에서 필드 값을 평가하지 않도록 이름이 user
라는 단어로 시작하는 모든 쿼리 문자열 인수를 제외할 수 있습니다.
다음 예제에서는 평가에서 user
쿼리 문자열 인수를 제외할 수 있는 방법을 보여 줍니다.
Azure Portal을 사용하여 전역 제외를 구성하려면 다음 단계를 수행합니다.
WAF 정책으로 이동하고 관리되는 규칙을 선택합니다.
제외 추가를 선택합니다.
적용 대상에서 전역을 선택합니다.
일치 변수, 연산자 및 선택기를 구성합니다. 그런 다음 저장을 선택합니다.
여러 제외를 구성할 수 있습니다.
따라서 WAF에서 URL http://www.contoso.com/?user%3c%3e=joe
를 검사하면 joe 문자열을 평가하지 않지만 매개 변수 이름 user%3c%3e는 계속 평가합니다.
다음 단계
- WAF 설정을 구성한 후에는 WAF 로그 확인 방법을 살펴볼 수 있습니다. 자세한 내용은 Application Gateway 진단을 참조하세요.
- Azure 네트워크 보안에 대해 자세히 알아보기