OpsNow에서는 파트너사에게 별도의 도메인을 이용한 브랜드 사이트를 제공하고 있는데, 최근에 이를 관리하기 용이하게 개선하면서 ALB에 여러 서브 도메인들을 하나로 모으게 되었습니다. 호기롭게 시작한 작업이었으나, 곧바로 난관에 봉착했습니다. 바로 특정 호스트에 대한 접근 제어였습니다. ALB에서는 보안 그룹을 이용할 수 있었습니다.

그래서 곧바로 AWS WAF (Web Application Firewall) 를 알아보기 시작했고, 약간의 시행착오 끝에 원하는 목표를 달성할 수 있습니다. 이 글을 통해서 어떻게 특정 호스트에 접근하고자 하는 아이피를 제어할 수 있었는지 공유하고자 합니다.

IP Set 설정

먼저, AWS WAF에 접속한 다음에 IP Set을 생성합니다. IP Set은 두 가지 형태로 생성할 수 있습니다. 허용할 아이피 또는 차단할 아이피 목록입니다. 지금은 특정 아이피 대역만 허용할 계획이므로 허용할 아이피를 CIDR 형태로 한 줄씩 입력합니다. 목적에 따라서 IP Set은 분리하는 것이 좋습니다.

허용할 아이피 목록을 입력합니다.

Regex Pattern Set 설정

그 다음에는 특정 호스트의 서브 도메인을 확인하기 위한 Regex Pattern Set을 생성합니다. 사실 이 부분은 Host 헤더에 대한 조건을 좀 더 폭넓게 제공하기 위해서 이용하는 것으로, 단일 호스트일 경우에 필수는 아닙니다. 다만, 추후 룰 변경을 손쉽게 하기 위해서는 꼭 사용하시는 것을 권장합니다.

보통 admin 페이지를 제어하고 싶을 수 있습니다.

접근을 제한하고자 하는 호스트가 여러 개라면, 각각의 줄로 혹은 정규 표현식에서 OR문을 사용하여 조건을 더 추가할 수 있습니다.

Web ACL 생성

이제, 미리 생성된 IP Set과 Regex Pattern Set의 ID를 메뉴에서 확인하여 따로 복사해놓고 Web ACL을 생성합니다. 생성시에 해당 룰을 적용할 ALB를 찾아서 선택하면 됩니다.

Web ACL 생성 1단계

다음 페이지인 룰 생성 화면에서는 Add Rule을 눌러서 Add my own rules를 선택합니다. 저는 별도로 룰 그룹을 생성하지 않았으므로 곧바로 룰을 생성할 것인데, Rule Builder가 선택된 상태에서 그대로 Rule JSON Editor를 이용합니다.

참고로, 룰 그룹을 이용하지 않으면 추후 룰 변경이 불가능하여 삭제 후 재생성해야 할 수 있습니다. 잦은 변경이 필요하다면 룰 그룹을 생성하고 거기에 먼저 룰을 만들어서 이미 만들어진 룰을 가져오는 방식으로 새로운 룰을 추가하는 것이 좋습니다.

룰 생성하기

JSON 에디터를 이용하는 이유는 단 하나입니다. 좀 더 복잡한 룰을 생성하기 위해서입니다. 일반 데이터에서는 기본ANDORNOT 네 가지 중에 하나만 선택할 수 있습니다. 이들의 조합으로 룰을 생성하려면 반드시 JSON 형태로 작업해야 합니다.

저는 제공된 IP Set이 아닌 아이피를 가지면서 admin.example.com으로 접속하려는 모든 요청을 차단하고자 합니다. 이와 같은 조건을 만족하는 JSON은 아래와 같습니다.

{
"Name": "<룰 이름>",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "<메트릭 이름>"
},
"Statement": {
"AndStatement": {
"Statements": [
{
"NotStatement": {
"Statement": {
"IPSetReferenceStatement": {
"ARN": "arn:aws:wafv2:ap-northeast-2:<계정>:regional/ipset/<IP Set 이름>/<IP Set ID>"
}
}
}
},
{
"RegexPatternSetReferenceStatement": {
"FieldToMatch": {
"SingleHeader": {
"Name": "host"
}
},
"ARN": "arn:aws:wafv2:ap-northeast-2:<계정>:regional/regexpatternset/<Regex Pattern Set 이름>/<Regex Pattern Set ID>",
"TextTransformations": [
{
"Type": "NONE",
"Priority": 0
}
] }
}
] }
}
}
Code language: JSON / JSON with Comments (json)

하이라이트된 4줄에 위치하는 정보를 적절히 채워 넣으시고 Validate를 진행해서 오류가 발생하지 않았다면 그대로 룰을 등록하면 됩니다. 룰 등록이 완료되면 Web ACL생성을 완료합니다.

모니터링

기본적으로 샘플링된 요청을 대시보드에서 확인할 수 있으며, 개별 요청의 AllowBlock 여부도 확인이 가능합니다. Web ACL 메뉴에서 방금 생성한 항목을 찾아서 들어가면 바로 확인할 수 있습니다.

WAF의 각 룰에 따라 메트릭과 샘플 요청을 확인할 수 있습니다.

물론 WAF는 요청당 비용이 발생하기 때문에 주의하셔야 합니다. OpsNow에서도 각 서비스별 통신이 가급적 ALB를 거치지 않도록 개선하여 비용을 조금이라도 줄이기 위해 노력하고 있습니다. 비용은 언제나 주의해야죠!

자, 이렇게 콘솔에서 직접 제공되지 않는 형태의 룰을 생성하여 원하는 사용자만 해당 호스트로 접근할 수 있도록 하였습니다. 이제 하나의 ALB에 여러 호스트가 뒤섞여도 손쉽게 WAF를 통해서 접근 제어가 가능해졌습니다. 보안 그룹보다도 다양한 룰 셋팅을 할 수 있다는 것은 큰 장점입니다. 적용할 수 있는 조건은 AWS의 문서를 참고하시면 더 많은 룰 생성에 도움이 되실 겁니다. (문서)