필드, 함수 및 표현식 사용
방화벽 규칙은 더 이상 사용되지 않습니다. CIS 기존 방화벽 규칙을 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 헤더 | |
| 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 | 클라이언트 TCP 의 IP 주소. 필요에 따라 원본 클라이언트의 실제 IP 주소를 반영하도록 조정할 수 있습니다(예: X-Forwarded-For 또는 X-Real-IP와 같은 HTTP 헤더를 사용하는 방식) |
| ip.geoip.asnum | 숫자 | 222 | Autonomous System(AS) 수 |
| ip.geoip.country | 문자열 | GB | 2문자국가 코드 |
| ssl | 부울 | 예 | 클라이언트에 대한 HTTP 연결이 암호화되는지 여부 |
이러한 표준 필드는 Wireshark 표시 필드 참조의 이름 지정 규칙을 따릅니다. 단, 위에 제공된 예제 값에서 약간의 미묘한 변형이 있을 수 있습니다.
표준 필드 외에 다음과 같은 Cloudflare 정의 필드도 사용할 수 있습니다.
| 필드 이름 | 유형 | 예제 값 | 참고 |
|---|---|---|---|
| cf.client.bot | 부울 | 예 | 이 필드는 선의 또는 악의의 의도에 관계없이 요청이 알려진 봇 또는 크롤러로부터 수신되는지 여부를 표시합니다. |
| cf.threat_score | 숫자 | 0-100 값 | 이 필드는 위험성 점수를 나타내며, 0은 Cloudflare에 의해 판별된 낮은 위험성을 표시합니다. 10보다 큰 값은 스팸 발송자나 봇을 나타낼 수 있으며, 40보다 큰 값은 인터넷상의 악의적인 사용자를 의미합니다. 60보다 높은 값이 나타나는 경우는 드물기 때문에, 방화벽 규칙을 조정하여 10보다 큰 값에 대해서는 확인 요청을 보내고, 50보다 큰 값은 차단하도록 설정하십시오. |
| cf.waf.score | 숫자 | 1-99 | 요청이 악의적일 가능성을 추정하는 머신 러닝 기반 점수입니다. 점수 범위는 1(악성일 가능성이 가장 높음)에서 99(안전할 가능성이 가장 높음)까지입니다. 점수가 낮을수록 위험도가 높다는 뜻입니다. 임계값 기반 방화벽 규칙을 만드는 데 유용합니다. |
함수
방화벽 규칙 언어에는 필드를 변환하는 여러 가지 기능이 있습니다.
이러한 함수는 현재 표현식 빌더에서 지원되지 않습니다.
| 함수 이름 | 인수 유형 | 리턴 유형 | 사용 예 | 참고 |
|---|---|---|---|---|
| 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 | ( http.host ≠ "www.example.com" 및 ip.src ≠ 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 으로의 연결이 암호화되었는지 여부를 판단하는 데 사용되는 단일 부울(Boolean) 필드입니다. slice연산자가 지원되지 않습니다.- 모든 함수가 지원되는 것은 아닙니다. 현재
len()및count()는 지원되지 않습니다.