Project/AWS 침해사고대응

AWS 서비스 이해 - WAF

hoihosick 2024. 7. 22. 14:16

앞서 말했던 클라우드 시나리오 뿐만 아니라, 웹 서버에서의 침해 사고 시나리오 제작을 위해서, 네트워크에 WAF를 설정하여 이벤트를 검출하고자 한다. 

 

WAF에 대해서 알아보자. 

WAF는 Web Application Firewall 즉 웹 어플리케이션 방화벽이다. HTTP/HTTPS 요청을 검사하여 악의적인 트래픽을 필터링 하는데, 웹 애플리케이션 앞에 배치되어 웹 트래픽을 모니터링하고, 사전에 정의된 규칙을 기반으로 악의적인 트래픽을 차단한다.

 

  • Web ACL (Web Access Control List):
    • 정의: WAF에서 적용할 규칙들을 모아 놓은 리스트로, 웹 애플리케이션에 대한 접근 제어 정책을 정의
    • 구성: Web ACL은 하나 이상의 규칙(rule)과 규칙 그룹(rule group)으로 구성
  • 규칙(rule) 및 규칙 그룹(rule group):
    • 규칙: 개별적인 보안 정책을 정의하는 단위로, 특정 패턴을 탐지하여 차단하거나 허용하는 역할
    • 규칙 그룹: 여러 개의 규칙을 모아 놓은 그룹으로, 특정 보안 기능을 묶어서 관리할 수 있다.
  • 관리 규칙 그룹 (Managed Rule Groups):
    • 정의: AWS와 같은 보안 제공업체가 사전에 정의한 보안 규칙 세트로, 일반적인 웹 애플리케이션 공격을 방어하기 위해 사용.
    • 제공업체: AWS, Cloudbric Crop, Cyber Security Cloud Inc, F5, Fortinet, GeoGuard, Imperva, ThreatSTOP 등 다양한 보안 업체에서 제공하는 규칙 그룹을 사용할 수 있다.

 

이중에서 1500개까지 월마다 무료 제공하는 식인데 일단 'AWS-Linux 관리 규칙', 'AWS-SQLdatabase 관리 규칙' 두개만 등록한 상태

 

요약 : cloudwatch에 'aws-waf-logs' 생성되어서 웹서버(ec2)의 보안 이벤트를 검출

 

OpenSearch Discover에  waf 로그 확인 가능.

@log-group로 column 구분하면 aws-waf-logs-groups와 aws-cloudtrail-logs로 나눠져서 가독성 증가

 

이런식으로 필터링 걸어서 보면 가독성 증가

 

실제로 확인된 로그들은 아래와 같다.

 


WAF 규칙에 의해 허용된 로그
"_index": "cwl-2024.07.19",
"_id": "38387540695211467436770153427948946790100377601340473344", "_version": 1, "_score": 0, "_source": { "timestamp": 1721356858413, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-northeast-2:058264524253:regional/webacl/waf-logs/943e41aa-f12a-47fd-9450-ce2eaa2b9205", "terminatingRuleId": "Default_Action", "terminatingRuleType": "REGULAR", "action": "ALLOW", "terminatingRuleMatchDetails": [], "httpSourceName": "ALB", "httpSourceId": "058264524253-app/web-instance-alb/b274c840c8ff5ad8", "ruleGroupList": [ { "ruleGroupId": "AWS#AWSManagedRulesLinuxRuleSet", "terminatingRule": null, "nonTerminatingMatchingRules": [ [] ], "excludedRules": null, "customerConfig": null }, { "ruleGroupId": "AWS#AWSManagedRulesSQLiRuleSet", "terminatingRule": null, "nonTerminatingMatchingRules": [], "excludedRules": null, "customerConfig": null } ], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "requestHeadersInserted": null, "responseCodeSent": null, "httpRequest": { "clientIp": "106.243.252.252", "country": "KR", "headers": [ { "name": "Host", "value": "13.125.50.15" }, { "name": "Connection", "value": "close" } ], "uri": "REDACTED", "args": "REDACTED", "httpVersion": "HTTP/1.1", "httpMethod": "REDACTED", "requestId": "1-6699d23a-7d87b331205f2d4643464e8d" }, "labels": [ { "name": "awswaf:clientip:geo:country:KR" }, { "name": "awswaf:clientip:geo:region:KR-41" } ], "@id": "38387540695211467436770153427948946790100377601340473344", "@timestamp": "2024-07-19T02:40:58.413Z", "@message": "{\"timestamp\":1721356858413,\"formatVersion\":1,\"webaclId\":\"arn:aws:wafv2:ap-northeast-2:058264524253:regional/webacl/waf-logs/943e41aa-f12a-47fd-9450-ce2eaa2b9205\",\"terminatingRuleId\":\"Default_Action\",\"terminatingRuleType\":\"REGULAR\",\"action\":\"ALLOW\",\"terminatingRuleMatchDetails\":[],\"httpSourceName\":\"ALB\",\"httpSourceId\":\"058264524253-app/web-instance-alb/b274c840c8ff5ad8\",\"ruleGroupList\":[{\"ruleGroupId\":\"AWS#AWSManagedRulesLinuxRuleSet\",\"terminatingRule\":null,\"nonTerminatingMatchingRules\":[],\"excludedRules\":null,\"customerConfig\":null},{\"ruleGroupId\":\"AWS#AWSManagedRulesSQLiRuleSet\",\"terminatingRule\":null,\"nonTerminatingMatchingRules\":[],\"excludedRules\":null,\"customerConfig\":null}],\"rateBasedRuleList\":[],\"nonTerminatingMatchingRules\":[],\"requestHeadersInserted\":null,\"responseCodeSent\":null,\"httpRequest\":{\"clientIp\":\"106.243.252.252\",\"country\":\"KR\",\"headers\":[{\"name\":\"Host\",\"value\":\"13.125.50.15\"},{\"name\":\"Connection\",\"value\":\"close\"}],\"uri\":\"REDACTED\",\"args\":\"REDACTED\",\"httpVersion\":\"HTTP/1.1\",\"httpMethod\":\"REDACTED\",\"requestId\":\"1-6699d23a-7d87b331205f2d4643464e8d\"},\"labels\":[{\"name\":\"awswaf:clientip:geo:country:KR\"},{\"name\":\"awswaf:clientip:geo:region:KR-41\"}]}", "@owner": "058264524253", "@log_group": "aws-waf-logs-groups", "@log_stream": "ap-northeast-2_waf-logs_0" }, "fields": { "@timestamp": [ "2024-07-19T02:40:58.413Z" ] }, "highlight": { "@log_group": [ "@opensearch-dashboards-highlighted-field@aws@/opensearch-dashboards-highlighted-field@-@opensearch-dashboards-highlighted-field@waf@/opensearch-dashboards-highlighted-field@-@opensearch-dashboards-highlighted-field@logs@/opensearch-dashboards-highlighted-field@-@opensearch-dashboards-highlighted-field@groups@/opensearch-dashboards-highlighted-field@" ] } }

로그 분석

  • 이벤트 ID: 38387540695211467436770153427948946790100377601340473344
  • 로그 그룹: aws-waf-logs-groups
  • 로그 스트림: ap-northeast-2_waf-logs_0
  • 타임스탬프: 2024-07-19T02:40:58.413Z
  • 액션: ALLOW (허용)
  • 규칙 ID: Default_Action
  • 규칙 타입: REGULAR
  • HTTP 소스 이름: ALB (Application Load Balancer)
  • HTTP 소스 ID: 058264524253-app/web-instance-alb/b274c840c8ff5ad8
  • 클라이언트 IP: 106.243.252.252
  • 국가: KR (한국)
  • 요청 헤더:
    • Host: 13.125.50.15
    • Connection: close
  • HTTP 요청 정보:
    • URI: REDACTED (가려짐)
    • 매개변수: REDACTED (가려짐)
    • HTTP 버전: HTTP/1.1
    • HTTP 메소드: REDACTED (가려짐)
    • 요청 ID: 1-6699d23a-7d87b331205f2d4643464e8d
  • 레이블:
    • Country: KR (한국)
    • Region: KR-41 (경기도)

추가 정보

  • Web ACL ID: arn:aws:wafv2:ap-northeast-2:058264524253:regional/webacl/waf-logs/943e41aa-f12a-47fd-9450-ce2eaa2b9205
  • 관리 규칙 그룹:
    • AWS#AWSManagedRulesLinuxRuleSet
    • AWS#AWSManagedRulesSQLiRuleSet
  • 매치된 규칙 없음: 이 이벤트는 AWSManagedRulesLinuxRuleSet 및 AWSManagedRulesSQLiRuleSet 규칙 그룹에 의해 차단되지 않았습니다.

결론

이 로그 이벤트는 한국(KR)의 경기도(KR-41)에서 클라이언트 IP 106.243.252.252가 Application Load Balancer(ALB)를 통해 접속을 시도한 요청이 AWS WAF 규칙에 의해 허용된 것을 보여줍니다. AWSManagedRulesLinuxRuleSet 및 AWSManagedRulesSQLiRuleSet 규칙 그룹에는 매치되지 않았으며, 기본 액션(Default_Action)에 의해 허용되었습니다. 이 요청은 HTTP/1.1 버전의 프로토콜을 사용했으며, Host 헤더와 Connection 헤더가 포함되어 있습니다.


WAF 규칙에 의해 차단된 로그


{ "_index": "cwl-2024.07.18", "_id": "38387072148816487724487798132625778503371529305146327040", "_version": 1, "_score": 0, "_source": { "timestamp": 1721335848066, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-northeast-2:058264524253:regional/webacl/waf-logs/943e41aa-f12a-47fd-9450-ce2eaa2b9205", "terminatingRuleId": "block_foreign_IP", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [], "httpSourceName": "ALB", "httpSourceId": "058264524253-app/web-instance-alb/b274c840c8ff5ad8", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "requestHeadersInserted": null, "responseCodeSent": null, "httpRequest": { "clientIp": "147.135.140.44", "country": "FR", "headers": [ { "name": "Host", "value": "13.125.50.15" }, { "name": "User-Agent", "value": "Go-http-client/1.1" }, { "name": "Accept-Encoding", "value": "gzip" } ], "uri": "REDACTED", "args": "REDACTED", "httpVersion": "HTTP/1.1", "httpMethod": "REDACTED", "requestId": "1-66998028-7b9cd8bf0c37e6e8392726ee" }, "labels": [ { "name": "awswaf:clientip:geo:region:FR-IDF" }, { "name": "awswaf:clientip:geo:country:FR" } ], "@id": "38387072148816487724487798132625778503371529305146327040", "@timestamp": "2024-07-18T20:50:48.066Z", "@message": "{\"timestamp\":1721335848066,\"formatVersion\":1,\"webaclId\":\"arn:aws:wafv2:ap-northeast-2:058264524253:regional/webacl/waf-logs/943e41aa-f12a-47fd-9450-ce2eaa2b9205\",\"terminatingRuleId\":\"block_foreign_IP\",\"terminatingRuleType\":\"REGULAR\",\"action\":\"BLOCK\",\"terminatingRuleMatchDetails\":[],\"httpSourceName\":\"ALB\",\"httpSourceId\":\"058264524253-app/web-instance-alb/b274c840c8ff5ad8\",\"ruleGroupList\":[],\"rateBasedRuleList\":[],\"nonTerminatingMatchingRules\":[],\"requestHeadersInserted\":null,\"responseCodeSent\":null,\"httpRequest\":{\"clientIp\":\"147.135.140.44\",\"country\":\"FR\",\"headers\":[{\"name\":\"Host\",\"value\":\"13.125.50.15\"},{\"name\":\"User-Agent\",\"value\":\"Go-http-client/1.1\"},{\"name\":\"Accept-Encoding\",\"value\":\"gzip\"}],\"uri\":\"REDACTED\",\"args\":\"REDACTED\",\"httpVersion\":\"HTTP/1.1\",\"httpMethod\":\"REDACTED\",\"requestId\":\"1-66998028-7b9cd8bf0c37e6e8392726ee\"},\"labels\":[{\"name\":\"awswaf:clientip:geo:region:FR-IDF\"},{\"name\":\"awswaf:clientip:geo:country:FR\"}]}", "@owner": "058264524253", "@log_group": "aws-waf-logs-groups", "@log_stream": "ap-northeast-2_waf-logs_0" }, "fields": { "@timestamp": [ "2024-07-18T20:50:48.066Z" ] }, "highlight": { "@log_group": [ "@opensearch-dashboards-highlighted-field@aws@/opensearch-dashboards-highlighted-field@-@opensearch-dashboards-highlighted-field@waf@/opensearch-dashboards-highlighted-field@-@opensearch-dashboards-highlighted-field@logs@/opensearch-dashboards-highlighted-field@-@opensearch-dashboards-highlighted-field@groups@/opensearch-dashboards-highlighted-field@" ] } }

로그 분석

  • 이벤트 ID: 38387072148816487724487798132625778503371529305146327040
  • 로그 그룹: aws-waf-logs-groups
  • 로그 스트림: ap-northeast-2_waf-logs_0
  • 타임스탬프: 2024-07-18T20:50:48.066Z
  • 액션: BLOCK (차단)
  • 규칙 ID: block_foreign_IP
  • 규칙 타입: REGULAR
  • HTTP 소스 이름: ALB (Application Load Balancer)
  • HTTP 소스 ID: 058264524253-app/web-instance-alb/b274c840c8ff5ad8
  • 클라이언트 IP: 147.135.140.44
  • 국가: FR (프랑스)
  • 요청 헤더:
    • Host: 13.125.50.15
    • User-Agent: Go-http-client/1.1
    • Accept-Encoding: gzip
  • HTTP 요청 정보:
    • URI: REDACTED (가려짐)
    • 매개변수: REDACTED (가려짐)
    • HTTP 버전: HTTP/1.1
    • HTTP 메소드: REDACTED (가려짐)
    • 요청 ID: 1-66998028-7b9cd8bf0c37e6e8392726ee
  • 레이블:
    • Region: FR-IDF (Île-de-France, 프랑스)
    • Country: FR (프랑스)

결론

이 로그 이벤트는 프랑스(France, FR)의 Île-de-France 지역에서 클라이언트 IP 147.135.140.44가 Application Load Balancer(ALB)를 통해 접속을 시도한 요청이 block_foreign_IP 규칙에 의해 차단된 것을 보여줍니다. 이는 Go-http-client/1.1 User-Agent를 사용한 HTTP/1.1 요청으로, AWS WAF 규칙에 의해 차단되었습니다.