Jira — Integration Setup
Jira is CMDash's first bi-directional integration: it both reads existing issues into CMDash as incidents, and lets CMDash push risks/remediations out to Jira as new issues, then poll them for status changes.
Prerequisites
- Jira Cloud site (
*.atlassian.net) - An Atlassian account with permission to browse the relevant project(s) and, for write-back, create/edit issues in the target project
- CMDash Essentials tier or above
Step 1: Create an API Token
- Log in to id.atlassian.com/manage-profile/security/api-tokens.
- Click Create API token, name it
CMDash Integration, and copy the token — it is shown only once. - Note the email address of the Atlassian account the token belongs to; CMDash needs it to build the Basic auth header.
Step 2: Connect in CMDash
- Navigate to Integrations in your CMDash dashboard.
- Find Jira and click Connect.
- Enter:
- Domain — your site's subdomain only (e.g.,
acmeforacme.atlassian.net) - Email — the Atlassian account tied to the API token
- API Token (stored as this connection's access token)
- Project Key (e.g.,
SEC) — used to build the default read query, or supply your own JQL override
- Domain — your site's subdomain only (e.g.,
- Click Save & Test Connection.
What Syncs (Read Direction)
| Data Type | API | Sync Frequency |
|---|---|---|
| Incidents (from matching Jira issues) | POST /rest/api/3/search/jql (Atlassian’s enhanced search; the legacy /rest/api/3/search was removed for Jira Cloud on 2025-05-01) | Every 4 hours by default (configurable per connection) |
By default CMDash searches:
project = "<Project Key>" AND (type = Bug OR type = Task OR type = "Security") AND updated >= -7d ORDER BY updated DESC
You can override this entirely with a custom JQL string in the connection config if your security-relevant issues live in a different project, issue type, or label scheme. Results are paginated 100 at a time and capped at 1,000 issues per sync. Jira priority (Highest/Blocker → critical, High → high, Medium → medium, everything else → low) and status category (new/undefined → open, indeterminate → investigating, done → resolved) are mapped onto CMDash's incident severity/status fields.
Write-Back Direction
CMDash can push a risk or remediation item to Jira as a new issue, then track it:
| Action | API | Purpose |
|---|---|---|
| Push a new issue | POST /rest/api/3/issue | Create a Jira issue from a CMDash risk/remediation (summary, description, issue type — default Task, optional priority/labels, in the specified project) |
| Fetch issue status | GET /rest/api/3/issue/{key}?fields=status,resolution | Pull the current status/resolution back into CMDash |
| Update an issue | PUT /rest/api/3/issue/{key} | Push summary/description changes from CMDash back to Jira |
Write-back requires the same API token/email used for reads to also have Create Issues and Edit Issues permission on the target project. This direction is invoked from CMDash's risk/remediation workflow (e.g., "Push to Jira" action), not on the scheduled sync cadence — it happens on demand.
Troubleshooting
- 401 Unauthorized: The API token was regenerated/revoked, or the email doesn't match the token's owner.
- 403 Forbidden on search: The account can't browse the configured project; grant it Browse Projects permission.
- Push fails with 400: The target project key doesn't exist, or the specified issue type isn't enabled for that project — check Project settings → Issue types.
- Status never updates after push:
fetchIssueStatusmust be triggered per issue (e.g., from the remediation detail view); it isn't part of the scheduled bulk sync.
Rate Limits & Sync Behavior
| Setting | Value |
|---|---|
| Sync frequency (read) | Every 4 hours by default (syncInterval is configurable per connection) |
| Pagination cap | 1,000 issues 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
Atlassian API tokens do not expire unless you set an expiration when creating them (Atlassian now supports up to 1 year). CMDash recommends rotating annually or whenever the token owner leaves the org.
To rotate:
- Create a new API token at id.atlassian.com.
- In CMDash: Settings → Integrations → Jira → Edit.
- Enter the new API Token and Save.
- Revoke the old token once confirmed working.
Multiple Instances / Multi-Site
If your organization runs more than one Jira Cloud site, or wants separate connections per project/business unit, add a connection per site or per JQL scope.
To add another connection:
- In CMDash: Settings → Integrations → Add Integration → Jira.
- Enter the domain, email, API token, and project key/JQL for the additional scope.
- Give the connection a descriptive name (e.g.,
Jira - Security Team,Jira - Platform). - Click Save & Test Connection.
Compliance Framework Coverage
The Jira integration provides evidence for the following controls. Coverage is automatically mapped when data is synced.
| Framework | Control | Description |
|---|---|---|
| PCI DSS | 12.10 | Incident response — tracked Jira security issues mapped to incident-tracking evidence |
| HITRUST | 09.v | Information security incident management — issue lifecycle and resolution data |
| CMMC L2 | IR.2.093 | Incident tracking — Jira issue status mapped to incident handling evidence |
| SOC 2 | CC7.3 | Incident response — remediation issues pushed to and tracked in Jira |