Compliance¶
Availability: framework selection varies by tier · Tenant-scoped
See the Tier & Scope Matrix for which frameworks each tier gets today.
The Compliance tab on a completed run shows how well your environment meets each selected compliance framework.
Supported frameworks¶
| Framework | Short name |
|---|---|
| CIS Benchmarks (AWS / Azure / GCP) | cis |
| SOC 2 Type II | soc2 |
| ISO 27001:2022 | iso27001 |
| OWASP Top 10 | owasp |
| PCI-DSS v4 | pci_dss |
| HIPAA | hipaa |
| GDPR | gdpr |
| NIST CSF 2.0 | nist_csf |
| Well-Architected Framework (AWS) | waf_aws |
| Well-Architected Framework (Azure) | waf_azure |
| Well-Architected Framework (GCP) | waf_gcp |
| OWASP LLM Top 10 | owasp_llm |
| NIST AI Risk Management Framework | nist_ai_rmf |
owasp_llm and nist_ai_rmf are populated from AI-SPM findings. Enable AI-SPM scanning on a cloud account to get coverage against these two frameworks. Coverage is honestly partial: only the OWASP LLM risks and NIST AI RMF functions a static configuration scanner can actually observe are rule-mapped (for OWASP LLM, that's LLM01/02/03/06/10; for NIST AI RMF, the MAP and MANAGE functions). Everything else in either framework requires organizational or runtime evidence this scanner doesn't collect, and is not claimed as covered.
The built-in framework library (PCI-DSS 4.0, HIPAA, ISO 27001:2022, NIST CSF 2.0, GDPR) is served via GET /compliance-frameworks and is available in the Compliance tab.
Custom frameworks¶
You can define organisation-specific compliance frameworks under Settings → Custom Frameworks. A custom framework has a name, version, and a list of controls (JSON). Custom frameworks appear alongside built-in frameworks in the Compliance tab.
Custom checks¶
Custom checks let you register your own check definitions - title, description, severity, provider and resource type - under Settings → Custom Checks, and map them to a specific framework and control ID. They can be parameterized via Settings → Compliance Params.
The rule logic for a custom check is written in Rego, under Custom Policies. Rego is the single custom-policy language: use a Custom Policy to decide when a finding is raised, and a Custom Check to give that finding its compliance-control mapping so it counts toward a framework's score.
The JSONPath match-expression field has been removed
Earlier releases showed a JSONPath Expression field on the custom-check form. It was never evaluated by anything - a check configured with only a JSONPath expression could never fire. Rather than build a second expression language over raw evidence, the field has been removed from the form and the API, and the stored column is dropped by a database migration.
Any expressions you had saved are gone and cannot be recovered. Because they were never evaluated, no scan result changes. If you were relying on one, re-express the rule as a Custom Policy in Rego.
Evidence artifacts¶
When an inspection run collects compliance evidence (log exports, configuration snapshots), artifacts are stored per-control. Browse evidence under the Evidence section of a run, or download a ZIP bundle via GET /runs/{run_id}/evidence/bundle.zip.
Score breakdown¶
Each framework shows:
| Metric | Meaning |
|---|---|
| Score % | passed controls ÷ assessed controls × 100. A control that is not assessed is left out of the score |
| Passed | Controls fully met |
| Failed | Controls with at least one finding |
| Total | All controls of the framework, assessed or not |
| Failed control IDs | The specific identifiers that need attention (e.g. CIS 2.1.5, CC6.1) |
The score is green at 80% and above, amber from 60%, and red below that.
Controls that are not assessed¶
A control is not assessed when the run cannot say whether it is met. It is neither passed nor failed, and it is left out of the score. There are several reasons, and each has its own heading - the same words in the Compliance tab and in the compliance report.
What the framework card says¶
- N of M controls assessed, with · K not assessed when some are not - every control that is not assessed is a coverage gap, or the score states no reason.
- Scored on N of M controls, followed by a count per reason - at least one control is not assessed for a reason other than incomplete coverage. The percentage is of the N controls, not of the whole framework. The counts read, for example,
89 have no automated check,4 not assessed for incomplete coverage,3 not assessed (scanner not in scope). - Qualified pass, in amber - the score is 80% or above, and a failing finding exists for controls that are not counted in it (the first reason in the table below). It is never shown in the green of a plain pass. Hover the badge to see how many controls:
Qualified: a failing finding exists for 2 controls not counted in this score.The executive summary report prints Qualified pass for the same score.
Click a card to list its controls. The controls that are not assessed are grouped by reason; each group shows its heading with the number of controls, and a sentence saying what the reason means.
The reasons¶
| Heading | What it means | What you can do |
|---|---|---|
| Not assessed — failing finding, no control stated | A failing Kubernetes finding in this run bears on these controls, but the scanner states no control for it, so they are not failed by name. They are not passed either, and are not counted in the score. A failing finding exists - the framework can read 100% beside it | Review the run's Kubernetes findings before relying on the score |
| Not assessed — no automated check | No automated check exists for these controls, so they cannot be assessed. They are reported as not assessed on every run | No scan changes this. Read the percentage as covering only the controls that were scored, not the whole framework |
| Not assessed — no check can confirm a pass | These controls can only be failed by a finding, never confirmed as passed: the check behind them covers less than the control, so a clean result does not show the control is met | No scan changes this either. A finding still fails them |
| Not assessed — policy engine unavailable | A custom policy mapped to these controls was not run in this scan because no policy engine evaluated it. A later run in which the policy is evaluated assesses them | Contact your administrator |
| Not assessed — policy evaluation error | A custom policy mapped to these controls failed while it was evaluated - for example a compile error or a timeout | Check the policy's Rego source under Settings > Custom Policies |
| Not assessed — scanner not in scope | This run holds no result from the scan that checks these controls: that scan was not part of the run, or it reported nothing at all | Add the missing scan to the run - see Which scan is missing |
| Not assessed — Kubernetes check not shown to have run (arriving - see the note below) | A Kubernetes check that covers these controls is not shown to have run in this run's cluster scan: it was switched off, did not complete, or the scanner recorded nothing about which checks ran. It does not say the check did not run | Switch the check group on for the cluster (Kubernetes scanning) and run again. Where the score names the checks, the group lists them: Not shown to have run — CKV_K8S_155, CKV_K8S_156 |
| Not assessed — OS benchmark rule not evaluated | A benchmark rule that covers these controls could not be evaluated on a container image in this run, so its result is unknown | The run does not verify these controls. Some rules cannot be checked on an image at all |
| Not assessed — coverage incomplete | Scan coverage was incomplete or not confirmed, so these controls could not be confirmed as passing | Find the scope that was not scanned and run again |
| Not assessed — reason not stated | These controls could not be confirmed as passing. No reason was recorded for them | - |
A reason the console has no words for is still shown: its heading is made from the reason's own name, and the sentence under it says the console has no description of it. It is never dropped and never called a coverage gap.
Kubernetes check not shown to have run - not yet in a release
The console and the reports already have the words for this reason, but the compliance agent does not give it yet. Until it does, no run shows this group.
Which scan is missing¶
Under Not assessed — scanner not in scope, where the score records which scan is missing, the controls are listed by the scan that would assess them - for example Needs an AWS account scan in the run. The scans named are an AWS account scan, an Azure subscription scan, a GCP project scan, a Kubernetes cluster scan and a codebase scan. Where any one of several scans would do, they are joined with "or". A control with no such line is one the score names no scan for.
Runs with more than one target¶
A run can scan several targets of one kind: two cloud accounts, several repository groups, two clusters, several images. When the scan of one target does not complete and another target of the same kind did complete, the other targets are still assessed, and the framework is scored over them (the conditions are listed below).
For each control, across the targets of a run:
- the control is failed when it failed on any target;
- it is passed when it passed on every target that was assessed;
- it is not assessed only when no target could be assessed for it.
The score is computed from those control results. The targets whose scan did not complete are named under the framework card and in the report, in one sentence: <targets> were not scanned completely; their controls are not assessed. Click the card to see, for each control, the targets it failed on or could not be assessed on. A target that passed is not listed.
The earlier, run-wide behaviour (the framework has no score and the card says the coverage is incomplete) is kept when:
- an incomplete scan cannot be placed on a target the run can name;
- no other target of that kind was scanned in the run;
- no other target ran the same sub-scanner (for a codebase or image scan);
- for cloud accounts, another account does not cover every provider the findings show;
- the run's record of what was scanned is not available (for example a resume or rescore that does not carry it).
In particular a run with a single repository group or a single cloud account is scored as before.
Scores move after the upgrade
A run with one incomplete target used to have no score for any framework it touched. It now has one, over the targets that were assessed. The next run of every schedule is the first scored by the new rules, so compare it with a baseline taken after the upgrade.
Passes and policy failures that name their findings¶
Where a control passed because a finding positively shows it, the control list (in the report, and in the console from the release that carries the console change) names those findings. A control that failed because of a custom policy lists the findings the policy matched, per policy.
When a framework has no score for a reason about your policies¶
If the organisation's custom policies cannot be read when a run is scored, the platform does not call a control passed that a policy may fail. The framework shows Not available — the organisation's custom policies could not be read when this run was scored. Its counts and failed controls are shown as on any run; they are not a score. The run does not fail. Rescore the run once the policies can be read. A deployment with no database configured has no custom policies to read and is not affected.
Compliance trend¶
On the Schedule Detail page, the Compliance Trend chart shows how your score for a framework has changed across the last 30 days of scheduled runs. Regressions show immediately as dips.
CIS cloud scores after the mapping and scoring update
After the CIS mapping and scoring update in this release, CIS AWS, Azure and GCP scores may change on the first run. If your environment has the affected findings, the change is usually downward.
- Newly failable controls. CIS AWS 2.1.3, 2.3.2, 2.3.3, 2.4.1, 3.6, 3.7 and 3.15 now fail on findings that previously counted against no control.
- S3 remapping. S3 encryption now counts against 2.1.4 and versioning against 2.1.5. A public bucket no longer fails 2.1.4.
- Fail-only controls. Some controls are checked on only part of your resources: CIS AWS 2.1.3, 2.1.5, 2.3.3; CIS Azure 4.1.3, 5.1.2; CIS GCP 1.5, 1.6, 7.2. A finding still fails them. Without one, they are shown as Not assessed (reason
fail_only) and left out of the score, so they no longer count as passed. A clean run still scores 100%. - Regression alerts. A run whose score drops by the configured threshold (5 points by default) or more may raise a compliance regression alert.
- Earlier passes. A passed CIS AWS 2.1.4 or 2.1.5 from a run before the update is not reliable: each could pass on an unrelated S3 check.
How scanner findings count toward SOC 2 and vulnerability-management controls¶
- Web application (DAST) scans. For SOC 2, a DAST finding fails the controls its check states, and only for the 17 checks the platform lists. A DAST check outside that list no longer fails CC6.6 by default; it is mapped by the finding's words like any other finding with no stated control. Findings stored by earlier scans keep the CC6.6 they were tagged with; a re-scan does not.
- Vulnerability advisories (image, dependency and SBOM findings) fail the framework's vulnerability-management controls. PCI DSS 11.3.1 (internal vulnerability scans, high-risk and critical findings resolved) is failed only by an advisory of high or critical severity; a medium advisory still fails 6.3.1 and 6.3.3. NIST CSF ID.RA-01 and CSA CCM TVM-07 ("vulnerabilities are identified") are no longer failed by an open advisory: the advisory is the identification.
Improving your score¶
- Go to Findings, filter by the framework you want to improve.
- Sort by severity - address
criticalandhighfirst. - Use the Remediation Steps on each finding detail page.
- Re-run the inspection to verify the fix.
Frameworks are additive
You can include multiple frameworks in a single run. Each is scored independently.