cloudflare-firewall-events
Cloudflare 서비스에서 존(zone) 단위의 방화벽 이벤트 목록을 조회합니다.
문법
옵션
- profile=STRING
- 선택 옵션. Cloudflare 접속 프로파일 식별자입니다. 생략하면 사용 가능한 모든 Cloudflare 프로파일을 순회하며 조회합니다. 쉼표로 여러 프로파일을 지정할 수 있습니다.
- from=DATETIME
- 선택 옵션. yyyyMMddHHmmss 포맷으로 조회 범위의 시작 시각을 지정합니다. 현재 시각으로부터 31일 이내여야 합니다. (기본값 31일 전)
- to=DATETIME
- 선택 옵션. yyyyMMddHHmmss 포맷으로 조회 범위의 끝 시각을 지정합니다. (기본값 현재 시간)
- duration=STRING
- 선택 옵션. 현재 시각으로부터 일정 시간 범위 이내로 한정합니다. s(초), m(분), h(시), d(일), mon(월) 단위를 사용합니다. 예:
10s는 현재 시각으로부터 10초 이전까지의 범위입니다. - order=STRING
- 선택 옵션. 시간 정렬 순서입니다.
asc또는desc를 지정합니다. (기본값 desc) - extra=BOOL
- 선택 옵션. Enterprise 전용 필드(WAF 공격 점수 등) 포함 여부입니다. t/true 또는 f/false로 지정합니다. (기본값 f)
출력 필드
| 필드 | 타입 | 이름 | 설명 |
|---|---|---|---|
| _time | 날짜 | 시간 | 엣지에서 이벤트가 발생한 날짜와 시간 |
| profile | 문자열 | 접속 프로파일 | Cloudflare 접속 프로파일 식별자 |
| ray_id | 문자열 | Ray ID | Cloudflare Ray ID |
| src_ip | IP 주소 | 출발지 IP | 방문자의 IP 주소 (IPv4 또는 IPv6) |
| src_country | 문자열 | 출발지 국가 | 요청이 시작된 국가 |
| src_asn | 문자열 | 출발지 ASN | 출발지 네트워크의 자율 시스템 번호(ASN) |
| action | 문자열 | 조치 | 이 요청에 대해 Cloudflare 방화벽이 취한 1차 조치의 코드 |
| signature | 문자열 | 시그니처 | 이 요청으로 트리거된 규칙의 설명 |
| attack_score | 정수 | 공격 점수 | 전체 공격 점수 (Enterprise 전용, extra=t) |
| attack_score_class | 문자열 | 공격 점수 분류 | 공격 점수의 분류 (Enterprise 전용, extra=t) |
| ml_attack_score | 정수 | ML 공격 점수 | 머신러닝 기반 공격 점수 (Enterprise 전용, extra=t) |
| sqli_score | 정수 | SQLi 점수 | SQL 인젝션 공격 점수 (Enterprise 전용, extra=t) |
| xss_score | 정수 | XSS 점수 | 크로스 사이트 스크립팅 공격 점수 (Enterprise 전용, extra=t) |
| rce_score | 정수 | RCE 점수 | 원격 코드 실행 공격 점수 (Enterprise 전용, extra=t) |
| ml_sqli_score | 정수 | ML SQLi 점수 | 머신러닝 기반 SQL 인젝션 점수 (Enterprise 전용, extra=t) |
| ml_xss_score | 정수 | ML XSS 점수 | 머신러닝 기반 XSS 공격 점수 (Enterprise 전용, extra=t) |
| rule_id | 문자열 | 규칙 ID | 트리거된 규칙 식별자 |
| ruleset_id | 문자열 | 규칙 세트 ID | 규칙 세트 식별자 |
| is_scan_failed | 정수 | 스캔 실패 | 콘텐츠 스캔 실패 상태 |
| leaked_credential | 문자열 | 유출된 자격증명 | 자격증명 유출 검사 결과 |
| status | 정수 | 상태 | 엣지 응답 상태 코드 |
| origin_status | 정수 | 원본 상태 | 브라우저로 반환된 HTTP 원본 응답 상태 코드 |
| method | 문자열 | 메서드 | 방문자가 사용한 HTTP 메서드 |
| scheme | 문자열 | 스킴 | 방문자가 요청한 URL 스킴 |
| host | 문자열 | 호스트 | 방문자가 요청한 HTTP 호스트명 |
| path | 문자열 | 경로 | 방문자가 요청한 경로 |
| query | 문자열 | 쿼리 | 방문자가 요청한 쿼리 문자열 |
| http_ver | 문자열 | HTTP 버전 | 방문자가 요청한 HTTP 프로토콜 버전 |
| user_agent | 문자열 | 사용자 에이전트 | 방문자의 사용자 에이전트 문자열 |
| ref | 문자열 | 참조 | 이벤트 참조 |
| referer_scheme | 문자열 | 리퍼러 스킴 | 방문자가 요청한 리퍼러 URL 스킴 |
| referer_host | 문자열 | 리퍼러 호스트 | 리퍼러 호스트 |
| referer_path | 문자열 | 리퍼러 경로 | 방문자가 요청한 리퍼러 경로 |
| referer_query | 문자열 | 리퍼러 쿼리 | 방문자가 요청한 리퍼러 쿼리 문자열 |
| zone_ver | 정수 | 존 버전 | 존 버전 번호 |
| source | 문자열 | 소스 | 이벤트 소스 |
| edge_colo_id | 문자열 | 엣지 데이터 센터 ID | PoP 식별자 |
| edge_colo_name | 문자열 | 엣지 데이터 센터 이름 | PoP 이름 |
설명
cloudflare-firewall-events는 Cloudflare GraphQL Analytics API의 firewallEventsAdaptive 데이터셋을 조회해 존 단위의 방화벽 이벤트를 수집합니다. 존 ID가 필요하므로, 조회 대상 프로파일에 Zone ID가 설정되어 있어야 합니다.
명령 실행 시 먼저 존별 조회 한도(settings)를 1회 조회합니다. 여기서 얻은 보존기간(notOlderThan)과 단일 쿼리 최대 범위(maxDuration)를 사용해, 보존기간보다 오래된 from은 조회 가능한 가장 이른 시점으로 자동 조정되고, 전체 구간은 maxDuration 단위(한도를 확인하지 못하면 기본 1일)로 분할되어 조회됩니다. 각 구간은 (datetime, clientIP) 커서로 페이지네이션되며, 페이지 경계에서 발생할 수 있는 중복을 제거합니다. profile을 생략하면 모든 프로파일을 순회하며, 각 행에는 수집 출처가 profile 필드로 기록됩니다.
사용 예
예시: 최근 1일 차단된 요청 조회
상황: 최근 24시간 동안 방화벽이 차단(block)한 요청을 최신순으로 확인합니다.
예상 결과:
| _time | src_ip | src_country | action | signature | host |
|---|---|---|---|---|---|
| 2026-07-14 09:58:03 | 192.0.2.1 | KR | block | SQLi - Anomaly | example.com |
| 2026-07-14 09:41:20 | 192.0.2.2 | US | block | Rate Limiting | example.com |
결과 해석: 최근 하루 동안 차단된 요청이 최신순으로 표시됩니다. src_ip, src_country로 공격 출처를, signature로 어떤 규칙에 의해 차단되었는지 확인할 수 있습니다.
예시: 출발지 IP별 차단 이벤트 집계
상황: 최근 7일간 방화벽 이벤트를 출발지 IP별로 집계해 가장 활동이 많은 IP를 찾습니다.
cloudflare-firewall-events profile=my_profile duration=7d
| stats count by src_ip, action
| sort -count
| limit 10
예상 결과:
| src_ip | action | count |
|---|---|---|
| 192.0.2.1 | block | 842 |
| 192.0.2.2 | challenge | 301 |
| 192.0.2.1 | managed_challenge | 77 |
결과 해석: 출발지 IP와 조치별로 이벤트 건수가 집계되어 상위 10개가 표시됩니다. 특정 IP(192.0.2.1)에서 다수의 차단이 발생했다면 지속적인 공격 시도로 판단하고 차단 규칙 추가를 검토할 수 있습니다.