Collect CrowdStrike IOC logs
Overview
This parser extracts CrowdStrike Falcon Intelligence data from JSON-formatted messages. It transforms various IOC fields into the UDM format, handling different indicator types (domains, IPs, URLs, hashes, etc.) and their associated metadata, including relations, labels, and threat information. The parser also performs data validation and error handling. It prioritizes JSON parsing, falling back to grok matching if necessary, and drops malformed messages.
Before you begin
- Ensure that you have a Google SecOps instance.
- Ensure that you have access to the CrowdStrike Falcon Intelligence platform with appropriate permissions.
Configure a feed in Google SecOps to ingest the CrowdStrike IOC logs
- Go to SIEM Settings > Feeds.
- Click Add new.
- In the Feed name field, enter a name for the feed (for example, CrowdStrike IOC Logs).
- Select Webhook as the Source type.
- Select Crowdstrike IOC as the Log type.
- Click Next.
- Optional: Specify values for the following input parameters:
- Split delimiter: the delimiter that is used to separate log lines, such as
\n
. - Asset namespace: the asset namespace.
- Ingestion labels: the label applied to the events from this feed.
- Split delimiter: the delimiter that is used to separate log lines, such as
- Click Next.
- Review the feed configuration in the Finalize screen, and then click Submit.
- Click Generate Secret Key to generate a secret key to authenticate this feed.
- Copy and store the secret key. You cannot view this secret key again. If needed, you can regenerate a new secret key, but this action makes the previous secret key obsolete.
- On the Details tab, copy the feed endpoint URL from the Endpoint Information field. You need to specify this endpoint URL in your client application.
- Click Done.
Create an API key for the webhook feed
Go to Google Cloud console > Credentials.
Click Create credentials, and then select API key.
Restrict the API key access to the Google Security Operations API.
Specify the endpoint URL
- In your client application, specify the HTTPS endpoint URL provided in the webhook feed.
Enable authentication by specifying the API key and secret key as part of the custom header in the following format:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Recommendation: Specify the API key as a header instead of specifying it in the URL.
If your webhook client doesn't support custom headers, you can specify the API key and secret key using query parameters in the following format:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Replace the following:
ENDPOINT_URL
: the feed endpoint URL.API_KEY
: the API key to authenticate to Google SecOps.SECRET
: the secret key that you generated to authenticate the feed.
Create a CrowdStrike webhook
- Sign in to the CrowdStrike Falcon Intelligence console.
- Go to the CrowdStrike Store.
- Find Webhook.
- Activate the Webhook integration.
- Click Configure.
- Select Add configuration.
- Ensure only IOCs are sent to the webhook.
- Paste the endpoint URL into the Webhook URL field in the Configure Webhook screen.
- Click Save.
- CrowdStrike now sends generated events to the specified Google SecOps feed.
UDM Mapping Table
Log Field | UDM Mapping | Logic |
---|---|---|
_marker |
event.idm.entity.entity.labels.value |
The value of the _marker field is mapped directly. |
actors |
event.idm.entity.entity.group.group_display_name |
If the first value in actors contains "panda", "bear", "kitten", "chollima", "jackal", or "Spider", it is mapped and the event.idm.entity.entity.location.country_or_region is derived (China, Russia, Iran, North Korea, Activist groups, Criminal groups respectively). Other values in actors are added as labels with key "actor" within event.idm.entity.entity.group.attribute.labels . |
actors |
event.idm.entity.entity.location.country_or_region |
Derived based on the first value in actors (see above). |
deleted |
event.idm.entity.metadata.threat.action |
If deleted is "false", the action is "BLOCK". If deleted is "true", the action is "ALLOW". |
deleted |
event.idm.entity.metadata.threat.action_details |
The value of deleted is mapped directly. |
domain_types |
event.idm.entity.metadata.threat.detection_fields.value |
All values in domain_types are concatenated with commas and mapped with key "domain_types". |
id |
event.idm.entity.metadata.product_entity_id |
The value of id is mapped directly. |
indicator |
event.idm.entity.entity.hostname |
Mapped if type is "domain". |
indicator |
event.idm.entity.entity.file.md5 |
Mapped if type is "hash_md5" and the value is a valid MD5 hash. |
indicator |
event.idm.entity.entity.file.sha1 |
Mapped if type is "hash_sha1" and the value is a valid SHA1 hash. |
indicator |
event.idm.entity.entity.file.sha256 |
Mapped if type is "hash_sha256" and the value is a valid SHA256 hash. |
indicator |
event.idm.entity.entity.ip |
Mapped if type is "ip_address" and the value is a valid IP address. |
indicator |
event.ioc.ip_and_ports.ip_address |
Mapped if type is "ip_address" and the value is a valid IP address. |
indicator |
event.idm.entity.entity.url |
Mapped if type is "url". |
indicator |
event.idm.entity.entity.resource.name |
Mapped if type is "device_name" or "mutex_name". |
indicator |
event.idm.entity.entity.user.email_addresses |
Mapped if type is "email_address" and the value is a valid email address. |
indicator |
event.idm.entity.metadata.threat.detection_fields.value |
Mapped with various keys based on the type field (e.g., "campaign_id", "binary_string", etc.). If the type is not specifically handled, it's mapped with the type as the key. |
indicator |
event.ioc.domain_and_ports.domain |
Mapped if type is not "ip_address" or "port". |
ip_address_types |
event.idm.entity.metadata.threat.detection_fields.value |
All values in ip_address_types are concatenated with commas and mapped with key "ip_address_types". |
kill_chains |
event.idm.entity.metadata.threat.category |
The category is derived based on the values in kill_chains . "reconnaissance", "weaponization", or "actionOnObjectives" result in "NETWORK_MALICIOUS". "delivery" or "exploitation" result in "EXPLOIT". "installation" or "c3" result in "SOFTWARE_MALICIOUS". "c2" results in "NETWORK_COMMAND_AND_CONTROL". Other values result in "UNKNOWN_CATEGORY". Multiple categories can be assigned. |
kill_chains |
event.idm.entity.metadata.threat.category_details |
The raw values from kill_chains are mapped directly. Multiple values are possible. |
labels |
event.idm.entity.metadata.threat.detection_fields |
The "name" field within each label is split into label_key and label_value by the "/". If label_key is "Malware" or "ThreatType", label_value is mapped to threat_name . Otherwise, label_key and label_value are mapped as a key-value pair. "created_on" and "last_valid_on" within each label are also mapped as key-value pairs. |
labels |
event.idm.entity.metadata.threat.threat_name |
Derived from the labels field (see above). |
last_updated |
event.idm.entity.metadata.threat.detection_fields.value |
The value of last_updated is mapped with key "last_updated". |
malicious_confidence |
event.idm.entity.metadata.threat.confidence |
If malicious_confidence is "high", the confidence is "HIGH_CONFIDENCE". If it's "low", the confidence is "LOW_CONFIDENCE". If it's "medium", the confidence is "MEDIUM_CONFIDENCE". Otherwise, it's "UNKNOWN_CONFIDENCE". |
malicious_confidence |
event.idm.entity.metadata.threat.confidence_details |
The value of malicious_confidence is mapped directly. |
malicious_confidence |
event.ioc.confidence_score |
The value of malicious_confidence is mapped directly. |
malware_families |
event.idm.entity.metadata.threat.threat_name |
All values in malware_families are concatenated with commas and mapped. |
published_date |
event.idm.entity.metadata.creation_timestamp |
The value of published_date is converted to a timestamp. |
published_date |
event.idm.entity.metadata.interval.start_time |
The value of published_date is converted to a timestamp. |
published_date |
event.ioc.active_timerange.start |
The value of published_date is converted to a timestamp. |
relations |
event.idm.entity.metadata.threat.about |
The fields within each relation are mapped to the about object based on their type . "created_date", "last_valid_date", and "id" are added as labels. |
reports |
event.idm.entity.metadata.threat.about.labels.value |
All values in reports are concatenated with commas and mapped with key "report_ids". |
threat_types |
event.idm.entity.metadata.threat.threat_name |
All values in threat_types are concatenated with commas with the existing threat_name derived from malware_families . |
type |
event.ioc.categorization |
The value of type is mapped directly. |
(Parser Logic) | event.idm.entity.metadata.collected_timestamp |
The value of create_time from the raw log is used. |
(Parser Logic) | event.idm.entity.metadata.interval.end_time |
Hardcoded to a far-future timestamp (253402300799). |
(Parser Logic) | event.idm.entity.metadata.product_name |
Hardcoded to "Falcon". |
(Parser Logic) | event.idm.entity.metadata.vendor_name |
Hardcoded to "CrowdStrike". |
(Parser Logic) | event.idm.entity.metadata.entity_type |
Derived based on the type field and the presence of other fields. See parser code for the specific logic. |
(Parser Logic) | event.ioc.feed_name |
Hardcoded to "CrowdStrike Falcon Intelligence". |
(Parser Logic) | event.timestamp |
The value of create_time from the raw log is used. |
Changes
2023-08-23
- Changed mapping for
malicious_confidence
field.
2023-05-04
- Promoted
crowdstrike_ioc
parser to default.