AWS WAFv2에 조건부 rate-based rule을 설정하면 완전히 잘못된 이야기가 나온다

4355 단어 AWSwaf

개막사


"특정 URI 경로에만 Rate limit을 더한 AWS WAF의 규칙을 만들 수 있을까요?"
WAFv2로 간단히...본래 별로 좋은 결과가 없었을 텐데, 드디어 방법이 생겨서 적어 놓았다.

관련 리소스


AWS WAFv2


https://docs.aws.amazon.com/waf/latest/APIReference/Welcome.html#Welcome_AWS_WAFV2
이번 WAF 관련 작업은 모두 AWS 콘솔에서 수행됩니다.

기타


WAF 앞의 클라우드 프론트와 팟캐스트 테스트용 PC는 주제가 아니기 때문에 사랑을 끊는다...

구성 규칙


json


GUI 설정으로도 json 출력을 즉시 확인할 수 있습니다.
{
  "Name": "wasshoi-path-rate",
  "Priority": 0,
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "wasshoi-path-rate"
  },
  "Statement": {
    "RateBasedStatement": {
      "Limit": 100,
      "AggregateKeyType": "IP",
      "ScopeDownStatement": {
        "ByteMatchStatement": {
          "FieldToMatch": {
            "UriPath": {}
          },
          "PositionalConstraint": "CONTAINS",
          "SearchString": "/hoge/fuga/wasshoi",
          "TextTransformations": [
            {
              "Type": "NONE",
              "Priority": 0
            }
          ]
        }
      }
    }
  }
}

GUI


이것도 간단명료한 영어로 상세하게 주석한 새로운 디자인이다.
  • Type: Rate-based rule
  • Rate limit의 값: 이번에는 검증을 위한 최저치 100)
  • 메모에 설명된 대로 단일 IP에서 요청한 횟수를 5분 합계로 계산한 경우 이 값을 초과한 요청이 있을 경우 규칙이 적용됩니다.
  • "Only consier requests that match the critiain a rule statement"를 선택하고 rate limit을 적용할 기준을 지정합니다
  • .
  • URI 경로 지정
  • Action은 Block입니다.
  • (본선 때 카운트에서 안 해봤으면 사고 발생)
  • 이런 규칙을 가장 우선적인 형식으로 보존하다.
    화면을 보면서 Pochipo로 아주 간단하네요!와하하하!검증을 시작했지만 그때부터 소박하고 길었다.
    ※ 스포일러: 설정은 이렇다.

    뒷말


    검증 1: "Rate limit 부분부터 확인하세요"→성공


    이것은 방금 설정에서 URI 경로 부분을 삭제하는 설정입니다.Consier all requests를 선택했습니다. Rate Limit 뿐입니다.
    {
      "Name": "wasshoi-path-rate",
      "Priority": 0,
      "Action": {
        "Block": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "wasshoi-path-rate"
      },
      "Statement": {
        "RateBasedStatement": {
          "Limit": 100,
          "AggregateKeyType": "IP"
        }
      }
    }
    
    응용 프로그램을 적용한 후 URI 경로/hoge/fuga/wasshoi를 외부에서 120회 연속으로 두드리는 스크립트를 실행합니다.
    →결과:성공.101번째 요청에서 블락에게 응답 코드 403을 잘 받았다.

    검증2: "본 공연과 동일한 설정 확인"→ 순조롭지 못함.


    검증 1이 성공했기 때문에 그 규칙을 계속 편집하고 상술한'규칙 설정'에 따라 업데이트합니다.
    완료되면 검사기 1과 같은 스크립트를 실행합니다.
    → 결과: 실패.curl 결과 모두 통과, 응답 코드 200, WAF 측이 규칙에 걸리지 않은 경우
    어???

    검증3: "뭔가 잘못된 것 같으니 설정을 조금만 조정해 주세요" → 잘 못하죠.


    경로에 *를 추가하거나 Contains String 부분을 다른 조건으로 해 보세요.각 스크립트는 다양한 설정에서 재생되며 결과는 검증 2와 같습니다.난 아무것도 몰라.

    결론: 그를 하룻밤 자게 하면 잠을 잘 수 있다.


    정확히 말하면 AWS가 지원하는 기술적 문제를 통해 해결된 것으로 결론은 다음과 같다.
  • WAF 규칙의 반영은 시간축
  • 이 있다.
  • 전송이 차단된 소스의 IP 주소 이전에도 타임라인이 있음
  • 검증 1이면 바로 블락이 반영되겠지... 그렇게 생각하지만 검증 2 이후에도 앱 사용 후 바로 스크립트 두드리기가 이뤄지는 건 사실이다.
    솔직히 타임라인을 의식하고 재검증했다.
    →블락 성공!
    규칙을 재설정하고 이번에는 1분에서 20분 간격으로 검증 스크립트를 반복한다(다른 작업에서는 거칠게 하기 때문에 간격이 분산된다).
    그리고 규칙 설정 후 약 2시간가량 매번 120회 요청이 블락에 의해 이뤄지는 행위를 확인했다.WAF의 기록에도 잘 기록되어 있습니다.
    조금만 더 기다려, 확인 시간이 지나면 블록이 해제될 거야.대단히 기쁘다.

    총결산

  • WAFv2의 규칙 설정은 때때로 반영에 시간이 걸린다

  • "검증용으로 설정된 것만 사용"함정이에요
  • 엄밀히 다른 것으로 조사한 결과 (이번처럼) 검증으로 의미가 없다
  • 과일은 누워서 기다려야 한다
  • 끝.


    아마도 너무 어리석은 이유로 반한 것 같지만, 인터넷에서 아무리 조사해도 이번 현상을 찾지 못해 상당히 고통스럽다.

    좋은 웹페이지 즐겨찾기