WAF 사용자 지정 규칙에 관하여

WAF 사용자 지정 규칙 기능을 사용하여 도메인에 대한 요청을 필터링하여 들어오는 트래픽을 제어합니다. 정의한 규칙에 따라 수신 요청에 대해 차단 또는 관리된 챌린 지와 같은 작업을 수행할 수 있습니다.

규칙 엔진에 의해 평가되는 다른 규칙과 마찬가지로, WAF 사용자 지정 규칙에는 다음과 같은 기본 매개 변수가 필요합니다

  • 규칙 언어를 사용하여 트래픽을 매칭하는 기준을 지정하는 표현입니다.
  • 규칙에 일치하는 항목이 있을 때 수행할 작업을 지정하는 작업입니다.

사용자 지정 규칙은 사용자 지정 규칙 표에서 설정된 순서대로, 첫 번째 위치부터 마지막 위치까지 평가됩니다. 보안 > 방화벽 규칙 으로 이동하여 표를 볼 수 있습니다. 차단 같은 일부 작업은 다른 규칙의 평가를 중단시킵니다. 액션과 그 동작에 대한 자세한 내용은 규칙 집합 엔진 규칙 액션을 참조하세요.

일반적인 유스 케이스

다음 섹션에서는 WAF 사용자 지정 규칙의 일반적인 사용 사례에 대한 예제를 자세히 설명합니다.

지정된 국가에서만 트래픽 허용

블록 액션을 사용하면, ip.src.country 필드를 사용하여 국가 코드에 따라 요청을 차단할 수 있습니다. 이 예에서는 미국과 멕시코의 두 국가에서만 요청을 허용합니다

(not ip.src.country in {"US" "MX"})

IP 평판에 따라 요청 차단

IP 평판은 방문자의 IP 평판을 0(위험 없음)에서 100(높은 위험)까지 점수로 분류합니다.

IP 평판은 Project Honeypot, 외부 공용 IP 정보, 그리고 관리형 규칙 및 DDoS 에서 제공하는 내부 위협 인텔리전스를 바탕으로 산정됩니다.

블록 작업을 사용하면, 이 예제에서는 국가 코드(ISO 3166-1 Alpha 2 ↗ 형식)를 기준으로 0보다 큰 점수를 받은 IP 주소에서 들어오는 요청을 차단합니다

(ip.src.country in {"CN" "TW" "US" "GB"} and cf.threat_score gt 0)

지정된 IP 주소의 트래픽만 허용

차단 작업은 도메인에 대한 액세스를 제한하여 지정된 IP 주소의 요청만 허용하고 다른 모든 요청을 거부합니다.

예를 들어 IP 192.0.2.10203.0.113.25 에서만 트래픽을 허용하려면 다음 표현식을 실행합니다:

(not ip.src in {"192.0.2.10" "203.0.113.25"})

제한하려는 프로토콜에 따라 다음 표현식 중 하나를 사용하세요:

  • 단일 IP 주소 대신 서브넷을 지정하려는 경우 IBM Cloud CIS 만 지원합니다:

    IPv4: /16 그리고 /24

    IPv6: /32, /48, 그리고 /64

  • 전체 범위를 보려면 항상 IPv4 와 IPv6 을 모두 포함하세요.

  • IPv4 ( 0.0.0.0/0 )만 차단해도 IPv6 트래픽은 계속 허용됩니다. 둘 다 차단하려면:

    (ip.src in {0.0.0.0/0} or ip.src in {::/0})
    

CIS 의 다른 기능을 건너뛰도록 규칙 설정하기

건너뛰기 작업은 건너뛰고자 하는 보안 기능이나 제품에 따라 다양한 건너뛰기 옵션을 지원합니다.

이 섹션에는 WAF 사용자 지정 규칙에 대한 다양한 건너뛰기 규칙 시나리오의 예가 포함되어 있습니다. 다음 사항을 고려하십시오

  • {zone_id} 값은 규칙을 추가하고자 하는 구역의 ID입니다.

  • {ruleset_id} 의 값은 http_request_firewall_custom 단계의 진입점 규칙 집합의 ID입니다. 이 규칙 세트 ID를 얻는 방법에 대한 자세한 내용은 규칙 세트 목록 및 보기를 참고하세요. 다음 API 예제는 영역 규칙 세트 만들기 규칙 작업을 사용하여 기존 규칙 세트에 건너뛰기 규칙을 추가합니다.

    그러나 진입점 규칙이 아직 존재하지 않을 수 있습니다. 이 경우, 엔트리포인트 규칙 세트 업데이트 작업을 사용하여 건너뛰기 규칙이 있는 엔트리포인트 규칙 세트를 만듭니다.

  • 각 예제에는 하나의 액션 파라미터만 포함되어 있지만, 규칙 세트, 단계, 제품 액션 파라미터를 동시에 지정하여 동일한 규칙에 여러 건너뛰기 옵션을 사용할 수 있습니다.

현재 규칙 집합에 포함된 나머지 규칙을 건너뛰기

이 예에서는 Create a zone ruleset 규칙 작업을 사용하여 기존 http_request_firewall_custom 단계 진입점 규칙집합(ID RULESET_ID)에 건너뛰기 규칙을 추가합니다. 진입점 규칙 집합 ID를 모르는 경우 API에 대한 사용자 지정 규칙 진입점 가져오기를 참조하세요. 이 규칙은 규칙 표현식과 일치하는 요청에 대해 현재 규칙 집합에 남아 있는 모든 규칙을 건너뜁니다

curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
  "action": "skip",
  "action_parameters": {
    "ruleset": "current"
  },
  "expression": "http.request.uri.path contains \"/skip-current-ruleset/\"",
  "description": ""
}'

단계 건너뛰기

이 예에서는 영역 규칙 세트 만들기를 사용하여 ID가 RULESET_ID 인 기존 http_request_firewall_custom 단계 진입점 규칙 세트에 규칙을 추가합니다. 규칙은 규칙 표현식과 일치하는 요청에 대해서는 " http_ratelimit " 단계를 건너뜁니다

curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
  "action": "skip",
  "action_parameters": {
    "phases": [
      "http_ratelimit"
    ]
  },
  "expression": "http.request.uri.path contains \"/skip-phase/\"",
  "description": ""
}'

단계를 건너뛰고 일치하는 요청을 기록하지 마십시오

이 예에서는 Create a zone ruleset 규칙 작업을 사용하여 현재 규칙에 대해 http_ratelimit 단계를 건너뛰고 이벤트 로깅을 비활성화하는 규칙을 추가합니다

curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
  "action": "skip",
  "action_parameters": {
    "phases": [
      "http_ratelimit"
    ]
  },
  "logging": {
    "enabled": false
  },
  "expression": "http.request.uri.path contains \"/disable-logging/\"",
  "description": ""
}'

보안 제품 건너뛰기

이 예에서는 영역 규칙 세트 만들기 규칙 작업을 사용하여 규칙 표현식과 일치하는 요청에 대해 영역 잠금 및 사용자 에이전트 차단 제품을 건너뛰는 규칙을 추가합니다

curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
  "action": "skip",
  "action_parameters": {
    "products": [
      "zoneLockdown",
      "uaBlock"
    ]
  },
  "expression": "http.request.uri.path contains \"/skip-products/\"",
  "description": ""
}'