AWS WAF IP 어뷰징(ddos) 차단 사례
플랫폼개발팀은 데이터베이스, 클라우드 인프라, 미디어 인프라를 개발과 운영 업무를 담당하는 팀이며, 최고의 동영상 재생 품질을 제공하기 위해 서비스 안정화를 통한 시스템 모니터링에 힘쓰고 있습니다.
티빙은 공간의 제약이 없이 인터넷만 연결이 된다면, 다양한 단말기에서 콘텐츠를 이용할 수 있는 OTT입니다. 그렇기 때문에 인터넷을 통한 다양한 공격에 노출되는 부분이 있는데요. AWS 웹방화벽(Web Application Firewall, WAF)를 통한 해외 IP 어뷰징(Abusing) 차단 사례를 공유하고자 합니다.
어느 날 2분 동안 약 6백만(분당 3백만) request가 발생했습니다. 로그를 확인해본 결과 여러 IP로 특정 페이지를 대량으로 호출하는 악의적인 행위를 확인하였습니다.
순간적으로 발생하는 비정상적인 호출들로 인해 서비스 지연 등이 발생하였고, WAF 로그를 분석한 결과 적용할 수 있는 몇 가지 방안들이 있었습니다.
첫 번째 조치 사항으로는 IP Rate Rule
입니다.
AWS IP Rate은 5분당 지정한 Limit 값이 초과되는 경우 액션을 취하게 됩니다. 수치는 30초마다 갱신되며, 조건을 충족할 경우 액션을 취하게 됩니다. 단일페이지 혹은 여러 페이지, 나라 기준, 특정 헤더 기준 등 여러 가지 조건으로 정책 생성 및 적용 할 수 있습니다. Rate Limit 값을 몇으로 할 지 고민이 된다면, count 혹은 challenge 를 사용을 해보는 것을 추천드립니다.
다만 이 정책의 아쉬운 점은 최대 30초 후에 액션이 취해지기 때문에, 30초 동안은 공격에 노출되는 단점이 있을 수 있습니다. 그 외 제약사항은 아래 링크에서 확인이 가능합니다.
저희는 추가적인 공격을 막고자 챌린지 액션을 적용했고, 아래와 같이 외부 공격에 대해서 일부 조치가 되었습니다.
두 번째 조치사항으로는 AWSManagedRulesAmazonIpReputationList
입니다.
AWSManagedRule인 AmazonIpReputationList에는 3가지 정책이 있습니다.
- AWSManagedIPReputationList : 봇으로 식별된 IP 주소
- AWSManagedReconnaissanceList : AWS 리소스에 대해서 정찰을 수해하는 IP 주소
- AWSManagedIPDDoSList : DDoS 활동에 적극적으로 참여하는 것으로 확인된 IP 주소
AmazonIpReputationList도 국가, 헤더 기준 등 추가적인 조건설정이 가능합니다. 저희는 AWSManagedIPDDoSList에 대해서 국가 기준으로 차단 정책을 적용하였습니다.
세 번째 조치사항으로는 AWSManagedRulesAnonymousIpList
입니다.
AWSManagedRulesAnonymousIpList 에는 2가지 정책이 있습니다
- AnonymousIPList: TOR 노드, 임시 프록시 및 기타 마스킹 서비스 등 클라이언트 정보를 익명화하는 것으로 알려진 소스의 IP 주소 목록
- HostingProviderIPList: 최종 사용자 트래픽을 소싱할 가능성이 적은 호스팅 공급자 및 클라우드 공급자의 IP 주소 목록
DDos 공격 발생 시 AWSManagedIPDDoSList 다음으로 AWSManagedRulesAnonymousIpList 룰이 많이 탐지되었습니다.
해당 정책을 차단으로 적용하게 되면 클라이언트 환경에 따라서 접속 차단이 될 수 있습니다.(예: 특정/해외 VPN사용 시 접속 차단이 발생)
물론 정상적인 클라이언트 환경은 아니지만 차단 정책을 바로 적용하기에는 이슈가 있을 것 같아 해당 2가지 정책에 대해서는 챌린지 정책을 적용하였습니다. 적용 후 아래와 같은 효과를 얻을 수 있었습니다.
그런데 여기서 챌린지 정책이란??
- 접속 행위에 따라서 차단이 될 수도 있고, 정상적으로 접속이 될 수 있는 정책입니다.
캡차와 비슷하지만 다른 점은 클라이언트가 수동으로 그림을 맞추는 행위들이 없고, request 절차가 정상적이라면 접속을 허용해주는 방식입니다.
정상적인 request 절차는 대략 아래와 같으며, 자세히 확인해 보고 싶으신 분들은 개발자 도구를 켜시고 접속하시면 요청 절차를 자세히 확인할 수 있습니다.
- Client Request 진행
- Aws waf Challenge 발생 및 202 Response
3. 이 후 AWS에 정상적인 사용자라는 확인 절차 진행 (몇가지 추가 Request 발생)
4. 사용자 확인이 되면, 그 이후 실제 Request 진행
- 단, Immunity time이 지나면 다시 1번부터 진행이 됩니다.
- Immunity time 설정이 없을 경우 WAF ACL에 있는 값을 참조하며, 수정을 하지 않았을 경우 기본값은 300초 입니다.
- 테스트시 IP가 같더라도 위 절차는 별도로 적용 받습니다.
challenge/captcha 모두 추가 비용이 발생하기 때문에 적절한 Immunity time 설정이 필요합니다. 시간이 짧으면 그만큼 많이 검사하기 때문에 보안 측면에서는 좋으나 비용이 많이 발생할 수 있습니다. 사용자가 사이트에 머무르는 평균 시간을 알고 있으면 해당 수치로 설정하는 것도 좋은 방법입니다.
영향도 파악이 아직 되지 않은 상태에서 공격을 방어하거나, 오탐이 의심스러운 상황이라면 챌린지 정책을 적용해보는 것도 좋을 것 같습니다.
우리는 위 세가지 정책 적용하였고, 그 결과 아래와 같이 방어를 할 수 있게 되었습니다.
- AWSManagedRulesAmazonIpReputationList-AWSManagedIPDDoSList로 IP 차단 진행
- AWSManagedRulesAnonymousIpList로 IP 챌린지 진행
- IP Rate Rule로 IP 챌린지 진행
별도의 클라우드 보안 서비스를 계약하지 않아도, 별도의 보안서버를 구성하지 않아도 외부 공격에 대해서 방어를 할 수 있었습니다. AWS WAF를 활용하면 서비스 구성 변경 없이도 쉽고 빠르게 서비스에 안정성을 높일 수 있습니다.
마지막으로 저희 플랫폼개발팀은 365/24/7 안정적인 서비스 운영을 위해 노력하고 있습니다.
감사합니다.