Okta — Integration Setup
Prerequisites
- Okta org (any edition with API access)
- Ability to create an SSWS API token (typically requires an Okta admin role)
- CMDash Essentials tier or above
Step 1: Create an API Token
- Log in to the Okta Admin Console.
- Go to Security → API → Tokens → Create Token.
- Name it
CMDash Integration. - Copy the generated token immediately — it is shown only once.
Note: Okta API tokens inherit the permissions of the admin who created them. Create the token from a dedicated admin account with the least-privileged Okta admin role that still allows reading users, factors, and system log events (a Read Only Administrator role is sufficient for this integration).
Step 2: Connect in CMDash
- Navigate to Integrations in your CMDash dashboard.
- Find Okta and click Connect.
- Enter:
- Domain — your Okta org domain (e.g.,
yourcompany.okta.com) - API Token (stored as this connection's access token, sent as
Authorization: SSWS <token>)
- Domain — your Okta org domain (e.g.,
- Click Save & Test Connection.
What Syncs
| Data Type | Okta API | Sync Frequency |
|---|---|---|
| Identity/MFA coverage | GET /api/v1/users?filter=status eq "ACTIVE" | Every 4 hours by default (configurable per connection) |
| Incidents (failed logins, account lockouts, sign-on policy violations, last 24h) | GET /api/v1/logs | Every 4 hours by default (configurable per connection) |
CMDash computes an identity coverage summary from your active user population: total accounts, how many have MFA enrolled (detected via credentials.provider.type / credentials.factor.provider on the user profile), how many accounts look privileged (profile.userType = Admin or a title containing "admin"), and how many of those privileged accounts have MFA. User pagination follows Okta's Link header and stops after 5,000 users. The System Log query is filtered to user.session.start failures, user.account.lock, and policy.evaluate_sign_on events, capped at 500 events, and only failed/lockout events are turned into incidents.
Troubleshooting
- 401 Unauthorized: The SSWS token was revoked or the admin account it belongs to was deactivated.
- 403 Forbidden: The token's owning admin role doesn't have rights to
/users,/users/{id}/factors, or/logs— use at least Read Only Administrator. - MFA coverage looks low: CMDash only counts a user as MFA-enrolled if
credentials.provider.typeisOKTAor a factor provider is present on the profile payload returned by/users— third-party IdP-federated MFA that Okta doesn't reflect in this field will undercount. - "Privileged account" flag looks wrong: The privileged-account heuristic is simple —
profile.userType === 'Admin'or the profiletitlecontaining the substring "admin" — it is not based on actual Okta admin role assignments.
Rate Limits & Sync Behavior
| Setting | Value |
|---|---|
| Sync frequency | Every 4 hours by default (syncInterval is configurable per connection) |
| Pagination cap | 5,000 users per sync; 500 system log events per sync |
| Rate limit handling | Every outbound request is paced through CMDash's shared per-tenant token bucket for this provider, and a vendor 429 (with its Retry-After) holds that tenant's budget until the vendor says it is ready (#507) |
| Failed sync retry | Job queue retries 3 times with exponential backoff (starting at 30s) — see docs/developers/dead-letter.md |
Credential Rotation
Okta SSWS tokens expire after 60 days of inactivity but do not expire on a fixed schedule if used regularly (CMDash's periodic sync itself keeps the token "active"). CMDash still recommends rotating quarterly.
To rotate:
- In Okta: Security → API → Tokens, create a new token.
- In CMDash: Settings → Integrations → Okta → Edit.
- Enter the new API Token and Save.
- Revoke the old token in Okta once confirmed working.
Note: Because Okta token expiry is activity-based rather than a fixed date, CMDash cannot show a 30-day expiry warning banner for this integration.
Multiple Instances / Multi-Site
If you run more than one Okta org (e.g., a production org and a separate org for an acquired subsidiary), each org needs its own CMDash connection.
To add another org:
- Create an API token in the additional Okta org, following Step 1.
- In CMDash: Settings → Integrations → Add Integration → Okta.
- Enter the domain and API token for the additional org.
- Give the connection a descriptive name (e.g.,
Okta - Corp,Okta - Subsidiary). - Click Save & Test Connection.
Compliance Framework Coverage
The Okta integration provides evidence for the following controls. Coverage is automatically mapped when data is synced.
| Framework | Control | Description |
|---|---|---|
| PCI DSS | 8.3 | Multi-factor authentication — MFA coverage computed from Okta user/factor data |
| HITRUST | 01.q | User authentication for external connections — MFA enrollment status |
| CMMC L2 | IA.2.078 | Multi-factor authentication — MFA coverage for privileged and standard accounts |
| SOC 2 | CC6.1 | Logical access controls — Okta identity inventory and MFA enrollment |
| SOC 2 | CC6.2 | Prior authorization — failed login/lockout events feed the anomaly-detection evidence bucket |