필드, 함수 및 표현식 사용
액션과 더불어 필드 및 표현식은 WAF 사용자 정의 규칙의 기본 구성 요소입니다. 이러한 요소는 함께 작동하여 사용자 지정 규칙을 일치시키기 위한 기준을 정의합니다.
필드
CIS 이 HTTP 요청을 받으면 요청을 분석하여 일치하는 필드 테이블을 만듭니다. 이 필드 테이블은 요청이 처리되는 동안에만 존재하며 표현식 일치에 사용되는 요청 속성을 포함합니다.
각 필드 값은 다음과 같이 다른 위치에서 제공될 수 있습니다.
- 트래픽에서 직접 얻은 원시 특성이며 예를 들어,
http.request.uri.path가 있습니다. - 변환, 작성 또는 기본 조작의 결과인 파생 값(예:
http.request.uri.path의 값을 모두 소문자로 만들고 다른 필드의 필드로 사용 가능). - 검색, 계산 또는 기타 지능의 결과인 컴퓨터 값이며 예를 들어, 관련 원시 값 및 파생 값을 조사하는 기계 학습 프로세스에서 동적으로 계산된
cf.threat_score가 있습니다.
사용 가능 필드
| 필드 이름 | 유형 | 예제 값 | 참고 |
|---|---|---|---|
| http.cookie | 문자열 | session=A12345;-background=light | 전체 쿠키를 문자열로 사용 |
| http.host | 문자열 | www.example.com |
전체 요청 URI에서 사용된 호스트 이름 |
| http.referer | 문자열 | HTTP Referer 헤더 | Referer requestHTTP 헤더는 현재 요청된 페이지로 연결된 웹 페이지의 주소를 포함합니다. |
| http.request.body.raw | 문자열 | 변경되지 않은 HTTP 요청 본문. | |
| http.request.full_uri | 문자열 | https://www.example.com/articles/index?section=539061&expand=comments |
웹 서버가 수신한 전체 URI(웹 서버로 전송되지 않는 _#fragment_는 포함하지 않음) |
| http.request.method | 문자열 | POST | HTTP 방법, 대문자 |
| http.request.uri | 문자열 | /articles/index?section=539061&expand=comments | 요청의 절대 URI |
| http.request.uri.path | 문자열 | /articles/index | 요청의 경로 |
| http.request.uri.query | 문자열 | section=539061&expand=comments | 구분 접두부 "?"를 제외한 전체 조회 문자열 |
| http.user_agent | 문자열 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 | 전체 HTTP 사용자 에이전트 |
| http.x_forwarded_for | 문자열 | 전체 X-Forwarded-HTTP 헤더 | |
| ip.src | IP 주소 | 93.155.208.22 | 클라이언트 IP 주소 TCP. 필요에 따라 이 주소는 원래 클라이언트의 실제 IP 주소를 반영하도록 조정할 수 있습니다(예: X-Forwarded-For 또는 X-Real-IP와 같은 HTTP 헤더를 사용하는 방법) |
| ip.src.region | 문자열 | 텍사스 | 수신 요청의 IP 주소와 연관된 지리적 위치 지역. |
| ip.geoip.asnum | 숫자 | 222 | Autonomous System(AS) 수 |
| ip.geoip.country | 문자열 | GB | 2자리 국가 코드 |
| ssl | 부울 | 예 | 클라이언트에 대한 HTTP 연결이 암호화되는지 여부 |
| ip.src.subdivision_1_iso_code | 문자열 | GB-ENG | IP 주소와 연결된 첫 번째 레벨 지역의 ISO 3166-2 iP 주소와 연결된 첫 번째 레벨 지역의 코드입니다. 실제 값을 사용할 수 없는 경우 이 필드에는 빈 문자열이 포함됩니다. 이 필드를 사용하려면 CIS Enterprise 요금제가
필요합니다. |
| ip.src.subdivision_2_iso_code | 문자열 | GB-SWK | IP 주소와 연결된 두 번째 레벨 지역의 ISO 3166-2 iP 주소와 연결된 두 번째 레벨 지역의 코드입니다. 실제 값을 사용할 수 없는 경우 이 필드에는 빈 문자열이 포함됩니다. 이 필드를 사용하려면 CIS Enterprise 요금제가
필요합니다. |
| ip.src.is_in_european_union | 부울 | 자세한 내용은 ip.src.is_in_european_union. |
이러한 표준 필드는 Wireshark 표시 필드 참조의 이름 지정 규칙을 따릅니다. 단, 위에 제공된 예제 값에서 약간의 미묘한 변형이 있을 수 있습니다.
표준 필드 외에 다음과 같은 Cloudflare 정의 필드도 사용할 수 있습니다.
| 필드 이름 | 유형 | 예제 값 | 참고 |
|---|---|---|---|
| cf.client.bot | 부울 | 예 | 해당 요청이 알려진 봇이나 크롤러로부터 온 것인지 여부와 상관없이, 의도가 선한지 악한지는 고려하지 않습니다. |
| cf.threat_score | 숫자 | 0 | 이 필드는 Cloudflare 위협 점수를 나타냅니다. 이전에는 위협 점수가 0~100점으로 표시되었으며, 0은 낮은 위험도를 의미했습니다. 이제 위협 점수는 항상 0(0)입니다. |
| cf.waf.score | 숫자 | 1-99 | 요청이 악의적일 가능성을 추정하는 머신 러닝 기반 점수입니다. 점수 범위는 1(악성일 가능성이 가장 높음)에서 99(안전할 가능성이 가장 높음)까지입니다. 점수가 낮을수록 위험도가 높다는 뜻입니다. 임계값 기반 방화벽 규칙을 만드는 데 유용합니다. |
| cf.ray_id | 문자열 | Cloudflare를 통과하는 모든 요청에 부여되는 식별자입니다. | |
| cf.edge.server_ip | IP 주소 | 이 필드는 HTTP 요청이 해결된 글로벌 네트워크의 IP 주소를 나타냅니다. 이 필드는 BYOIP 고객에게만 의미가 있습니다. | |
| cf.edge.server_port | IP 주소 | 1-65535 | 이 필드는 Cloudflare 글로벌 네트워크가 요청을 수신한 포트 번호를 나타냅니다. 이 필드를 사용하여 특정 포트의 트래픽을 필터링할 수 있습니다. |
| cf.tls_cipher | 문자열 | AES128-SHA256 | Cloudflare에 연결하기 위한 암호입니다. |
| cf.tls_version | 문자열 | TLSv1.2 | TLS 버전으로 Cloudflare에 연결합니다. |
ip.src.is_in_european_union
요청은 유럽연합(EU) 국가로부터 시작되며 CIS 기업용 요금제가 필요합니다.
다음 표에는 지리적 위치 데이터에 따른 EU 국가 목록이 나와 있습니다:
| 국가 코드 | 국가 이름 |
|---|---|
AT |
오스트리아 |
AX |
올란드 제도 |
BE |
벨기에 |
BG |
불가리아 |
CY |
키프로스 |
CZ |
체코 |
GE |
독일 |
DK |
덴마크 |
EE |
에스토니아 |
ES |
스페인 |
FI |
핀란드 |
FR |
프랑스 |
GF |
프랑스령 기아나 |
GP |
과들루프 |
GR |
그리스 |
HR |
크로아티아 |
HU |
헝가리 |
IE |
아일랜드 |
IT |
이탈리아 |
LT |
리투아니아 |
LU |
룩셈부르크 |
LV |
라트비아 |
MF |
세인트마틴 섬 |
MQ |
마르티니크 |
MT |
몰타 |
NL |
네덜란드 |
PL |
폴란드 |
PT |
포르투갈 |
RE |
레위니옹 |
RO |
루마니아 |
SE |
스웨덴 |
SI |
슬로베니아 |
SK |
슬로바키아 |
YT |
마요트 |
봇 관리 필드
기업용 봇 관리는 도메인에 정교한 봇 보호 기능을 제공하는 유료 애드온입니다. 고객은 콘솔 내에서 자동화된 트래픽을 식별하고 적절한 조치를 취하며 자세한 분석을 볼 수 있습니다.
다음 표는 사용 가능한 봇 필드에 대한 정보를 제공합니다:
| 필드 이름 | 유형 | 참고 |
|---|---|---|
cf.client.bot |
부울 | 이 필드는 선의 또는 악의의 의도에 관계없이 요청이 알려진 봇 또는 크롤러로부터 수신되는지 여부를 표시합니다. |
cf.bot_management.verified_bot |
부울 | 요청이 알려진 정상 봇 또는 크롤러에서 발생했는지 여부를 나타내며 cf.client.bot 와 동일한 정보를 제공합니다. 이 필드는 봇 관리가 활성화된 CIS 엔터프라이즈 요금제에서 사용할 수 있습니다. |
cf.bot_management.corporate_proxy |
부울 | 이 필드는 수신 요청이 식별된 기업 전용 클라우드 기반 기업 프록시 또는 보안 웹 게이트웨이에서 오는지 여부를 나타냅니다. 이 필드는 봇 관리가 활성화된 CIS 엔터프라이즈 요금제에서 사용할 수 있습니다. |
cf.bot_management.detection_ids |
숫자 | 이 필드에는 요청에 대한 봇 관리 휴리스틱 탐지에 대한 ID가 나열됩니다. 이 필드를 사용하여 규칙에서 특정 휴리스틱을 일치시키거나 제외할 수 있습니다. 하나의 요청에 여러 개의 탐지가 있을 수 있습니다. |
cf.bot_management.ja3_hash |
문자열 | 이 필드에는 잠재적인 봇 요청을 식별하는 데 도움이 되는 SSL / TLS 핑거프린트가 제공됩니다. 자세한 내용은 JA3/JA4 지문을 참조하세요. 이 필드를 사용하려면 봇 관리가 활성화된 CIS Enterprise 요금제가 필요합니다. |
cf.bot_management.ja4 |
문자열 | 이 필드에는 잠재적인 봇 요청을 식별하는 데 도움이 되는 SSL / TLS 핑거프린트가 제공됩니다. 자세한 내용은 JA3/JA4 지문을 참조하세요. 이 필드를 사용하려면 봇 관리가 활성화된 CIS Enterprise 요금제가 필요합니다. |
cf.bot_management.js_detection.passed |
부울 | 방문자가 이전에 JS 감지를 통과했는지 여부를 나타냅니다. 자세한 내용은 JavaScript 탐지를 참조하세요. 이 필드를 사용하려면 봇 관리가 활성화된 CIS Enterprise 요금제가 필요합니다. |
cf.bot_management.score |
숫자 | 이 필드는 1~99점 사이의 점수를 사용하여 요청이 봇으로부터 시작되었을 가능성을 나타냅니다. 점수가 낮으면 봇 또는 자동화된 상담원으로부터 요청이 들어온 것임을 나타냅니다. 점수가 높으면 사람이 요청을 발행했음을 나타냅니다. 이 필드를 사용하려면 봇 관리가 활성화된 CIS Enterprise 요금제가 필요합니다. |
cf.bot_management.static_resource |
숫자 | cf.bot_management.score 을 사용하여 규칙을 만들 때 정적 리소스를 포함할지 여부를 나타냅니다. 이 필드를 사용하려면 봇 관리가 활성화된 CIS Enterprise 요금제가 필요합니다. |
cf.verified_bot_category |
문자열 | 이 필드에는 인증된 봇의 유형과 목적을 입력합니다. 자세한 내용은 인증된 봇 카테고리를 참조하세요. |
함수
사용자 정의 규칙 언어에는 필드를 변환하는 여러 가지 함수가 있습니다.
현재 표현식 작성기에서는 이 기능들이 지원되지 않습니다.
| 함수 이름 | 인수 유형 | 리턴 유형 | 사용 예 | 참고 |
|---|---|---|---|---|
| lower | 문자열 | 문자열 | lower(http.host) == "www.example.com" |
문자열 필드를 소문자로 변환합니다. 대문자 ASCII 바이트만 변환되고, 다른 모든 바이트는 그대로 유지됩니다. |
| 상단 | 문자열 | 문자열 | upper(http.host) == "www.example.com" |
문자열 필드를 대문자로 변환합니다. 소문자 ASCII 바이트만 변환되고, 다른 모든 바이트는 그대로 유지됩니다. |
표현식
표현식은 입력되는 트래픽에 대한 일치를 기반으로 참 또는 거짓을 리턴합니다. 예를 들어, 다음과 같습니다.
http.host eq "www.example.com" and ip.src in 92.182.212.0/24
이 예제에서는 두 개의 단일 표현식이 복합 표현식을 구성합니다. 각 단일 표현식을 조건으로 생각하십시오. 각 조건은 복합 표현식의 최종 결과를 판별하기 위해 적용하기 전에 개별적으로 평가됩니다.
첫 번째 단일 표현식을 보면 다음과 같은 내용이 포함되어 있음을 알 수 있습니다.
- 필드 -
http.host - 비교 연산자 -
eq - 값 -
"www.example.com"
모든 조건의 구조가 동일한 것은 아닙니다. 다른 구조를 사용하는 추가 예제는 다음 절에서 설명합니다.
비교 연산자
표현식에서 사용할 수 있는 비교 연산자는 다음과 같습니다.
| 영어 | C와 유사 | 설명 |
|---|---|---|
| eq | == | 동일 |
| ne | != | 같지 않음 |
| lt | < | 미만 |
| le | <= | 이하 |
| gt | 초과 | |
| ge |
|
Greater than or equal to |
| 이(가) 다음 포함 | 정확히 포함 | |
| 일치 | ~ | Re2의 영향을 받는 정규식 |
| in | 값 세트로 표시되는 값입니다. ".." 표기법을 사용하는 범위를 지원합니다. | |
| not | ! | 부울 비교 참조 |
| bitwise_and | & | 비트 필드 값 비교 |
현재 표현식 빌더는 영어 연산자만 지원합니다.
표현식에는 영어 및 C와 유사한 연산자가 포함될 수 있습니다. 예를 들어, ip.src eq 93.184.216.34는 ip.src == 93.184.216.34와 동일합니다.
특정 비교 연산자는 유형에 따라 특정 필드에 적용됩니다. 다음 매트릭스는 다양한 필드 유형에 사용 가능한 연산자의 예제를 제공합니다.
| 영어 | C와 유사 | 문자열 | IP 주소 | 숫자 |
|---|---|---|---|---|
| eq | == | http.request.uri.path eq "/articles/2008/" | ip.src eq 93.184.216.0 | cf.threat_score eq 10 |
| ne | != | http.request.uri.path ne "/articles/2010/" | ip.src ne 93.184.216.0 | cf.threat_score ne 60 |
| lt | < | http.request.uri.path lt "/articles/2009/" | cf.threat_score lt 10 | |
| le | <= | http.request.uri.path le "/articles/2008/" | cf.threat_score le 20 | |
| gt | http.request.uri.path gt "/articles/2006/" | cf.threat_score gt 25 | ||
| ge |
|
Greater than or equal to | cf.threat_score ge 60 | |
| 이(가) 다음 포함 | http.request.uri.path contains "/articles/" | |||
| 일치 | ~ | http.request.uri.path ~ " [^/articles/2007-8/$] " | ||
| in | http.request.method in { "HEAD" "GET" } | ip.src in { 93.184.216.0 93.184.216.1 } | cf.threat_score in {0 2 10} |
문자열 값을 사용하는 표현식 평가는 대소문자를 구분합니다. 따라서 사용자 정의 규칙의 경우 하나 이상의 테스트 조건을 정의해야 할 수도 있습니다. 엔터프라이즈 고객은 정규식을 일치 연산자와 함께 사용하여 단일 표현식으로 여러 변형을 캡처할 수 있습니다.
부울 비교
부울 유형의 필드(예: ssl)의 경우, true 조건에 대해 평가할 때 필드가 표현식에 자체적으로 표시됩니다. false 조건의 경우, not 연산자가 적용됩니다.
| 예 | 거짓 |
|---|---|
| ssl | not ssl |
복합 표현식
논리 연산자를 사용하여 둘 이상의 단일 표현식을 그룹화하여 복합 표현식을 작성할 수 있습니다.
| 영어 | C와 유사 | 설명 | 예 | 우선순위 |
|---|---|---|---|---|
| not | ! | 논리 NOT | not ( http.host eq "www.example.com" and ip.src in 93.184.216.0/24 ) |
1 |
| 및 | && | 논리 AND | http.host eq "www.example.com" and ip.src in 93.184.216.0/24 |
2 |
| xor | ^^ | 논리적 XOR | http.host eq "www.example.com" xor ip.src in 93.184.216.0/24 |
3 |
| or | || | 논리 OR | http.host eq "www.example.com" or ip.src in 93.184.216.0/24 |
4 |
우선순위 순서를 변경하려면 괄호를 사용하여 표현식을 그룹화할 수 있습니다. 괄호를 사용하지 않으면 표현식이 표준 우선순위에 따라 내재적으로 그룹화됩니다.
ssl and http.request.uri.path eq /login or http.request.uri.path eq /oauth
명시적 그룹화 적용:
(ssl and http.request.uri.path eq /login) or http.request.uri.path eq /oauth
우선순위 부여 또는 소괄호 사용:
ssl and (http.request.uri.path eq /login or http.request.uri.path eq /oauth)
그룹화에 not이 사용되는 경우, 단일 비교를 부정하는 데 사용될 수 있습니다. 예를 들어, not ip.src eq 93.184.216.0은 not (ip.src eq 93.184.216.0)과 대등합니다.
마지막으로 그룹화된 표현식을 부정할 수도 있습니다.
not (http.request.method eq "POST" and http.request.uri.path eq "/login")
Wireshark 표시 필터의 변형
사용자 정의 규칙 표현식은 Wireshark의 표시 필터에서 착안한 것입니다. 단, 구현은 다음과 같은 방식으로 변형됩니다.
- CIDR IP 동일성 테스트의 경우, Wireshark가
ip.src == 1.2.3.0/24형식의 범위를 허용하는 반면 CIS는 단일 IP 주소를 사용하는 동일성 테스트만 지원합니다. CIDR을 비교하려면in연산자를 사용하십시오. 예를 들어,ip.src in {1.2.3.0/24}입니다. - Wireshark에서
ssl은 여러 가지 방법의 비교에 사용할 수 있는 수백 개의 다양한 유형의 기타 필드를 포함하는 프로토콜 필드입니다. 그러나 사용자 정의 규칙에서 ‘ssl’는 클라이언트에서 CIS 로 연결되는 통신이 암호화되었는지 여부를 판단하는 데 사용되는 단일 부울 필드입니다. slice연산자가 지원되지 않습니다.- 모든 함수가 지원되는 것은 아닙니다. 현재
len()및count()는 지원되지 않습니다.
표현의 제한
규칙 표현식에는 다음과 같은 제한 사항이 적용됩니다:
-
규칙 표현식은 최대 4,096자까지 포함할 수 있습니다.
UI에서 표현식 생성기를 사용하는 경우, 생성된 표현식 미리보기에도 동일한 제한이 적용됩니다.
-
규칙 표현식에는 최대 64개의 정규 표현식(regex)을 포함할 수 있습니다.