이 포스팅에서는 AWS WAF 에서 제공하는 여러가지 기능 중 Source IP 기반 정책에 사용하는 IPSet 에 대해 살펴보려고 합니다.
AWS WAF 는 웹 어플리케이션 방화벽이기 때문에 어플리케이션 영역의 공격을 방어하는 것을 주 목적으로 하는 보안서비스입니다. 하지만 어플리케이션 영역 보호를 위해 IP 기반의 보안 정책도 유용하게 사용이 될 수 있기 때문에 IP 기반 정책에 사용할 수 있는 IPSet 이라는 기능을 제공하고 있습니다.
“IPSet” 은 이름 그대로 미리 정해둔 IP List 의 조합을 이야기합니다. 관리자는 WebACL 의 규칙을 설정하기 전에 미리 WebACL 에서 사용할 IP List 를 IPSet 으로 만들어 둔 후 WebACL 내에서 규칙에서 IPSet 을 불러와서 사용하게 됩니다. IPSet 의 크게 2가지 유형으로 사용이 될 수 있는데요. 특정 출발지 IP 를 기반으로해서 사용자를 차단하고자하는 용도(Blacklist)로 사용허거나 특정 출발지 IP 를 기반으로해서 사용자를 허용하는 용도(Whitelist)로 사용할 수 있습니다.
1. IPSet 생성방법
IPSet 은 다른 여러 AWS 서비스와 마찬가지로 Management Console 을 이용하거나 AWS CLI 를 이용하여 생성할 수 있습니다.
1.1 Management Console 을 이용한 IPSet 생성
첫번째 방법은 Management Console 을 이용한 방법입니다. 생성하고자하는 IPSet 의 IP 수가 많지 않을 때 편리하게 사용할 수 있는 방법인데요. AWS WAF 의 Management Console 에서 제공하는 IPSet 관리 메뉴를 이용하여 IPSet 을 생성하시면 됩니다.
WAF 의 관리화면으로 이동하시면 화면 좌측에 IPSet 메뉴가 있는 것을 확인하실 수 있는데요. 이 메뉴에서 “Create IP Set” 메뉴를 클릭한 후 아래와 같이 사용하고자 하는 IP 의 List 를 한 줄에 하나씩 입력해주시면 됩니다.
IP List 를 입력하실 때는 반드시 CIDR 포맷으로 입력해주셔야 하며 Range 나 “*” 같은 특수 문자를 사용하실 수 없습니다.
그리고 IP List 에는 0.0.0.0/0 을 입력하실 수 없습니다.
이렇게 IP List 를 입력한 후 IPSet 을 생성하시면 아래와 같이 정상적으로 IPSet 이 등록되는 것을 보실 수 있습니다.
1.2 CLI 를 이용한 IPSet 생성
생성하고자하는 IP List 가 아주 많을 때에는 Management Console 을 이용한 IPSet 생성이 적합하지 않을 수 있습니다. 이 때에는 AWS CLI 를 이용하여 많은 수의 IP List 를 등록하여 하나의 IPSet 을 생성하는 것이 더 쉽고 편리할 수 있는데요.
일반으로 많은 수의 IP List 를 등록한다고 하면 파일에 IP List 를 등록하고 그 파일을 이용해 IPSet 을 생성하는 것을 생각해볼 수 있을텐데요. AWS CLI 에서는 WAF 의 IPSet 등록 시 File 을 입력으로 사용할 수 없습니다. 따라서, IP List 를 별도로 만들어 둔 후 그 List 를 다시 변수로 불러온 후에 AWS CLI 에 사용하실 수 있습니다. File 을 직접 사용하는 것은 아니지만 여러 IP List 를 Array 형태로 입력하는 것이 가능하기 때문에 실제 운영환경에서 큰 어려움은 없을 것으로 판단됩니다.
A. 그럼 먼저 IPSet 에 등록할 IP List 를 파일에 등록하도록 하겠습니다.
아래와 같이 등록하고자하는 IP List 를 JSON Format 의 파일에 등록합니다.
B. 파일에 등록된 IP List 를 변수에 저장합니다.
IPLIST=( $(jq -r '.IPSet.Addresses[]' /path/filename) )
C. 아래와 같이 AWS CLI 를 실행하여 IPSet 을 생성합니다.
aws wafv2 create-ip-set \
--name blacklist-cli\
--scope REGIONAL \
--ip-address-version IPV4 \
--addresses $IPLIST
모든 설정이 정상적으로 이뤄졌다면 아래와 같이 AWS CLI 를 통해 새로운 IPSet 이 생성되는 것을 확인할 수 있습니다.
2. IPSet List 변경
2.1 Management Console 에서의 IP List 추가/삭제
Management Console 에서의 IP List 삭제는 아래와 같이 생성되어 있는 IPSet 을 선택한 후 삭제하고자 하는 IP List 의 체크 박스를 체크한 후 Delete 를 클릭합니다.
Management Console 에서의 IP List 추가는 “Add IP Address” 를 클릭한 후 아래와 같이 추가하고자 하는 IP List 를 한 줄당 하나씩 CIDR 포맷으로 등록합니다.
2.2 AWS CLI 를 이용한 IP List 추가/삭제
IPSet 을 생성할 때와 마찬가지로 많은 수의 IP List 에 대한 변경 작업이 필요한 경우에는 AWS CLI 를 활용하는 것이 더욱 편리할 수 있습니다.
AWS CLI 를 사용하여 IPSet 을 변경할 때 반드시 참고해야하는 점은 다음과 같습니다.
- AWS CLI 에서의 IPSet 변경 작업은 해당 IPSet 에 포함된 전체 리스트를 바꾸는 작업입니다. 즉, 전체 리스트에서 일부를 삭제하는 개념이 아닌 전체 리스트를 변경하는 작업이라는 것을 명심하세요
- AWS CLI 에서 IPSet 변경 작업을 할 때는 LockToken 값이 필요합니다. 따라서, get-ip-set 과 같은 명령을 실행하여 LockToken 값을 획득하여야 합니다.
위의 2가지를 고려해본다면 AWS CLI 를 이용한 IPSet 변경 절차는 get-ip-set 명령을 먼저 실행한 후 update-ip-set 명령을 통해 IP List 를 변경하는 것이 모범 사례라고 볼 수 있습니다.
A. 아래와 같이 get-ip-set 명령을 이용하여 현재 IPSet List 를 확인합니다.
aws wafv2 get-ip-set \
--name blacklist \
--scope REGIONAL \
--id 2054f9a2-efdd-4474-abba-01d5eb8cbd93
위 그림과 같이 명령이 정상적으로 실행되었다면 응답에 포함되어 있는 LockToken 값을 기록합니다.
B. 변경할 IP List 를 새로운 File 에 등록합니다.
중요. AWS CLI 에서의 IPSet 변경은 일부 수정이 아닌 전체 변경입니다. 기존의 IP List 에 새로운 IP List 가 추가되는 경우라면 반드시 기존 IP List 를 포함하는 전체 List 를 작성한 후에 변경작업을 진행하시기 바랍니다.
아래와 같은 파일을 준비하도록 합니다.
C. 변경할 IP List 가 모두 반영된 새로운 File 이 준비되었다면 새로운 IPSet 을 생성할 때와 마찬가지로 해당 파일에 있는 IP List 를 변수로 등록합니다.
ADD_IPLIST=( $(jq -r '.IPSet.Addresses[]' /path/filename) )
위 과정에서 기록해두었던 LockToken 을 포함하여 아래와 같이 명령을 실행합니다.
*$IPSet-ID 는 자신의 IPSet-ID 로 변경하시기 바랍니다.
aws wafv2 update-ip-set \
--name blacklist-cli \
--scope REGIONAL \
--id $IPSet-ID \
--addresses $ADD_IPLIST \
--lock-token 41cba41e-54c9-4092-a573-bf255652a81f
모든 설정이 정상적으로 이뤄졌다면 아래와 같이 정상적으로 NextLockToken 값을 응답받는 것을 확인하실 수 있습니다.
Management Console 에도 아래와 같이 정상적으로 IP List 가 추가된 것을 확인할 수 있습니다.
3. Rule 에서 IPSet 의 사용
마지막으로 지금까지 생성한 IPSet 을 WebACL 의 Rule 에 적용하는 방법에 대해 살펴보도록 하겠습니다.
IPSet 을 Rule 에서 사용하기 위해서는 Rule 의 Inspect 옵션을 “Originiate from an IP address in” 으로 선택해주셔야 합니다.
이 옵션을 선택하면 아래와 같이 Source IP 탐지와 관련하여 사용할 수 있는 옵션들이 나타나게 됩니다.
옵션 - IP Address to use as the originating address
실제 사용자의 IP 정보를 찾기 위하여 참고하여야하는 Packet 정보를 지정하는 옵션입니다. 기본값으로 “Source IP Address” 로 선택이 되어 있으면 IP Header 정보를 참조하여 IPSet 과 비교합니다. 하지만 CloudFront 를 통해서 유입되는 사용자나 Akamai, CloudFlare 등 다양한 Proxy 들을 경유하여 유입되는 사용자의 경우 IP Header 정보로는 정확한 Source IP 를 판단할 수 없습니다. 따라서, 이 때는 별도의 Header 값을 참조하도록 설정할 수 있습니다. “IP Address in header” 옵션을 선택하여 IP Header 이외의 다른 값을 참조하실 수 있습니다.
옵션 - Header Field Name
기본값으로는 “X-Forwarded-For” 헤더값을 참고하도록 되어있으며 관리자가 헤더명을 수정할 수 있습니다.
옵션 - Fallback for missing IP address
위에서 지정한 옵션의 값이 유효한 IP 주소가 아니어서 IPSet 과 비교할 수 없는 경우 어떻게 할지를 결정하는 옵션입니다. 기본값으로 “Match” 로 설정되어 있고 이 값을 선택하면 옵션으로 지정한 헤더의 값이 유효한 IP 주소가 아니더라도 IPSet 에 매칭되는 것으로 간주합니다.
이렇게 옵션을 지정해주고 Rule 에 대한 Action 을 Allow/Count/Block/CAPTCHA 등으로 선택해주면 IPSet 을 활용한 Rule 생성이 완료됩니다.
이 포스팅에서 작성한 IPSet 설정 방법이외에 AWS IP Range 에 대해 자동으로 IPSet 에 등록하는 내용을 담고 있는 AWS 공식 블로그 문서도 있으니 참고하시기 바랍니다.
감사합니다.