CrowdStrike Falcon
1. Thành phần của pack
| Thành phần | Số lượng | File |
|---|---|---|
| Connector | 1 | connectors/crowdstrike/ |
| Parser | 1 | parsers/crowdstrike-parser.yaml |
| Streaming rules | 5 | rules/streaming/ |
| Correlation rules | 2 | rules/correlation/ |
| Dashboard | 1 | dashboards/crowdstrike-overview-dashboard.yaml |
| Report | 1 | reports/crowdstrike-security-report.yaml |
2. Phạm vi thu thập: vì sao chỉ có hai luồng
Pack thu thập Alerts và Host inventory. Quyết định này dựa trên kết quả probe trên tenant thực tế, không phải dựa trên danh mục API.
| Falcon API | Endpoint | Kết quả probe | Có trong pack |
|---|---|---|---|
| Unified Alerts | /alerts/queries/alerts/v2 | 200, trả về dữ liệu | ✅ |
| Hosts | /devices/queries/devices/v1 | 200, trả về dữ liệu | ✅ |
| Detects (legacy) | /detects/queries/detects/v1 | 404 "API endpoint has been decommissioned" | ❌ CrowdStrike đã gỡ bỏ |
| Incidents | /incidents/queries/incidents/v1 | 404 | ❌ không có trên tenant đã test |
| Behaviors | /incidents/queries/behaviors/v1 | 404 | ❌ |
| Audit events | /audit-events/queries/audit-events/v1 | 404 | ❌ |
| Spotlight vulnerabilities | /spotlight/queries/vulnerabilities/v1 | 403 scope not permitted | ❌ cần licence module riêng |
Unified Alerts v2 chính là luồng hợp nhất do CrowdStrike gộp Endpoint Protection, NGAV, on-demand scan, Identity Protection và Cloud detection vào một feed duy nhất, nên đã bao phủ toàn bộ những gì Detects API cũ trả về. Việc đóng gói thêm Incidents mà không thể test trên tenant thực đồng nghĩa với đưa code chưa kiểm chứng đến khách hàng, nên được ghi nhận vào roadmap.
3. Điều kiện tiên quyết
3.1 Tạo API client trên Falcon console
- Falcon console → Support and resources → API clients and keys.
- Add new API client.
- Đặt tên, ví dụ
CMC SecOps SIEM. - Cấp các scope sau, chỉ quyền Read:
Scope Dùng cho Alertsluồng alert Hostsluồng host inventory - Lưu lại. Console chỉ hiển thị client secret duy nhất một lần — sao chép ngay.
- Ghi lại Base URL hiển thị trên cùng màn hình, đây là cloud region của bạn.
3.2 Base URL theo region
| Region | Base URL |
|---|---|
| US-1 | https://api.crowdstrike.com |
| US-2 | https://api.us-2.crowdstrike.com |
| EU-1 | https://api.eu-1.crowdstrike.com |
| US-GOV-1 | https://api.laggar.gcw.crowdstrike.com |
Nếu chưa rõ region, gọi /oauth2/token tới bất kỳ base URL nào rồi đọc response header X-Cs-Region.
Credential của Falcon API client không hết hạn, khác với token của user console.
4. Cấu hình connector
Cài pack từ Marketplace, sau đó vào Data Collection → Data Connectors → Add Connection → chọn connector type crowdstrike và điền các trường bên dưới.
| Trường | Key | Kiểu | Bắt buộc | Mặc định | Ghi chú |
|---|---|---|---|---|---|
| API Base URL | base_url | string | ✅ | — | URL region lấy từ bảng trên |
| API Client ID | client_id | string | ✅ | — | Từ màn hình API client |
| API Client Secret | client_secret | password | ✅ | — | Chỉ hiển thị một lần khi tạo |
| Collect Alerts | collect_alerts | string | — | "true" | Chấp nhận true/false, 1/0, yes/no |
| Collect Host Inventory | collect_hosts | string | — | "false" | Xem cảnh báo volume bên dưới |
| Extra Alert FQL Filter | alert_filter | string | — | — | Nối vào alert query bằng AND |
| Page Size | page_size | int | — | 500 | Số ID mỗi lần gọi query, Falcon cho phép 1–1000 |
| Initial Lookback Hours | lookback_hours | int | — | 24 | Chỉ dùng ở lần chạy đầu tiên |
| Poll Interval (minutes) | time_interval | int | ✅ | 5 |
4.1 Kiểu dữ liệu rất quan trọng khi cấu hình qua API
Log-source validator của platform chỉ chấp nhận ba kiểu config_schema: string, password và int. Vì vậy ba trường mang nghĩa boolean được khai báo là string và do connector tự ép kiểu — chấp nhận true, 1, yes, on, enabled (không phân biệt hoa thường) và coi giá trị rỗng là default đã khai báo.
Khi đẩy cấu hình qua API thay vì qua console, gửi các trường này dưới dạng JSON string, còn trường số thì dưới dạng JSON number:
{
"type": "crowdstrike",
"base_url": "https://api.us-2.crowdstrike.com",
"client_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"client_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"collect_alerts": "true",
"collect_hosts": "false",
"page_size": 500,
"lookback_hours": 24,
"time_interval": 5
}
4.2 Cảnh báo volume của host inventory
collect_hosts mặc định tắt có chủ đích. Luồng host trả về một record cho mỗi endpoint có check-in kể từ lần poll trước, nên với fleet 5.000 endpoint poll mỗi 5 phút, luồng này sẽ chiếm phần lớn EPS. Chỉ bật khi bạn cần rule sensor-health và panel sensor health trên dashboard, và nên nâng time_interval lên 60 cho trường hợp này.
4.3 Thu hẹp luồng alert ngay tại nguồn
alert_filter nhận mọi biểu thức FQL bổ sung của Falcon, được áp dụng phía server trước khi truyền dữ liệu. Một số ví dụ hữu ích:
| Mục tiêu | Giá trị |
|---|---|
| Chỉ lấy alert endpoint protection | product:'epp' |
| Từ mức Medium trở lên | severity:>=50 |
| Loại trừ một detection gây nhiễu | display_name:!'AdwareBundler' |
5. Connector hoạt động như thế nào
- Xác thực.
POST /oauth2/tokenvới client ID và secret dạng form-encoded. Falcon trả về bearer token có hiệu lực 1799 giây. Connector làm mới token sớm 60 giây để một lần poll dài không rơi vào thời điểm hết hạn. - Query. Endpoint FQL query trả về danh sách ID, phân trang theo
offsetcho đến khi đủ tổng số mà API báo. - Resolve. Các ID được POST tới entity endpoint theo lô 100 để lấy record đầy đủ.
- Watermark. Mỗi stream giữ cursor riêng —
created_timestampcho alert,last_seencho host — nên bật stream này không ảnh hưởng stream kia. Falcon trả về độ chính xác nanosecond nhưng FQL chỉ nhận đến giây, nên cursor bị cắt xuống mức giây; phần replay nhỏ trong cùng một giây được idempotency key hấp thụ. - Tag. Mỗi record được gắn
_log_typelàalerthoặchosttrước khi chuyển cho parser.
6. Hành vi của parser
Parser rẽ nhánh theo _log_type, có fallback nhận diện theo cấu trúc (có composite_id là alert, có device_id là host) để vẫn chạy đúng khi record được replay mà không có tag.
6.1 Prevention outcome — field dẫn xuất quan trọng nhất
Falcon chỉ ghi nhận hành động thực tế của sensor trong pattern_disposition_description — một chuỗi free-text. Parser rút gọn nó thành một event.action duy nhất để rule và dashboard có thể pivot:
event.action | event.outcome | Khớp từ |
|---|---|---|
not_blocked_policy_disabled | failure | chứa "policy disabled" |
not_blocked | failure | chứa "would have been" |
prevented | success | chứa "prevention" |
quarantined | success | chứa "quarantine", hoặc quarantined: true |
detected | unknown | các trường hợp còn lại |
Thứ tự rẽ nhánh là có chủ đích. Các câu mô tả trường hợp không bị chặn cũng nhắc đến "prevention" — ví dụ "process would have been killed if the prevention policy had been enabled" — nên nếu kiểm tra "prevention" trước thì một threat không bị chặn sẽ bị gán nhãn là đã prevented — ngược hoàn toàn với sự thật. Các trường hợp phủ định vì vậy được đối chiếu trước.
6.2 Severity
severity được dùng trực tiếp (Falcon đã chấm điểm 0–100), fallback sang priority_value. Nhãn lấy từ severity_name, hoặc suy ra theo ngưỡng 90/70/50 khi Falcon không trả về. Những alert Falcon không chấm điểm được gán mức nền 21 / low thay vì 0 / để trống, để chúng vẫn nằm trong bộ lọc severity và biểu đồ tròn thay vì biến mất âm thầm khỏi mọi chart.
6.3 Ánh xạ field
| Nhóm | Field |
|---|---|
| Threat | threat.id, threat.name, threat.type (scenario, nếu không có thì technique), threat.category (tactic), threat.rule (technique ID), threat.status, threat.score, threat.filename |
| File | file.name, file.path, file.extension, file.hash.md5, file.hash.sha256; SHA1 đưa vào related.hash và labels.file_sha1 vì Field Standard không có file.hash.sha1 |
| Process | process.name, process.executable, process.command_line, process.pid, process.entity_id, process.parent.pid; tên và command line của parent và grandparent đưa vào labels |
| User | user.name, user.id (SID), user.domain, user.email |
| Host | host.id, host.name, host.ip, host.os.family, host.os.full, host.type, agent.id, agent.version |
| Rule | rule.id (Falcon pattern ID), rule.name |
Dữ liệu MITRE được mang trong threat.category / threat.rule / labels vì Field Standard không có field threat.tactic.* hay threat.technique.*.
threat.type chứa behavioural scenario của Falcon (ransomware, evade_detection, suspicious_activity, NGAV, attacker_methodology, user_compromise) khi Falcon có gán, nếu không thì fallback sang attack technique. Cả hai đều là phân loại theo hành vi — đúng với định nghĩa threat.type trong Field Standard. Scenario bắt buộc phải nằm ở một field first-class chứ không phải trong labels, vì rule sandbox từ chối labels.* trong selection — rule viết dựa trên labels.scenario sẽ lỗi invalid sandbox input: field 'labels.scenario' ... does not exist or is not allowed. Mọi thứ detection rule cần đối chiếu đều phải được đưa ra khỏi labels.
Các thuộc tính riêng của Falcon không có chỗ trong Field Standard được giữ lại dưới labels: objective, scenario, pattern_disposition, prevention_policy, local_prevalence, global_prevalence, falcon_link, cid, aggregate_id, external_ip, site_name, cùng các thuộc tính host reduced_functionality_mode, rtr_state, kernel_version, serial_number, criticality và một số field khác.
6.4 Host event
| Điều kiện | event.action | Severity |
|---|---|---|
reduced_functionality_mode khác no | sensor_reduced_functionality | 47 / medium |
status khác normal | host_<status> | 47 / medium |
| các trường hợp còn lại | sensor_checkin | 21 / low |
Giá trị bình thường là sensor_checkin chứ không phải host_checkin, vì rule sensor-health đối chiếu theo tiền tố host_ để bắt mọi trạng thái bất thường mà CrowdStrike có thể bổ sung sau này. Một lần check-in khỏe mạnh phải nằm ngoài tiền tố đó.
7. Detection Rules
7.1 Streaming
| Rule | Level | MITRE ATT&CK | Kích hoạt khi |
|---|---|---|---|
crowdstrike-high-severity-detection | high | TA0002 Execution · T1204 User Execution | event.severity_label là high hoặc critical |
crowdstrike-threat-not-blocked | high | TA0005 Defense Evasion · T1562 Impair Defenses | event.action là not_blocked hoặc not_blocked_policy_disabled |
crowdstrike-defense-evasion-attempt | high | TA0005 Defense Evasion · T1562.001 Impair Defenses: Disable or Modify Tools | threat.category là Defense Evasion |
crowdstrike-ransomware-activity | critical | TA0040 Impact · T1486 Data Encrypted for Impact | threat.type là ransomware |
crowdstrike-sensor-health-degraded | medium | TA0005 Defense Evasion · T1562.001 Impair Defenses: Disable or Modify Tools | host event có RFM hoặc trạng thái bất thường |
crowdstrike-threat-not-blocked là rule có giá trị cao nhất trong pack. Falcon đã xác định chính xác threat nên không còn mơ hồ về verdict, nhưng tiến trình độc hại vẫn chạy đến cùng do một lỗ hổng cấu hình policy — và lỗ hổng đó sẽ tiếp tục cho threat kế tiếp đi qua. Rule này vừa kích hoạt hành động incident response, vừa sinh ticket chỉnh cấu hình.
7.2 Correlation
| Rule | Level | MITRE ATT&CK | Logic | Frequency | Lookback |
|---|---|---|---|---|---|
crowdstrike-malware-outbreak | critical | TA0002 Execution · T1204 User Execution | cùng threat.name trên ≥ 3 host.name khác nhau | 5m | 15m |
crowdstrike-repeated-detections-single-host | high | TA0002 Execution · T1059 Command and Scripting Interpreter | ≥ 5 threat.name khác nhau trên cùng một host.name | 5m | 15m |
8. Dashboard và report
Overview dashboard gồm alert volume theo phản ứng của sensor, 4 chỉ số chính (tổng số, high severity, not blocked, prevented), phân bố MITRE tactic và sensor response, top endpoint / detection / technique, bảng thời gian thực các threat không bị chặn, và bảng sensor health.
Security report bổ sung phân bố severity, số endpoint bị ảnh hưởng (distinct) và mapping control PCI DSS / ISO 27001, phục vụ rà soát endpoint protection định kỳ hàng tháng và tinh chỉnh prevention policy.
Cả hai đều dùng event.outcome = failure làm bộ lọc duy nhất cho "not blocked", vì parser gán giá trị này cho cả hai biến thể không bị chặn.
9. Kiểm thử
Tài sản test nằm ở thư mục ngang hàng cmc-crowdstrike-security-pack-tests/, bên ngoài pack, vì publisher từ chối mọi thư mục ở gốc pack không thuộc cấu trúc cho phép.
# 1. Connector unit tests (33 tests: OAuth2 lifecycle, paging, watermark, config coercion)
cd cmc-crowdstrike-security-pack-tests/connector && python3 -m pytest . -q
# 2. Parser against fixtures, via the Vector VRL CLI in Docker
cd cmc-crowdstrike-security-pack-tests && ./parser/run_parser_test.sh
# 3. Detection rule logic, using the normalized output of step 2 as fixtures
python3 test_crowdstrike_rules.py
# 4. Structural validation of every YAML/JSON artifact, plus parser copy sync
./parser/validate_pack.sh
# 5. Strip indented comments from the parser and re-sync the connector copy
./parser/strip_inline_comments.sh
Fixture trong parser/raw/ là dữ liệu tổng hợp nhưng trung thực về cấu trúc so với record Falcon thực tế, bao phủ các nhánh prevented, policy-disabled, detect-only, alert không được chấm điểm, cùng một host khỏe mạnh và một host ở trạng thái RFM.
10. Lưu ý vận hành
- Connector mang theo bản sao parser của riêng nó tại
connectors/crowdstrike/parser.yamlvà không có cơ chế tự đồng bộ. Sau mỗi lần sửaparsers/crowdstrike-parser.yaml, phải copy sang.validate_pack.shkiểm tra hai file giống nhau từng byte. - Tuyệt đối không đặt comment trong thân parser. Parser loader của platform coi mọi dòng có ký tự khác khoảng trắng đầu tiên là
#là ranh giới block, nên một comment thụt lề sẽ âm thầm cắt cụt block#conditionalvà đẩy lên một chương trình thiếu dấu ngoặc. Lỗi này vẫn qua đượcvalidatevà chỉ lộ ra ở bướctestvới thông báo khó hiểuE204 syntax error ... unexpected end of program, trỏ vào một dòng do server tự thêm. Hãy chạystrip_inline_comments.shtrước khi publish; phần giải thích logic nên đặt trong tài liệu này. labels.*không dùng được trong selection của detection rule. Mọi field mà rule cần đối chiếu phải được đưa lên field chuẩn của Field Standard.- Chỉ
string,passwordvàintlà kiểuconfig_schemahợp lệ.ccsp-client validate,testvàpublishđều PASS dù kiểu sai; lỗi chỉ xuất hiện khi người dùng lưu log source, dưới dạngfailed to validate log source structure: invalid type for field: <key>. - Parser bị giới hạn trong allowlist VRL phía server.
filter,join,strip_whitespacevàip_cidr_containsđều bị từ chối, và array cùng closure được tránh hoàn toàn. Đây là lý do parser đọc các field scalartactic/techniquethay vì mảngmitre_attack[].
11. Xử lý sự cố
| Triệu chứng | Nguyên nhân | Cách xử lý |
|---|---|---|
failed to validate log source structure: invalid type for field: collect_alerts | Kiểu config_schema nằm ngoài string / password / int | Không xảy ra từ 1.0.0; nếu gặp, kiểm tra connector.json có bị sửa không |
| Test connection lỗi ngay lập tức | Sai base_url so với region của tenant | Xác nhận region qua header X-Cs-Region khi request token |
403 access denied, authorization failed ở luồng alert | API client thiếu scope Alerts:read | Sửa API client trên console và lưu lại |
| Rule sensor health và panel dashboard trống | collect_hosts đang tắt | Đặt thành true, chấp nhận đánh đổi về volume |
| Không có alert nào sau khi bật connector | alert_filter quá hẹp, hoặc tenant không có alert trong khoảng lookback | Xóa alert_filter và tăng lookback_hours cho một chu kỳ poll |
| Alert ngừng về sau khoảng 30 phút | Lỗi làm mới token | Kiểm tra kết nối outbound tới base URL; connector làm mới trước hạn 60 giây |
Changelog
1.0.1
- Fix: cursor map theo từng stream (
alert/host) nay được lưu dưới dạng string JSON-encoded. Platform chỉ lưu watermark kiểu string, nêndicttrước đây bị ép kiểu và không đọc lại được, khiến mọi lần chạy đều pull lại từlookback_hours. Giá trị dict cũ vẫn được chấp nhận khi đọc, và giá trị không parse được sẽ fallback vềlookback_hours.
1.0.0
- Phát hành lần đầu: pull connector OAuth2 cho Falcon Alerts v2 và Hosts, parser thống nhất cho cả hai luồng, 5 streaming rule và 2 correlation rule, overview dashboard và compliance report.
Hỗ trợ
- Lỗi platform/Góp ý pack: Dùng tính năng feedback trên trang Marketplace