NIST SP 800-53 Rev. 5 · Contingency Planning
CP-9 on Splunk
Backup missing for assets requiring it — a published SPL query you can run against Splunk Enterprise / Enterprise Security, with the evidence it needs, the settings you decide, and what a result does and does not establish.
Why this matters
A critical system whose backups have silently been failing
Backups are usually configured once and then trusted. A backup job that begins failing does so quietly, and the failure is typically discovered at the worst possible moment — during an attempted recovery after ransomware or hardware loss.
Why this check earns its place. It checks that backups actually succeeded recently, rather than that a backup was configured at some point.
- What it reads
- The organization's own backup job history, compared against its inventory of systems that require backup.
- What it reports
- Systems that require a backup and have no recent successful one.
See related public disclosures on the Signals page →
What this finds
Asset declared as requiring backup has no successful backup within twice its recovery point objective.
The requirement
The organization must conduct backups of user-level, system-level, and system documentation information at an organization-defined frequency, and protect the confidentiality, integrity, and availability of backup information.
NIST SP 800-53 Rev. 5 — CP-9 (System Backup).
NIST requires backups at a defined frequency. Which assets require backup, the recovery point objective per asset, and what counts as a successful backup are organization-defined — supplied through the asset inventory.
How this maps to the CISA performance goals
The Cross-Sector Cybersecurity Performance Goals are a voluntary baseline published by CISA — the U.S. federal agency for critical-infrastructure cybersecurity — written for organizations too small to employ security staff. This control speaks to:
- 3.O — Maintain system backups & restoration ability
The goal is maintaining backups; the pack finds assets that require one and do not have it.
See the full coverage map, including the goals no query can answer →
Evidence this query needs
Asset inventory asset_inventory.csv
Declares which assets are in scope and what is required of them. A backup that never ran on an asset you did not know existed produces no alert — absence of evidence is invisible without an inventory to compare against.
Minimum fields: asset_id, environment, criticality
Three fields let you scope the checks. The backup_required and logging_required flags are what make the absence checks possible — without them the tool cannot tell an asset that should be backed up from one that should not.
The query
Published as cp-9-backup-coverage.splunk.spl. Reads asset_inventory.csv (lookup), index=ops sourcetype=backup:jobs. Requires: Search access to the ops index; Read on the lookup.
Before this returns anything,
index=ops sourcetype=backup:jobs has to be reaching Splunk Enterprise / Enterprise Security, and asset_inventory.csv (lookup) has to be landed there. If not, the query reports nothing found — which looks
exactly like nothing wrong. What has to be switched on first →
| inputlookup asset_inventory.csv
| where backup_required="TRUE"
| where isnull(decommission_date) OR decommission_date=""
OR strptime(decommission_date,"%Y-%m-%d") > now()
| eval rpo=if(isnull(rpo_hours) OR rpo_hours="",24,tonumber(rpo_hours))
| eval asset_key=lower(asset_id)
| join type=left asset_key
[ search index=ops sourcetype=backup:jobs status="completed" earliest=-7d
| eval asset_key=lower(resource_id)
| stats max(_time) as last_good_backup by asset_key ]
| eval hours_since=if(isnull(last_good_backup), 9999,
round((now()-last_good_backup)/3600))
| where hours_since > (rpo*2)
| table asset_id, asset_name, criticality, owner, rpo,
last_good_backup, hours_since
| sort - hours_since
Open this pack on Splunk to adjust the settings and download it →
The interactive version opens on Splunk — the platform on this page — even if your environment profile does not list it.
Settings you decide
NIST states the objective and leaves these to your organization. The interactive version of this pack applies them to the query for you.
- RPO breach multiplier (default 2)
- An asset is reported once the time since its last successful backup exceeds its RPO multiplied by this factor.
- Limit to specific assets (optional)
- Paste asset identifiers, one per line.
What this query returned when it was run
Executed against Splunk Enterprise 10.4.2 on 2026-08-07 against purpose-built test data. The software examined 0 records and returned 1 result in 0.085 seconds.
| asset_id | asset_name | criticality | owner | rpo | hours_since |
|---|---|---|---|---|---|
| sql-finance-prod | Finance SQL | critical | DATA-ENG | 4 | 9999 |
Test data, not a real organization. It shows the query executes and returns the intended shape of result.
Running it continuously
Correlation search → notable event
Search type: Correlation search (Enterprise Security)
Cron schedule: 0 */6 * * * (every 6 hours)
Time range: -7d to now
Trigger: Number of results > 0
Alert action: Create notable event, assign by owner
Urgency: High
Security domain: Endpoint
Throttling: Suppress 12h on asset_id
Driving the search from the inventory lookup rather than from backup events is what makes this an absence check — searching backup events alone can never reveal an asset that has never been backed up at all.
What a result does not prove
Absence of a backup job record does not establish that data is unrecoverable. It establishes that recoverability cannot be evidenced from the queried source — which for a resilience control is the question that matters at review.
Validation status for this platform: Lab-validated. Executed by the maintainer in a personally controlled laboratory environment on the date shown. Table names, field names, and operator support still vary by tenant configuration, API version, connector, and add-on.
Before you act on a result
- Is the asset genuinely in scope, or is the inventory flag stale?
- Is the asset protected by a mechanism this query does not read (snapshots, replication)?
- Has the backup job been failing silently, or was it never configured?
- When was the last successful restore test for this asset?
Common questions
- How do I check for backup missing for assets requiring it in Splunk?
- Run the published SPL query on this page against Splunk Enterprise / Enterprise Security. It reads asset_inventory.csv (lookup), index=ops sourcetype=backup:jobs and reports: Asset declared as requiring backup has no successful backup within twice its recovery point objective.
- What permissions are needed to run this Splunk query?
- Search access to the ops index; Read on the lookup.
- What evidence does CP-9 need that Splunk cannot produce?
- Asset inventory (asset_inventory.csv). Declares which assets are in scope and what is required of them. A backup that never ran on an asset you did not know existed produces no alert — absence of evidence is invisible without an inventory to compare against. At minimum it must carry: asset_id, environment, criticality.
- Does a result from this query mean the control has failed?
- Absence of a backup job record does not establish that data is unrecoverable. It establishes that recoverability cannot be evidenced from the queried source — which for a resilience control is the question that matters at review.
Terms used on this page
- NIST SP 800-53the U.S. federal catalogue of security requirements
- The catalogue of security and privacy requirements published by the National Institute of Standards and Technology, a U.S. federal agency. U.S. government systems are measured against it, and many private organizations adopt it voluntarily. Each requirement has an identifier such as AC-2. Official source →
- CISACybersecurity and Infrastructure Security Agency
- The U.S. federal agency responsible for national critical-infrastructure cybersecurity. Its publications are works of the U.S. government and are free to use. Official source →
- SPLSearch Processing Language
- The language used to ask questions of data held in Splunk. A query written in it is text and can be read before it is run.
- CPGCross-Sector Cybersecurity Performance Goals
- A voluntary baseline of security practices published by the U.S. Cybersecurity and Infrastructure Security Agency, written specifically for organizations too small to employ security staff. It is a short, plainly written starting list rather than a full standard. Official source →
- RPOrecovery point objective
- How much recent work an organization has decided it can afford to lose. A four-hour objective means backups must be recent enough that no more than four hours of work would be lost.
- lab-validatedexecuted in a controlled test environment
- The check has been run, by the maintainer, against real security software loaded with purpose-built test data, and what it returned was recorded. It has not been run on any real organization's data.
The same control on other platforms
- CP-9 on Microsoft Sentinel — KQL
- CP-9 on AWS — SQL (Athena) + Lambda
- All platforms for CP-9