-
Notifications
You must be signed in to change notification settings - Fork 829
Add SpoofSentry integration #2963
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 3 commits
db18c95
9ed6180
7eb8ce6
a9e83e0
5d64ac3
a3da5fa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,61 @@ | ||||||||||||||||||||||||||
| ## Overview | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| SpoofSentry by DomainSeal monitors your domains for email spoofing, DMARC failures, lookalike domain abuse, and phishing campaigns. This integration sends domain security events to Datadog for centralized logging, analysis, and alerting. | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| Events include: | ||||||||||||||||||||||||||
| - DMARC authentication failures with sender details | ||||||||||||||||||||||||||
| - Spoofing campaign detections with IP attribution | ||||||||||||||||||||||||||
| - Lookalike domain threats with risk scores | ||||||||||||||||||||||||||
| - DNS enforcement changes (SPF, DKIM, DMARC policy) | ||||||||||||||||||||||||||
| - Takedown orchestration lifecycle (created, dispatched, escalated, resolved) | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ## Setup | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ### In SpoofSentry | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| 1. Log in to [SpoofSentry](https://spoofsentry.com) | ||||||||||||||||||||||||||
| 2. Go to **Settings > Integrations > SIEM** | ||||||||||||||||||||||||||
| 3. Select **Datadog** | ||||||||||||||||||||||||||
| 4. Enter your **Datadog API key** (from Datadog > Organization Settings > API Keys) | ||||||||||||||||||||||||||
| 5. Select your **Datadog site** (US: `datadoghq.com`, EU: `datadoghq.eu`) | ||||||||||||||||||||||||||
| 6. Click **Test Connection** to verify | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ### In Datadog | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| Events appear automatically in **Logs** with `source:spoofsentry`. The pre-built dashboard is installed with this integration. | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ### Log Pipeline | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| A log pipeline is included that: | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||
| - Maps `eventType` to `evt.name` | ||||||||||||||||||||||||||
| - Maps `severity` to log status | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is "log status" an attribute name? Ideally, this bullet would be parallel with the first and third bullets which include an attribute name. |
||||||||||||||||||||||||||
| - Maps `domain` to `network.destination.domain` | ||||||||||||||||||||||||||
| - Categorizes severity levels | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ## Data Collected | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ### Logs | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| SpoofSentry sends domain security events as JSON logs via the Datadog Logs API. | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| | Field | Description | | ||||||||||||||||||||||||||
| |-------|-------------| | ||||||||||||||||||||||||||
| | `eventType` | Event classification (e.g., `SPOOF_THREAT_DETECTED`) | | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||
| | `severity` | `critical`, `high`, `medium`, `low`, `info` | | ||||||||||||||||||||||||||
| | `domain` | Target domain | | ||||||||||||||||||||||||||
| | `tenantId` | Customer tenant identifier | | ||||||||||||||||||||||||||
| | `message` | Human-readable event summary | | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ### Tags | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| All events include these tags: | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||
| - `service:spoofsentry` | ||||||||||||||||||||||||||
| - `event_type:<type>` | ||||||||||||||||||||||||||
| - `severity:<level>` | ||||||||||||||||||||||||||
| - `domain:<domain>` | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ## Support | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| - Email: hello@spoofsentry.com | ||||||||||||||||||||||||||
| - Documentation: [https://spoofsentry.com/docs/integrations/datadog](https://spoofsentry.com/docs/integrations/datadog) | ||||||||||||||||||||||||||
| - Status: [https://spoofsentry.com/status](https://spoofsentry.com/status) | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Support section for integrations-extras typically points directly to the creator's support contact. The
Suggested change
|
||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,160 @@ | ||||||
| { | ||||||
| "title": "SpoofSentry - Domain Security Overview", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| "description": "DMARC monitoring, spoofing detection, lookalike domains, and takedown orchestration events from SpoofSentry.", | ||||||
| "widgets": [ | ||||||
| { | ||||||
| "id": 1, | ||||||
| "definition": { | ||||||
| "title": "Security Events (24h)", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||||||
| "type": "query_value", | ||||||
| "requests": [ | ||||||
| { | ||||||
| "queries": [ | ||||||
| { | ||||||
| "data_source": "logs", | ||||||
| "name": "query1", | ||||||
| "search": { "query": "source:spoofsentry" }, | ||||||
| "indexes": ["*"], | ||||||
| "compute": { "aggregation": "count" } | ||||||
| } | ||||||
| ], | ||||||
| "response_format": "scalar" | ||||||
| } | ||||||
| ] | ||||||
| } | ||||||
| }, | ||||||
| { | ||||||
| "id": 2, | ||||||
| "definition": { | ||||||
| "title": "Critical & High Threats (24h)", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above — the |
||||||
| "type": "query_value", | ||||||
| "requests": [ | ||||||
| { | ||||||
| "queries": [ | ||||||
| { | ||||||
| "data_source": "logs", | ||||||
| "name": "query1", | ||||||
| "search": { "query": "source:spoofsentry (severity:critical OR severity:high)" }, | ||||||
| "indexes": ["*"], | ||||||
| "compute": { "aggregation": "count" } | ||||||
| } | ||||||
| ], | ||||||
| "response_format": "scalar" | ||||||
| } | ||||||
| ] | ||||||
| } | ||||||
| }, | ||||||
| { | ||||||
| "id": 3, | ||||||
| "definition": { | ||||||
| "title": "Events by Severity", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| "type": "timeseries", | ||||||
| "requests": [ | ||||||
| { | ||||||
| "queries": [ | ||||||
| { | ||||||
| "data_source": "logs", | ||||||
| "name": "query1", | ||||||
| "search": { "query": "source:spoofsentry" }, | ||||||
| "indexes": ["*"], | ||||||
| "compute": { "aggregation": "count" }, | ||||||
| "group_by": [ | ||||||
| { "facet": "@severity", "limit": 5, "sort": { "aggregation": "count", "order": "desc" } } | ||||||
| ] | ||||||
| } | ||||||
| ], | ||||||
| "response_format": "timeseries", | ||||||
| "display_type": "bars" | ||||||
| } | ||||||
| ] | ||||||
| } | ||||||
| }, | ||||||
| { | ||||||
| "id": 4, | ||||||
| "definition": { | ||||||
| "title": "Events by Type", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| "type": "toplist", | ||||||
| "requests": [ | ||||||
| { | ||||||
| "queries": [ | ||||||
| { | ||||||
| "data_source": "logs", | ||||||
| "name": "query1", | ||||||
| "search": { "query": "source:spoofsentry" }, | ||||||
| "indexes": ["*"], | ||||||
| "compute": { "aggregation": "count" }, | ||||||
| "group_by": [ | ||||||
| { "facet": "@eventType", "limit": 10, "sort": { "aggregation": "count", "order": "desc" } } | ||||||
| ] | ||||||
| } | ||||||
| ], | ||||||
| "response_format": "scalar" | ||||||
| } | ||||||
| ] | ||||||
| } | ||||||
| }, | ||||||
| { | ||||||
| "id": 5, | ||||||
| "definition": { | ||||||
| "title": "Events by Domain", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| "type": "toplist", | ||||||
| "requests": [ | ||||||
| { | ||||||
| "queries": [ | ||||||
| { | ||||||
| "data_source": "logs", | ||||||
| "name": "query1", | ||||||
| "search": { "query": "source:spoofsentry" }, | ||||||
| "indexes": ["*"], | ||||||
| "compute": { "aggregation": "count" }, | ||||||
| "group_by": [ | ||||||
| { "facet": "host", "limit": 10, "sort": { "aggregation": "count", "order": "desc" } } | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The "Events by Domain" widget groups by |
||||||
| ] | ||||||
| } | ||||||
| ], | ||||||
| "response_format": "scalar" | ||||||
| } | ||||||
| ] | ||||||
| } | ||||||
| }, | ||||||
| { | ||||||
| "id": 6, | ||||||
| "definition": { | ||||||
| "title": "Takedown Activity", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| "type": "timeseries", | ||||||
| "requests": [ | ||||||
| { | ||||||
| "queries": [ | ||||||
| { | ||||||
| "data_source": "logs", | ||||||
| "name": "query1", | ||||||
| "search": { "query": "source:spoofsentry @eventType:(TAKEDOWN_*)" }, | ||||||
| "indexes": ["*"], | ||||||
| "compute": { "aggregation": "count" }, | ||||||
| "group_by": [ | ||||||
| { "facet": "@eventType", "limit": 5, "sort": { "aggregation": "count", "order": "desc" } } | ||||||
| ] | ||||||
| } | ||||||
| ], | ||||||
| "response_format": "timeseries", | ||||||
| "display_type": "line" | ||||||
| } | ||||||
| ] | ||||||
| } | ||||||
| }, | ||||||
| { | ||||||
| "id": 7, | ||||||
| "definition": { | ||||||
| "title": "Recent Security Events", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| "type": "log_stream", | ||||||
| "query": "source:spoofsentry", | ||||||
| "columns": ["@eventType", "@severity", "host", "@tenantId"], | ||||||
| "sort": { "column": "time", "order": "desc" }, | ||||||
| "message_display": "expanded-md" | ||||||
| } | ||||||
| } | ||||||
| ], | ||||||
| "layout_type": "ordered", | ||||||
| "notify_list": [], | ||||||
| "reflow_type": "fixed" | ||||||
| } | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| id: spoofsentry | ||
| type: pipeline | ||
| name: SpoofSentry | ||
| enabled: true | ||
| filter: | ||
| query: "source:spoofsentry" | ||
| processors: | ||
| - type: attribute-remapper | ||
| name: Map eventType to evt.name | ||
| enabled: true | ||
| sources: | ||
| - eventType | ||
| target: evt.name | ||
| preserveSource: true | ||
| sourceType: attribute | ||
| targetType: attribute | ||
|
|
||
| - type: attribute-remapper | ||
| name: Map severity to log status | ||
| enabled: true | ||
| sources: | ||
| - severity | ||
| target: status | ||
| preserveSource: true | ||
| sourceType: attribute | ||
| targetType: attribute | ||
|
|
||
| - type: attribute-remapper | ||
| name: Map domain to network.destination.domain | ||
| enabled: true | ||
| sources: | ||
| - domain | ||
| target: network.destination.domain | ||
| preserveSource: true | ||
| sourceType: attribute | ||
| targetType: attribute | ||
|
|
||
| - type: attribute-remapper | ||
| name: Map tenantId to usr.id | ||
| enabled: true | ||
| sources: | ||
| - tenantId | ||
| target: usr.id | ||
| preserveSource: true | ||
| sourceType: attribute | ||
| targetType: attribute | ||
|
|
||
| - type: category-processor | ||
| name: Categorize severity levels | ||
| enabled: true | ||
| categories: | ||
| - filter: | ||
| query: "@severity:critical" | ||
| name: Critical | ||
| - filter: | ||
| query: "@severity:high" | ||
| name: High | ||
| - filter: | ||
| query: "@severity:medium" | ||
| name: Medium | ||
| - filter: | ||
| query: "@severity:low" | ||
| name: Low | ||
| - filter: | ||
| query: "@severity:info" | ||
| name: Info | ||
| target: severity_category |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| [] |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,48 @@ | ||||||
| { | ||||||
|
Check failure on line 1 in spoofsentry/manifest.json
|
||||||
| "manifest_version": "2.0.0", | ||||||
| "app_uuid": "87ffb85e-b1e8-4f3d-8978-ce5a2d43036f", | ||||||
| "app_id": "spoofsentry", | ||||||
| "display_on_public_website": true, | ||||||
| "tile": { | ||||||
| "overview": "README.md#Overview", | ||||||
| "configuration": "README.md#Setup", | ||||||
| "uninstallation": "README.md#Uninstallation", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The manifest references |
||||||
| "support": "README.md#Support", | ||||||
| "changelog": "CHANGELOG.md", | ||||||
| "description": "Ingest DMARC monitoring, spoofing detection, and takedown events from SpoofSentry", | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This description is 81 characters, which exceeds the 80-character limit for tile descriptions. Trim slightly — for example:
Suggested change
|
||||||
| "title": "SpoofSentry", | ||||||
| "media": [], | ||||||
| "classifier_tags": [ | ||||||
| "Category::Security", | ||||||
| "Category::Log Collection", | ||||||
| "Category::Notifications", | ||||||
| "Submitted Data Type::Logs", | ||||||
| "Offering::Integration" | ||||||
| ] | ||||||
| }, | ||||||
| "assets": { | ||||||
| "dashboards": { | ||||||
| "SpoofSentry - Domain Security Overview": "assets/dashboards/spoofsentry.json" | ||||||
| }, | ||||||
| "logs": { | ||||||
| "source": "spoofsentry" | ||||||
| }, | ||||||
| "integration": { | ||||||
| "source_type_name": "SpoofSentry", | ||||||
| "auto_install": true, | ||||||
| "configuration": {}, | ||||||
| "events": { | ||||||
| "creates_events": false | ||||||
| }, | ||||||
| "service_checks": { | ||||||
| "metadata_path": "assets/service_checks.json" | ||||||
| } | ||||||
| } | ||||||
| }, | ||||||
| "author": { | ||||||
| "homepage": "https://spoofsentry.com", | ||||||
| "name": "DomainSeal", | ||||||
| "support_email": "hello@spoofsentry.com", | ||||||
| "sales_email": "hello@spoofsentry.com" | ||||||
| } | ||||||
| } | ||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Integration READMEs conventionally use reference-style links (e.g.,
[SpoofSentry][1]with[1]: https://spoofsentry.comat the bottom of the file) rather than inline URLs. Consider converting all links in this README to that format for consistency with the standard template.