SafeBreach — Integration Setup
What this integration is for: SafeBreach simulation results are ingested at the
VALIDATEDtier — evidence a control was tested, not merely attested. It feeds the same credibility gate as AttackIQ; running both is supported and their evidence merges.
Prerequisites
- A SafeBreach deployment with its own management console hostname (SafeBreach-hosted or self-hosted — SafeBreach does not use a single shared SaaS host)
- A SafeBreach API token
- Completed simulations — an empty simulation feed produces no observations
- The management console reachable from CMDash's sync workers over the public internet (see the base-URL note in Step 2)
- CMDash Essentials tier or above
Step 1: Create an API Token
- Log in to the SafeBreach management console.
- Go to Settings → API Keys (exact location varies by console version) and create a key named
CMDash Integration. - Copy the token immediately.
- Prefer a token owned by a dedicated, read-only service user.
Minimum privileges. The adapter issues two
GETrequests and nothing else: the simulation results feed and the attack/playbook catalog. It never runs, schedules, pauses, or edits a simulation, and never touches simulators, deployments, or configuration. Read access to simulation results and the attack catalog is the whole requirement — no operator or admin role is needed.
Token transport. CMDash sends the token as
Authorization: Bearer <token>. If your console expects a different header scheme for API keys, the connection will return401regardless of how the token is scoped — raise it with CMDash support rather than broadening the token's permissions.
Step 2: Connect in CMDash
- Navigate to Integrations in your CMDash dashboard.
- Find SafeBreach and click Connect.
- Enter:
- API Key — the SafeBreach token from Step 1 (stored as this connection's access token)
- Configuration (JSON):
{ "baseUrl": "https://acme.safebreach.com" }
- Click Connect.
Base URL format — this is the most common setup failure for SafeBreach, because every customer's console lives on a different hostname:
- Set
baseUrlto your management console's hostname. The fallback when it is omitted ishttps://mgmt.safebreach.com, which is a placeholder default and will not be your console. - Scheme and host only (plus a port if non-standard). CMDash appends
/api/data/v2/...itself; a trailing slash is stripped for you, a trailing/apiis not and yields404. - The host must be publicly resolvable. CMDash validates it when you save the connection and again on every request; private/reserved addresses and
.internal/.local/localhosthosts are refused, so a self-hosted console on an internal network needs a public hostname or reverse proxy.
What Syncs
| Data Type | SafeBreach API | Sync Frequency |
|---|---|---|
| Simulation results (control validation) | GET {baseUrl}/api/data/v2/simulations?page=N&per_page=200 | Every 4 hours by default (configurable per connection) |
| Attack/playbook catalog (ATT&CK + control mappings) | GET {baseUrl}/api/data/v2/attacks?page=N&per_page=200 | Every 4 hours by default (configurable per connection) |
Each usable simulation becomes a BAS_CONTROL_VALIDATION maturity observation at the VALIDATED tier, timestamped with the simulation's own end time (not the sync time), and linked back to the SafeBreach insight URL when the console supplies one. Statuses map as (case-insensitively):
| SafeBreach status | CMDash result | Meaning |
|---|---|---|
Prevented | PASS | The control blocked the simulated attack outright |
Detected | PARTIAL | The attack succeeded but was detected — partial efficacy |
Missed | FAIL | The attack succeeded unnoticed — the control did nothing |
Not-Relevant, Reported, anything else | ignored | Not a completed efficacy reading; never guessed as a failure |
The attack catalog supplies each simulation's ATT&CK technique (the first tagged technique is used) and, where you have configured SafeBreach's compliance-framework mapping, its control tags. Only two framework labels are recognised, exactly as spelled:
NIST CSF 2.0CIS Controls v8(and the shorterCIS Controls)
Any other label is deliberately dropped rather than guessed at, and the simulation is still ingested — just without a control stamp. If your SafeBreach mappings use different framework names, renaming them to the two labels above is what turns these simulations into control evidence. A catalog fetch failure is non-fatal for the same reason: simulations still land, without control references.
Troubleshooting
The connection detail page shows the health check's message. The health check calls GET {baseUrl}/api/data/v2/simulations?limit=1, so it exercises the same credential and reachability path a sync does:
HTTP 401: The token was revoked or regenerated, or the console does not accept aBearertoken.HTTP 403: The token's user cannot read simulation results.HTTP 404:baseUrlstill points at themgmt.safebreach.comdefault or another wrong host, or carries an extra path segment.URL host not allowed: …/… resolves to a private/reserved address: The console host is internal-only; CMDash's workers cannot reach it by design.Request to <host> timed out: No response within 15 seconds.SafeBreach circuit open — provider recently failing repeatedly: 5 failures inside 60 seconds tripped the per-tenant breaker; it fails fast for a 30-second cool-off and then probes.- Sync log shows
SafeBreach simulations API failed: <status>: The simulation feed returned non-2xx mid-run. This is the one required dataset, so the whole sync attempt fails and is retried. - Observations appear with no control reference: Either the attack-catalog fetch failed (logged as
SafeBreach attack-catalog fetch failed …— non-fatal by design) or the attack's framework labels are not one of the two recognised strings above. - Sync reports success but zero observations were created: Every simulation was filtered out. The usual causes are (a) every status was
Not-Relevant/Reportedor another unrecognised value, or (b) the feed is returning a shape the adapter does not recognise — it expects a JSON array of objects carryingsimulationId,attackId,status, andendTime. If your console version returns a paginated envelope or differently-named fields, report it to CMDash support; no permission change will fix it. - Old simulations stop counting:
BAS_CONTROL_VALIDATIONobservations decay on a 90-day half-life. Re-running the playbook is what refreshes the evidence.
Rate Limits & Sync Behavior
| Setting | Value |
|---|---|
| Sync frequency | Every 4 hours by default (syncInterval, in seconds, is configurable per connection; default 14400) |
| Pagination cap | 200 rows per request, 5,000 rows per dataset, per sync |
| Response size cap | 5 MiB per response, enforced by CMDash's SSRF-safe HTTP client |
| Request timeout | 15 seconds per request |
| Rate limit handling | Every request is paced through CMDash's shared token-bucket limiter at 300 requests/minute per tenant for this provider |
| Circuit breaker | 5 failures in 60 seconds trips the breaker OPEN for 30 seconds, then a single probe decides whether it closes |
| Observation freshness | BAS_CONTROL_VALIDATION observations decay on a 90-day half-life |
| Failed sync retry | Job queue retries 3 times with exponential backoff (starting at 30s) — see docs/developers/dead-letter.md |
Credential Rotation
SafeBreach API tokens do not carry an expiry CMDash can read, so no expiry warning banner is shown for this integration. Rotate on your own cadence — quarterly, or whenever the owning service user changes.
To rotate:
- In SafeBreach, create a new API key for the same service user.
- In CMDash: Settings → Integrations → SafeBreach → Edit.
- Enter the new API Key and Save.
- Revoke the old key in SafeBreach once the connection reports healthy.
Multiple Instances / Multi-Site
Each connection reads one SafeBreach console through one token. Separate deployments (e.g. per region, or a lab console alongside production) each need their own CMDash connection with their own baseUrl.
To add another:
- Create a token in the additional SafeBreach console, following Step 1.
- In CMDash: Settings → Integrations → Add Integration → SafeBreach.
- Enter the token and that console's
baseUrl. - Give the connection a descriptive name (e.g.
SafeBreach - Prod,SafeBreach - EU). - Click Connect.
Validation evidence from every connection feeds the same control-validation rollup, alongside AttackIQ if you run both.
Compliance Framework Coverage
Like AttackIQ, SafeBreach's control coverage is driven by your own attack mappings rather than a fixed table — the adapter stamps whatever your console reports, provided the framework label is one it recognises.
| Framework | Control | Description |
|---|---|---|
| NIST CSF 2 | whichever control your attack is mapped to | Attacks tagged NIST CSF 2.0 in SafeBreach stamp the matching CMDash control with VALIDATED-tier evidence |
| CIS Controls v8 | whichever safeguard your attack is mapped to | Attacks tagged CIS Controls v8 (or CIS Controls) stamp the matching safeguard |
Simulations whose attacks carry no recognised mapping still count toward control-validation maturity and ATT&CK technique coverage; they simply do not stamp a specific control.