WAF 사용자 지정 규칙으로 작업하기

WAF 사용자 지정 규칙은 HTTP 트래픽을 대상으로 하여 사용자 지정 기준을 적용함으로써, 특정 요청을 차단, 확인 요청, 기록 또는 허용할 수 있는 강력한 기능과 유연성을 제공합니다.

다양한 유형의 WAF 사용자 정의 규칙을 생성할 수 있습니다. 그러나 사이트의 활성 규칙 수는 고객 플랜에 의해 제한됩니다. 자격에 대한 자세한 내용은 CIS 요금제 비교를 참조하세요.

플랜당 활성 규칙 수는 고정됩니다. 현재는 더 많은 활성 규칙을 구입할 수 없습니다.

시작하기 전에, 필드, 함수, 표현식 사용하기를 검토하는 것이 좋습니다.

콘솔, CLI, API 또는 Terraform을 사용하여 사용자 지정 규칙을 생성, 업데이트 및 삭제할 수 있습니다.

콘솔에서 사용자 지정 규칙 만들기

콘솔에서 사용자 지정 규칙을 만들려면 다음 단계를 따르세요:

WAF 사용자 지정 규칙은 기존 방화벽 규칙 페이지를 사용하여 구성합니다. 도메인에 이전에 생성된 모든 레거시 방화벽 규칙은 자동으로 WAF 사용자 지정 규칙으로 변환됩니다.

  1. CIS 콘솔에서 보안으로 이동합니다.

  2. '사용자 지정 규칙' 탭을 선택한 다음 '만들기'를 클릭합니다.

  3. 선택 사항인 설명을 입력하세요.

  4. 필요한 경우 선택적으로 우선순위를 입력하십시오. 우선순위가 0인 경우, 이는 우선순위가 없는 것으로 간주되며 가장 마지막에 평가됩니다.

  5. 수신 요청 섹션에서 UI 빌더를 사용하여 조건을 추가하십시오. 다중 조건이 있는 표현식을 빌드하려면 다음 중 하나를 클릭하십시오.

    • 그리고- 조건을 평가하는 데 사용하는 논
    • 또는- ‘or’ 연산자를 사용하는 조건이나, 이전에 ‘and’ 연산자로 연결된 조건들의 집합을 평가하기 위해

    조건을 빌드할 때 표현식 미리보기가 일반 텍스트로 표현식을 표시하는 것을 볼 수 있습니다.

    표현식 미리보기에서 시각적 표현식 빌더를 사용하는 대신 수동으로 표현식 편집을 클릭하거나 둘 사이를 전환할 수 있습니다. 단, 수동으로 구성된 표현식의 복잡도에 따라 시각적 표현식 빌더가 해당 표현식을 렌더링할 수 없을 수 있습니다.

  6. 응답 목록 메뉴에서 조치를 선택하십시오.

  7. 규칙을 저장하려면 다음 중 하나를 클릭하여 가장 적합한 옵션을 선택하십시오.

    • 규칙을 저장하려면 ‘초안으로 저장’을 선택하되, 규칙은 비활성화된 상태로 유지하세요.
    • 저장 및 배치 - 규칙을 저장하고 활성화합니다.

콘솔에서 사용자 지정 규칙 업데이트하기

콘솔에서 기존 사용자 지정 규칙을 업데이트하려면 다음 단계를 따르세요:

  1. CIS 콘솔에서 보안으로 이동합니다.
  2. '사용자 지정 규칙' 탭을 선택합니다.
  3. '사용자 지정 규칙' 테이블에서 수정하려는 규칙을 찾은 다음, 해당 행 오른쪽에 있는 '작업' 메뉴를 클릭합니다.
  4. 편집을 선택하십시오.
  5. 규칙을 변경하십시오.
  6. 규칙을 저장하려면 다음 중 하나를 클릭하여 가장 적합한 옵션을 선택하십시오.
    • 규칙을 저장하려면 ‘초안으로 저장’을 선택하되, 규칙은 비활성화된 상태로 유지하세요.
    • 저장 및 배치 - 규칙을 저장하고 활성화합니다.

기존 규칙 목록에서 규칙을 일시정지하거나 활성화하려면 사용 토글을 클릭하십시오.

콘솔에서 사용자 지정 규칙 삭제하기

콘솔에서 기존 사용자 지정 규칙을 삭제하려면 다음 단계를 따르세요:

  1. CIS 콘솔에서 보안으로 이동합니다.
  2. '사용자 지정 규칙' 테이블에서 삭제할 규칙을 찾아 해당 행 오른쪽에 있는 '작업' 메뉴를 클릭합니다.
  3. 작업 메뉴에서 ‘삭제’를 선택하세요.
  4. WAF 사용자 지정 규칙 삭제를 클릭하여 규칙을 삭제합니다.

CLI에서 사용자 지정 규칙 만들기

CLI에서 사용자 지정 규칙을 만들려면 다음 단계를 따르세요:

  1. CLI 환경을 설정하십시오.

  2. CLI에서 계정에 로그인하십시오. 비밀번호를 입력하면, 시스템에서 사용하려는 계정과 지역을 입력하라는 메시지가 표시됩니다:

    ibmcloud login --sso
    
  3. 사용자 정의 규칙을 생성하려면 다음 명령을 실행하십시오:

    ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID --match EXPRESSION --action ACTION [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
    

    JSON 파일 또는 JSON 문자열을 직접 제공하여 사용자 지정 규칙을 만들 수도 있습니다:

    ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
    

명령 옵션

DNS_DOMAIN_ID

DNS 도메인의 ID입니다.

--match

규칙을 실행하기 위해 일치되어야 하는 조건을 지정합니다. 일치 값에 대해서는 필드, 함수 및 표현식 사용을 참조하세요.

--action

수행할 규칙 조치입니다. 유효한 값: "블록", "챌린지", "js_challenge", "관리_챌린지", "로그", "스킵". "block" 및 "skip" 작업의 경우, 대신 JSON 파일이나 JSON 문자열을 사용하십시오.

--enabled

규칙이 활성 상태임을 표시합니다. 기본값은 "false"입니다.

--description

규칙에 대한 간략한 설명.

--json

사용자 정의 규칙을 설명하는 데 사용되는 JSON 파일 또는 JSON 문자열.

  • JSON 데이터에서 필수 입력 항목은 expressionaction 입니다.

    • expression: 규칙이 실행되기 위해 충족되어야 하는 조건을 지정합니다.
    • action: 수행할 규칙 작업. 유효한 값은 block, challenge, js_challenge, managed_challenge, log, skip 입니다.
  • 선택 필드는 description, enabled, logging, action_parameters 입니다.

    • action_parameters: 규칙 실행 매개변수.
    • ruleset 나머지 규칙을 모두 건너뛰거나 하나 이상의 WAF 관리 규칙 집합을 건너뜁니다. 유효한 값은 current 입니다.
    • phases: 일치하는 요청에 대해 WAF 구성 요소를 건너뜁니다. 유효한 값은 http_ratelimit, http_request_firewall_managed, http_request_sbfm 입니다.
    • products: 일치하는 요청에 대해 특정 보안 제품을 건너뜁니다. 유효한 값은 waf, rateLimit, securityLevel, hot, bic, uaBlock, zoneLockdown 입니다.
    • response: block 액션에 대한 사용자 지정 응답을 정의합니다.
      • status_code: 응답에 사용할 HTTP 상태 코드를 400-499 범위 내에서 선택하십시오.
      • content_type 사용자 지정 응답의 콘텐츠 유형입니다. 유효한 응답 유형은 text/html, text/plain, application/json, text/xml 입니다.
      • content: 응답 본문.
    • description: 규칙을 간략하게 설명합니다.
    • enabled: 해당 규칙이 활성화되어 있는지 여부를 나타냅니다. 이 필드를 비활성화하면 일치하는 요청이 방화벽 요청에 표시되지 않습니다.
    • logging: 건너뛰기 규칙에 해당하는 요청을 기록합니다. 이 필드는 'skip' 조치에만 사용할 수 있습니다.

샘플 JSON 데이터:

         {
           "description": "test-custom-rule",
           "expression": "(http.cookie contains \"test\")",
           "action": "skip",
           "logging": {
                   "enabled": true
               },
           "action_parameters": {
             "ruleset": "current",
               "phases": [
                       "http_ratelimit",
                       "http_request_firewall_managed",
                       "http_request_sbfm"
                   ],
                   "products": [
                       "waf",
                       "rateLimit",
                       "securityLevel",
                       "hot",
                       "bic",
                       "uaBlock",
                       "zoneLockdown"
                   ]
           },
           "enabled": true
         }
-i, --instance
인스턴스 이름 또는 ID입니다. 설정되지 않은 경우, ibmcloud cis instance-set INSTANCE 로 지정된 컨텍스트 인스턴스가 사용됩니다.
--output
출력 형식을 지정하십시오. ‘ JSON ’만 지원됩니다.

CLI에서 사용자 지정 규칙 업데이트하기

다음 명령을 실행하여 CLI에서 사용자 정의 규칙을 업데이트하십시오:

ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]

JSON 파일이나 JSON 문자열을 직접 제공하여 사용자 지정 규칙을 업데이트할 수도 있습니다:

ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]

명령 옵션

DNS_DOMAIN_ID

DNS 도메인의 ID입니다.

RULE_ID

규칙의 ID입니다.

--match

규칙을 실행하기 위해 일치되어야 하는 조건을 지정합니다. 일치 값에 대해서는 필드, 함수 및 표현식 사용을 참조하세요.

--action

수행할 규칙 조치입니다. 유효한 값입니다: "블록", "챌린지", "js_challenge", "관리_챌린지", "로그", "스킵"."블록" 및 "스킵" 작업의 경우 대신 JSON 파일 또는 JSON 문자열을 사용하세요.

--enabled

규칙이 활성 상태임을 표시합니다. The default value is "false".

--description

규칙에 대한 간략한 설명.

--json

사용자 정의 규칙을 설명하는 데 사용되는 JSON 파일 또는 JSON 문자열.

  • JSON 데이터에서 필수 입력 항목은 expressionaction 입니다.

    • expression: 규칙이 실행되기 위해 충족되어야 하는 조건을 지정합니다.
    • action: 수행할 규칙 작업. 유효한 값은 block, challenge, js_challenge, managed_challenge, log, skip 입니다.
  • 선택 필드는 description, enabled, logging, action_parameters 입니다.

    • action_parameters: 규칙 실행 매개변수.
      • ruleset 나머지 규칙을 모두 건너뛰거나 하나 이상의 WAF 관리 규칙 집합을 건너뜁니다. 유효한 값은 다음과 같습니다 current
      • phases: 일치하는 요청에 대해 WAF 구성 요소를 건너뜁니다. 유효한 값은 http_ratelimit, http_request_firewall_managed, http_request_sbfm 입니다.
      • products: 일치하는 요청에 대해 특정 보안 제품을 건너뜁니다. 유효한 값은 waf, rateLimit, securityLevel, hot, bic, uaBlock, zoneLockdown 입니다.
      • response: 'block' 액션에 대한 사용자 정의 응답을 정의합니다.
        • status_code: 응답에 사용할 HTTP 상태 코드를 400-499 범위 내에서 선택하십시오.
        • content_type 사용자 지정 응답의 콘텐츠 유형입니다. 유효한 응답 유형은 text/html, text/plain, application/json, text/xml 입니다.
        • content: 응답 본문.
    • description: 규칙을 간략하게 설명합니다.
    • enabled: 해당 규칙이 활성화되어 있는지 여부를 나타냅니다. 이 필드를 비활성화하면 일치하는 요청이 방화벽 요청에 표시되지 않습니다.
    • logging: 건너뛰기 규칙에 해당하는 요청을 기록합니다. 이 필드는 'skip' 조치에만 사용할 수 있습니다.

샘플 JSON 데이터:

         {
           "description": "test-custom-rule",
           "expression": "(http.cookie contains \"test\")",
           "action": "block",
           "action_parameters": {
             "response": {
             "status_code": 429,
             "content_type": "text/xml",
             "content": "reject"
             }
           },
           "enabled": true
         }
-i, --instance
인스턴스 이름 또는 ID입니다. 설정되지 않은 경우, ibmcloud cis instance-set INSTANCE 로 지정된 컨텍스트 인스턴스가 사용됩니다.
--output
출력 형식을 지정하십시오. ‘ JSON ’만 지원됩니다.

CLI에서 사용자 지정 규칙 삭제하기

다음 명령어를 실행하여 CLI에서 사용자 정의 규칙을 삭제하십시오:

ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]

명령 옵션

DNS_DOMAIN_ID
DNS 도메인의 ID입니다.
RULE_ID
사용자 정의 규칙의 ID입니다.
-i, --instance
인스턴스 이름 또는 ID입니다. 설정되지 않은 경우, ibmcloud cis instance-set INSTANCE 로 지정된 컨텍스트 인스턴스가 사용됩니다.
-f, --force
확인 메시지를 표시하지 않고 사용자 지정 규칙을 삭제하려고 시도합니다.
--output
출력 형식을 지정하십시오. ‘ JSON ’만 지원됩니다.

명령 예제

  • 사용자 지정 규칙을 만들려면:

ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"

  • 사용자 정의 규칙을 업데이트하려면:

ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true

  • 사용자 정의 규칙을 삭제하려면:

ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27

API에 대한 사용자 지정 규칙 시작점 가져오기

모든 사용자 지정 규칙 API 작업에는 사용자 지정 규칙 단계의 시작점 규칙 집합 RULESET_ID 이 필요합니다.

사용자 지정 규칙 진입점 규칙 집합을 가져오려면 다음 단계를 따르세요:

  1. 올바른 변수로 API 환경을 설정하십시오.
  2. API 명령에 사용할 변수에 다음 값을 저장하십시오.

CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.

ZONE_ID: 도메인 ID.

  1. 모든 변수가 시작되면 진입점 규칙 집합을 가져옵니다:

    curl -X GET "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \
    --header "X-Auth-User-Token: Bearer <API_TOKEN>" \
    --header "Content-Type: application/json"
    

    규칙 집합 ID는 성공적인 요청의 응답에 있습니다. 앞의 호출이 404 찾을 수 없음 응답을 반환하는 경우 다음 API를 사용하여 사용자 지정 규칙 단계에 대한 진입점 규칙 집합을 만드세요:

    curl -X POST https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets \
    --header "X-Auth-User-Token: Bearer <API_TOKEN>" \
    --header "Content-Type: application/json" \
    --data '{
       "name": "Zone-level phase entry point",
       "kind": "zone",
       "description": "Custom rule entry point ruleset.",
       "phase": "http_request_firewall_custom"
    }'
    

API를 사용하여 사용자 지정 규칙 만들기

API를 사용하여 사용자 지정 규칙을 만들려면 다음 단계를 따르세요:

  1. 올바른 변수로 API 환경을 설정하십시오.
  2. API 명령에 사용할 변수에 다음 값을 저장하십시오.

CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.

ZONE_ID: 도메인 ID.

RULESET_ID: 사용자 지정 규칙 진입점 규칙 집합의 ID입니다.

  1. 모든 변수가 초기화되면 사용자 정의 규칙을 생성합니다:

    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 '{
      "description": "My custom rule with plain text response",
      "expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") and cf.waf.score lt 20",
      "action": "block",
      "action_parameters": {
        "response": {
          "status_code": 403,
          "content": "Your request was blocked.",
          "content_type": "text/plain"
        }
      }
      }'
    

API로 사용자 지정 규칙 업데이트하기

API를 사용하여 기존 사용자 지정 규칙을 업데이트하려면 다음 단계를 따르세요:

  1. 올바른 변수로 API 환경을 설정하십시오.
  2. API 명령에 사용할 변수에 다음 값을 저장하십시오.

CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.

ZONE_ID: 도메인 ID.

RULESET_ID: 사용자 지정 규칙 진입점 규칙 집합의 ID입니다.

RULE_ID: 수정할 사용자 지정 규칙의 ID입니다.

  1. 모든 변수의 초기화가 완료되면 사용자 정의 규칙을 업데이트하십시오:

    curl -X PATCH "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \
    --header "X-Auth-User-Token: Bearer <API_TOKEN>" \
    --header "Content-Type: application/json" \
    --data '{
       "enabled": false,
       "description": "block GB and FR or based on IP Reputation (temporarily disabled)"
    }'
    

API로 사용자 지정 규칙 삭제하기

API를 사용하여 기존 사용자 지정 규칙을 삭제하려면 다음 단계를 따르세요:

  1. 올바른 변수로 API 환경을 설정하십시오.
  2. API 명령에 사용할 변수에 다음 값을 저장하십시오.

CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.

ZONE_ID: 도메인 ID.

RULESET_ID: 사용자 지정 규칙 진입점 규칙 집합의 ID입니다.

RULE_ID: 수정할 사용자 지정 규칙의 ID입니다.

  1. 모든 변수의 초기화가 완료되면 사용자 정의 규칙을 삭제하십시오:

    curl -X DELETE "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \
    --header "X-Auth-User-Token: Bearer <API_TOKEN>" \
    --header "Content-Type: application/json"
    

Terraform으로 사용자 지정 규칙 만들기

사용자 지정 규칙을 만들려면 먼저 진입점을 만든 다음 사용자 지정 규칙을 만들어야 합니다. 이를 수행하려면 다음 단계를 따르십시오.

  1. 진입점 규칙 집합을 만들려면 다음 명령을 실행합니다:

    resource "ibm_cis_ruleset_entrypoint_version" "test" {
        cis_id    = "<cis-id>"
        domain_id = "<domain-id>"
        phase = "http_request_firewall_custom"
        rulesets {
          description = "Entry point ruleset for custom ruleset"
        }
        lifecycle {
          ignore_changes = [
            rulesets
          ]
      }
    }
    
  2. 사용자 정의 규칙을 만들려면 다음 명령을 실행하십시오:

       resource ibm_cis_ruleset_rule "config" {
          cis_id    = ibm_cis.instance.id
          domain_id = data.ibm_cis_domain.cis_domain.domain_id
          ruleset_id = resource.ibm_cis_ruleset_entrypoint_version.rulesets[0].ruleset_id
          rule {
            action =  "block"
            description = "var.description"
            expression = "true"
            enabled = "false"
            action_parameters {
              response {
                status_code = var.status_code
                content =  var.content
                content_type = "text/plain"
              }
            }
            position {
              index = var.index
              after = <id of any existing rule>
              before = <id of any existing rule>
            }
          }
        }
    

다음 예제에서는 진입점 및 WAF 사용자 지정 규칙을 만드는 방법을 보여 줍니다:

resource ibm_cis_ruleset_entrypoint_version test {
cis_id    = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
rulesets {
   description = "Entrypoint ruleset for custom ruleset"
   }
   lifecycle {
   ignore_changes = [
      rulesets
   ]
  }
}
data ibm_cis_ruleset_entrypoint_versions custom_rule_ep {
  cis_id    = ibm_cis.instance.id
  domain_id = data.ibm_cis_domain.cis_domain.domain_id
  phase = "http_request_firewall_custom"
  depends_on = [
  ibm_cis_ruleset_entrypoint_version.test
  ]
}
resource ibm_cis_ruleset_rule "custom_rule1" {
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
      rule {
        action =  "skip"
        description = "adding custom rule via terraform"
        expression = "true"
        enabled = "true"
        action_parameters{
          ruleset = "current"
          phases = ["http_ratelimit", "http_request_sbfm","http_request_firewall_managed"]
          products = ["zoneLockdown","uaBlock", "bic", "hot", "securityLevel", "rateLimit","waf"]
        }
      }
}
resource ibm_cis_ruleset_rule "custom_rule2" {
    cis_id    = ibm_cis.instance.id
    domain_id = data.ibm_cis_domain.cis_domain.domain_id
    ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
      rule {
        action =  "block"
        description = "adding custom rule via terraform2"
        expression = "(http.request.uri.path eq \"/path1\")"
        enabled = "false"
      }
}

자세한 내용은 ibm_cis_ruleset_rule 를 참조하세요.

앞의 예제를 수정하고 terraform apply 명령을 실행하여 사용자 지정 규칙을 업데이트할 수 있습니다. 규칙을 삭제하려면 구성을 제거하고 terraform apply 을 실행하면 됩니다.