WAF 사용자 지정 규칙으로 작업하기
WAF 사용자 지정 규칙은 HTTP 트래픽을 대상으로 하여 사용자 지정 기준을 적용함으로써, 특정 요청을 차단, 확인 요청, 기록 또는 허용할 수 있는 강력한 기능과 유연성을 제공합니다.
다양한 유형의 WAF 사용자 정의 규칙을 생성할 수 있습니다. 그러나 사이트의 활성 규칙 수는 고객 플랜에 의해 제한됩니다. 자격에 대한 자세한 내용은 CIS 요금제 비교를 참조하세요.
플랜당 활성 규칙 수는 고정됩니다. 현재는 더 많은 활성 규칙을 구입할 수 없습니다.
시작하기 전에, 필드, 함수, 표현식 사용하기를 검토하는 것이 좋습니다.
콘솔, CLI, API 또는 Terraform을 사용하여 사용자 지정 규칙을 생성, 업데이트 및 삭제할 수 있습니다.
콘솔에서 사용자 지정 규칙 만들기
콘솔에서 사용자 지정 규칙을 만들려면 다음 단계를 따르세요:
WAF 사용자 지정 규칙은 기존 방화벽 규칙 페이지를 사용하여 구성합니다. 도메인에 이전에 생성된 모든 레거시 방화벽 규칙은 자동으로 WAF 사용자 지정 규칙으로 변환됩니다.
-
CIS 콘솔에서 보안으로 이동합니다.
-
'사용자 지정 규칙' 탭을 선택한 다음 '만들기'를 클릭합니다.
-
선택 사항인 설명을 입력하세요.
-
필요한 경우 선택적으로 우선순위를 입력하십시오. 우선순위가 0인 경우, 이는 우선순위가 없는 것으로 간주되며 가장 마지막에 평가됩니다.
-
수신 요청 섹션에서 UI 빌더를 사용하여 조건을 추가하십시오. 다중 조건이 있는 표현식을 빌드하려면 다음 중 하나를 클릭하십시오.
- 그리고- 조건을 평가하는 데 사용하는 논 리
- 또는- ‘or’ 연산자를 사용하는 조건이나, 이전에 ‘and’ 연산자로 연결된 조건들의 집합을 평가하기 위해
조건을 빌드할 때 표현식 미리보기가 일반 텍스트로 표현식을 표시하는 것을 볼 수 있습니다.
표현식 미리보기에서 시각적 표현식 빌더를 사용하는 대신 수동으로 표현식 편집을 클릭하거나 둘 사이를 전환할 수 있습니다. 단, 수동으로 구성된 표현식의 복잡도에 따라 시각적 표현식 빌더가 해당 표현식을 렌더링할 수 없을 수 있습니다.
-
응답 목록 메뉴에서 조치를 선택하십시오.
-
규칙을 저장하려면 다음 중 하나를 클릭하여 가장 적합한 옵션을 선택하십시오.
- 규칙을 저장하려면 ‘초안으로 저장’을 선택하되, 규칙은 비활성화된 상태로 유지하세요.
- 저장 및 배치 - 규칙을 저장하고 활성화합니다.
콘솔에서 사용자 지정 규칙 업데이트하기
콘솔에서 기존 사용자 지정 규칙을 업데이트하려면 다음 단계를 따르세요:
- CIS 콘솔에서 보안으로 이동합니다.
- '사용자 지정 규칙' 탭을 선택합니다.
- '사용자 지정 규칙' 테이블에서 수정하려는 규칙을 찾은 다음, 해당 행 오른쪽에 있는 '작업' 메뉴를 클릭합니다.
- 편집을 선택하십시오.
- 규칙을 변경하십시오.
- 규칙을 저장하려면 다음 중 하나를 클릭하여 가장 적합한 옵션을 선택하십시오.
- 규칙을 저장하려면 ‘초안으로 저장’을 선택하되, 규칙은 비활성화된 상태로 유지하세요.
- 저장 및 배치 - 규칙을 저장하고 활성화합니다.
기존 규칙 목록에서 규칙을 일시정지하거나 활성화하려면 사용 토글을 클릭하십시오.
콘솔에서 사용자 지정 규칙 삭제하기
콘솔에서 기존 사용자 지정 규칙을 삭제하려면 다음 단계를 따르세요:
- CIS 콘솔에서 보안으로 이동합니다.
- '사용자 지정 규칙' 테이블에서 삭제할 규칙을 찾아 해당 행 오른쪽에 있는 '작업' 메뉴를 클릭합니다.
- 작업 메뉴에서 ‘삭제’를 선택하세요.
- WAF 사용자 지정 규칙 삭제를 클릭하여 규칙을 삭제합니다.
CLI에서 사용자 지정 규칙 만들기
CLI에서 사용자 지정 규칙을 만들려면 다음 단계를 따르세요:
-
CLI 환경을 설정하십시오.
-
CLI에서 계정에 로그인하십시오. 비밀번호를 입력하면, 시스템에서 사용하려는 계정과 지역을 입력하라는 메시지가 표시됩니다:
ibmcloud login --sso -
사용자 정의 규칙을 생성하려면 다음 명령을 실행하십시오:
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 데이터에서 필수 입력 항목은
expression및action입니다.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 데이터에서 필수 입력 항목은
expression및action입니다.expression: 규칙이 실행되기 위해 충족되어야 하는 조건을 지정합니다.action: 수행할 규칙 작업. 유효한 값은block,challenge,js_challenge,managed_challenge,log,skip입니다.
-
선택 필드는
description,enabled,logging,action_parameters입니다.action_parameters: 규칙 실행 매개변수.ruleset나머지 규칙을 모두 건너뛰거나 하나 이상의 WAF 관리 규칙 집합을 건너뜁니다. 유효한 값은 다음과 같습니다currentphases: 일치하는 요청에 대해 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 이 필요합니다.
사용자 지정 규칙 진입점 규칙 집합을 가져오려면 다음 단계를 따르세요:
- 올바른 변수로 API 환경을 설정하십시오.
- API 명령에 사용할 변수에 다음 값을 저장하십시오.
CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.
ZONE_ID: 도메인 ID.
-
모든 변수가 시작되면 진입점 규칙 집합을 가져옵니다:
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를 사용하여 사용자 지정 규칙을 만들려면 다음 단계를 따르세요:
- 올바른 변수로 API 환경을 설정하십시오.
- API 명령에 사용할 변수에 다음 값을 저장하십시오.
CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.
ZONE_ID: 도메인 ID.
RULESET_ID: 사용자 지정 규칙 진입점 규칙 집합의 ID입니다.
-
모든 변수가 초기화되면 사용자 정의 규칙을 생성합니다:
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를 사용하여 기존 사용자 지정 규칙을 업데이트하려면 다음 단계를 따르세요:
- 올바른 변수로 API 환경을 설정하십시오.
- API 명령에 사용할 변수에 다음 값을 저장하십시오.
CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.
ZONE_ID: 도메인 ID.
RULESET_ID: 사용자 지정 규칙 진입점 규칙 집합의 ID입니다.
RULE_ID: 수정할 사용자 지정 규칙의 ID입니다.
-
모든 변수의 초기화가 완료되면 사용자 정의 규칙을 업데이트하십시오:
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를 사용하여 기존 사용자 지정 규칙을 삭제하려면 다음 단계를 따르세요:
- 올바른 변수로 API 환경을 설정하십시오.
- API 명령에 사용할 변수에 다음 값을 저장하십시오.
CRN: 서비스 인스턴스의 전체 URL-인코딩된 클라우드 리소스 이름(CRN)입니다.
ZONE_ID: 도메인 ID.
RULESET_ID: 사용자 지정 규칙 진입점 규칙 집합의 ID입니다.
RULE_ID: 수정할 사용자 지정 규칙의 ID입니다.
-
모든 변수의 초기화가 완료되면 사용자 정의 규칙을 삭제하십시오:
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으로 사용자 지정 규칙 만들기
사용자 지정 규칙을 만들려면 먼저 진입점을 만든 다음 사용자 지정 규칙을 만들어야 합니다. 이를 수행하려면 다음 단계를 따르십시오.
-
진입점 규칙 집합을 만들려면 다음 명령을 실행합니다:
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 ] } } -
사용자 정의 규칙을 만들려면 다음 명령을 실행하십시오:
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 을 실행하면 됩니다.