-
Notifications
You must be signed in to change notification settings - Fork 827
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 all 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,87 @@ | ||
| ## 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][1]. | ||
| 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. | ||
|
|
||
| ### In Datadog | ||
|
|
||
| Events appear automatically in **Logs** with `source:spoofsentry`. A prebuilt dashboard is installed with this integration. | ||
|
|
||
| ### Validation | ||
|
|
||
| To confirm the integration is working: | ||
|
|
||
| 1. In SpoofSentry, send a test event from **Settings > Integrations > SIEM > Datadog > Test Connection**. | ||
| 2. In Datadog, navigate to **Logs** and filter by `source:spoofsentry`. | ||
| 3. Verify that test events appear with the expected fields (`eventType`, `severity`, `domain`). | ||
|
|
||
| ### Log Pipeline | ||
|
|
||
| The integration includes a log pipeline that: | ||
| - Maps `eventType` to `evt.name` | ||
| - Maps `severity` to log status | ||
| - Maps `domain` to `network.destination.domain` | ||
| - Categorizes severity levels | ||
|
|
||
| ## Uninstallation | ||
|
|
||
| 1. In SpoofSentry, go to **Settings > Integrations > SIEM** and remove the Datadog configuration. | ||
| 2. In Datadog, uninstall the SpoofSentry integration from **Integrations > Integrations**. | ||
|
|
||
| ## Data Collected | ||
|
|
||
| ### Logs | ||
|
|
||
| SpoofSentry sends domain security events as JSON logs through the Datadog Logs API. | ||
|
|
||
| | Field | Description | | ||
| |-------|-------------| | ||
| | `eventType` | Event classification (for example, `SPOOF_THREAT_DETECTED`) | | ||
| | `severity` | `critical`, `high`, `medium`, `low`, `info` | | ||
| | `domain` | Target domain | | ||
| | `tenantId` | Customer tenant identifier | | ||
| | `message` | Human-readable event summary | | ||
|
|
||
| ### Metrics | ||
|
|
||
| The SpoofSentry integration does not include any metrics. | ||
|
|
||
| ### Service Checks | ||
|
|
||
| The SpoofSentry integration does not include any service checks. | ||
|
|
||
| ### Events | ||
|
|
||
| The SpoofSentry integration does not include any events. | ||
|
|
||
| ### Tags | ||
|
|
||
| All events include the following tags: | ||
| - `service:spoofsentry` | ||
| - `event_type:<type>` | ||
| - `severity:<level>` | ||
| - `domain:<domain>` | ||
|
|
||
| ## Support | ||
|
|
||
| Need help? Contact [SpoofSentry support][2]. | ||
|
|
||
| [1]: https://spoofsentry.com | ||
| [2]: mailto:hello@spoofsentry.com | ||
| 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", | ||||||
|
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": "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", | ||||||
|
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": "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": "@network.destination.domain", "limit": 10, "sort": { "aggregation": "count", "order": "desc" } } | ||||||
| ] | ||||||
| } | ||||||
| ], | ||||||
| "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", "@network.destination.domain", "@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": "DMARC monitoring, spoofing detection, and takedown events from SpoofSentry", | ||
| "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.
Is "log status" an attribute name? Ideally, this bullet would be parallel with the first and third bullets which include an attribute name.