운영 중인 서버에 대해 해외에서 EC2의 무작위 포트에 대해 지속적으로 접속을 시도하고 있음을 확인하였다. 이로 인해 서버가 중지하는 일이 발생하였다.
약 하루 기준으로 수 십 건의 접속 실패가 발생했다. 따라서 해외 IP, 봇들에 대한 접속을 막는 WAF도입을 계획하고 있다.
WAF는 웹 서비스를 대상으로 하는 방화벽이다. TCP/IP 기반으로 동작하는 일반 방화벽에 비해 HTTP를 기반 웹 서비스를 대상으로 전문화한다. AWS WAF는 AWS에서 제공하는 WAF서비스이다.
WAF는 방화벽 자체이고, Web ACL은 이를 사용자가 설정하고 관리하고 적용할수 있도록 돕는 외부 인터페이스이다.
※WAF는 AWS에서의 WAFv2를 의미한다.
코드에서 예외처리를 하는 것과 비슷하다. 조건(식)을 선택하고, 조건에 맞는 요소들에 대해 특정 동작(Allow, Block + Action)을 수행한다.
ALB(Application Load Balancer), cloudfront, api gateway, app sync graphQL API와 연동할 수 있다
현재 운영중인 환경내에는 다른 타입들은 사용하지 않고 ALB 만을 사용하고 있어, 다른 선택지가 없다.
*capacity
사전 정의된 규칙(managed rules)들을 사용할 경우 capacity를 소모한다. capacity 1500 초과할 경우 초과한 capacity 500당 0.2 달러가 부과된다. (요금-3번 규칙 참고)
밑에 [capacity] 로 표시하였다.
기타
적용해도 ALB에 접근하는 요청이 줄어드는 것은 아니라 요금 변화는 없습니다; (EC2 접근 요청은 줄겠지만) EC2는 시간당 요금이 나가기에 무관합니다.
→ 생각: 프로덕션에는 추가하여 보안을 강화하고, 스테이지는 추가하지 않아 요금을 절약한다.
도입 배경이 되었던 해외 IP를 블로킹하는 규칙을 커스텀하였다.
Source IP를 기준으로 한국이 아니라면 블록한다.
예시 (의사 코드)
if source_ip != KR: #(republic of korea)
block()
json 설정 값
{ "Name": "block-only-south-korea", "Priority": 5, "Action": { "Block": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "alock-only-south-korea" }, "Statement": { "NotStatement": { "Statement": { "GeoMatchStatement": { "CountryCodes": [ "KR" ] } } } } } |
이외 규칙에 해당하지 않는 요청들(올바른 요청들)은 허용한다.
AWS WAF 운영에 대한 이야기
Pricing - AWS WAF - Amazon Web Services (AWS)
AWS WAF (Web Application Firewall) 구축 및 활용**