본문 바로가기

AWS

[AWS] WAF 구성 가이드

반응형

WAF란?

WAF는 Web Application Firewall의 약자로, 웹 애플리케이션에 대한 공격을 탐지하고 차단하는 역할을 한다. AWS WAF는 WAS에서 관리하는 WAF 서비스로, 모든 관리를 AWS에서 하는 완전 관리형 서비스이다.

WAF에서는 여러 규칙을 조합해 트래픽이 응용 프로그램에 도달하는 방법을 제어할 수 있다. 규칙에는 SQL 인젝션이나 XSS와 같은 일반적인 공격 패턴을 막는 보안 규칙이 있다. 그리고 정의한 특정 트래픽 패턴을 제외하는 규칙도 자유롭게 만들 수 있다.

WAF와 연결할 수 있는 서비스는 ALB, CloudFront, API Gateway 등을 직접 연결 할 수 있다. 아래에서는 ALB에 WAF를 직접 연결하는 방식으로 설명한다.

WAF는 크게 규칙, 규칙 그룹, 웹 ACL이라는 3가지 요소로 구성돼 있다.

규칙

특정 IP주소만 허가하는 규칙, 특정 헤더가 포함된 GET 요청만을 허가하는 규칙 등을 정의한다. 검사 방법은 AND 조건 또는 OR 조건 등으로 조합해 허가나 거부를 정의할 수 있다.

규칙 그룹

여러 규칙을 모은 것이다. 규칙의 우선순위를 설정할 수 있다.

주의할 점은 규칙 그룹에는 WCU(WAF Capacity Unit)라는 규칙의 상한치를 설정해야 한다.

규칙 그룹별로 WCU는 1500까지 설정할 수 있다. 규칙 내용에 따라 소모되는 WCU는 다르며, 그룹에 포함된 규칙의 WCU 값이 1500을 넘지 않게 설정해야 한다.

WCU는 규칙 그룹을 만들 때만 값을 지정할 수 있으며 이후에는 변경할 수 없다. 그룹을 정의한 뒤 규칙을 추가하거나 변경하는 경우 이 그룹 내의 합계 WCU가 제한을 넘으면 생성되지 않고 별도의 규칙 그룹으로 생성해 수정해야 한다. 이름도 생성 후에는 변경할 수 없다.

웹 ACL

규칙 그룹과 적용할 AWS 자원을 연결하는 역할을 한다.

웹 ACL은 여러 규칙 그룹을 연결할 수 있지만, WCU 제한은 1500이다.

웹 ACL을 생성할 때 지역을 Global로 할지 개별 지역으로 할지 선택해야 한다. CloudFront와 연결하는 경우에는 Global을 ALB나 API Gateway와 연결할 때는 Seoul 등의 지역을 선택해야 한다.

웹 ACL과 연결할 규칙 그룹도 동일하게 지역 설정을 해야한다. 지역을 Global로 설정한 규칙 그룹과 서울로 설정한 웹 ACL은 연결할 수 없다.

WAF 전체 형태

WAF 생성

규칙 그룹/규칙 그룹

자체 규칙 그룹이나 자체 규칙을 생성할 수 있지만 이 가이드에서는 AWS가 제공하는 관리형 규칙 그룹 및 규칙을 이용한다. 이용할 규칙은 아래와 같다.

규칙 규칙 이름

Web 애플리케이션에 대한 핵심 규칙 AWS-AWSManagedRulesCommonRuleSet
Amazon IP 평가 목록에 대한 규칙 AWS-AWSManagedRulesAmazonIpRequtationList
익명 IP 목록에 대한 규칙 AWS-AWSManagedRulesAnonymousIpList
올바르지 않은 입력 데이터에 대한 규칙 AWS-AWSManagedRulesKnownBadInputsRuleSet
SQL 인젝션에 대한 규칙 AWS-AWSManagedRulesSQLiRuleSet

 

웹 ACL 생성

웹 ACL과 WAF를 설정할 인터넷용 ALB를 연결한다. 내부 ALB가 아니라는 점에 주의한다.

AWS 관리 콘솔에서 WAF & Shield’ 서비스로 이동해 설정한다.

 

아래 스크린샷을 참고하여 설정을 진행한다.

 

아래 표를 참고하여 Add to web ACL을 활성화한다.

분류 대상 관리형 규칙

AWS AManged rule groups Amazon IP reputation list
AWS AManged rule groups Anonymous IP list
AWS AManged rule groups Core rule set
AWS AManged rule groups Known bad inputs
AWS AManged rule groups SQL database

규칙 그룹이 추가됐는지 확인을 한다.

Default action을 Allow로 하면 규칙에 해당하지 않는 요청에 대해서는 Allow를 한다.

 

규칙 그룹을 선택하고 Move up, Move down 버튼을 클릭해 순서를 변경할 수 있다.

 

설정 확인

이 가이드에서는 확인하는 내용에 대한 내용을 다루지는 않지만 아래와 같은 방법으로 확인할 수 있다.

  • 일반 요청에는 정상적으로 응답하는지
  • SQL 인젝션을 차단하는지
  • XSS를 차단하는지

일반 요청에는 정상적으로 응답하는지

DNS에 접속해 페이지가 정상적으로 표시되는지 확인한다.

SQL 인젝션을 차단하는지

SQL 인젝션을 확인하기 위해 SQL 공격에 관련된 문자열을 파라미터에 포함해 전달한다.

URI 경로나 쿼리 문자열, HTTP 바디 내용으로 전달되는 파라미터가 필터링되지 않고 SQL 구문으로 처리되는 애플리케이션은 SQL 공격에 취약하다.

예를 들어 애플리케이션에서 사용자 ID로 사용자 이름을 확인하는 페이지가 있다면 내부의 SQL 구문은 SELECT username FROM user WHERE userid = ‘$name’과 같이 작성한다. 그리고 $name 부분을 파라미터로 처리해 http://testdomain/checkusername?userid=[검색할 사용자 ID]와 같이 URL 파라미터로 userid를 받아 처리한다. 여기서 wikibook이라는 사용자 ID를 검색한다고 할 때 단순히 wikibook이 아니라 ‘wikibook’ or ‘A’=’A’로 입력하면 $name 변수는 ‘wikibook’ or ‘A’=’A’]가 되고, 서버측 코드에서 최종 완성되는 SQL 구문은 SELECT username FROM user WHERE userid = ‘wikibook’ or ‘A’=’A’ 가 된다. 이 구문은 조건과 상관없이 True이므로 모든 레코드를 반환하게 된다.

http://[WAF와 연결되어있는 ALB의 DNS]/”’some’ or ‘A’=’A’” 로 요청해서 403 Forbidden 페이지가 반환되면 WAF의 규칙이 잘 동작하고 있는지 확인할 수 있다. 쿼리 문자열에 동일하게 SQL 인젝션을 포함한 요청을 전송해도 동일한 결과를 얻을 수 있다. http://[WAF와 연결되어있는 ALB의 DNS]/?id=”’some’ or ‘A’=’A’”

차단된 요청은 WAF 서비스의 대시보드에서 확인할 수 잇다.

XSS를 차단하는지

XSS는 파라미터에 JavaScript 구문을 넣어 해당 구문의 실행을 통해 정보를 탈취하거나 사용자 클라이언트에서 이상 동작을 유발하는 공격 방법이다. 가장 단순한 확인 방법은 요청 파라미터에 <script>alert(document.cookie)</script> 를 넣어 확인하는 것이다.

http://[WAF와 연결되어있는 ALB의 DNS]/<script>alert(document.cookie)</script>

WAF가 정상 동작하고 있으면 SQL 인젝션 때와 마찬가지로 403 Forbidden 에러가 표시된다. SQL 인젝션을 확인했을 때와 같이 쿼리 문자열에도 공격 구문을 넣어본다.

http://[WAF와 연결되어있는 ALB의 DNS]/name=<script>alert(document.cookie)</script>

설정한 규칙 중 대표적인 규칙을 확인했다. WAF 설정 후에는 의도한 대로 설정됐는지 검증해야 한다.

반응형