KSI-CMT-LMCPartial reviewLogging Changes
CMT — Change Management
NIST 800-53: au-2, cm-3, cm-3.2, cm-4.2, cm-6, cm-8.3, ma-2
- Who this is for
- Cloud service providers
- Service class
- All service classes
- Implementation guidance
- Reviewed guidance available
- Evidence automation
- Not published
What your CSP needs to do
This KSI asks whether changes to your offering are both captured and watched. Proving it takes four things:
- Control-plane changes land in an audit trail everywhere your system runs — CloudTrail across all regions on AWS, Activity Log exported via diagnostic settings on Azure, audit-log sinks with a real destination on GCP.
- Configuration state changes are recorded, not just API calls — an actively-recording AWS Config recorder, or GCP log-based metrics with a filter that captures change events.
- A human gets notified: CloudWatch alarms with actions enabled, Azure Activity Log alert rules enabled, GCP alert policies enabled. Logging without alerting is only half the KSI ("logged and monitored").
- Code and process changes flow through a tracked workflow — pull/merge request review enforced by branch protection in GitHub, GitLab, or Bitbucket, and/or formal change records in Jira or ServiceNow.
The most common way CSPs fail this one: the logging half exists but the monitoring half doesn't — trails and alert rules are configured, yet alarm actions are disabled or empty, so changes are recorded that nobody will ever see.
Implementation: AWS
Three signals cover the capture-record-notify chain on AWS. Each is evaluated per resource; AWS is covered once at least one of its resources passes.
- CloudTrail (
aws:cloudtrail) — every trail must have logging enabled and be multi-region. A single-region trail fails: change events outside its home region are never captured. - AWS Config (
aws:config) — every configuration recorder must be actively recording. A recorder that exists but is stopped fails: API-call logging alone does not prove configuration-state changes are captured. - CloudWatch alarms (
aws:cloudwatch_alarms) — every metric alarm must have actions enabled and at least one alarm action attached (an SNS topic or similar). An alarm with an empty action list fails: change events would trigger no notification.
Implementation: Azure
Two assertions, both carried by the azure:activity_log signal over Azure Monitor resources.
- Diagnostic settings (
azure:activity_log) — each diagnostic setting must have at least one enabled log category, proving the Activity Log is actually being exported (to a Log Analytics workspace or storage account) rather than merely retained by default. - Activity Log alert rules (
azure:activity_log) — each alert rule must be enabled. A disabled rule fails: change events would trigger no notification.
Implementation: GCP
Three assertions across Cloud Logging and Cloud Monitoring.
- Logging sinks (
gcp:audit_logs) — each sink must have an export destination. A sink with no destination fails: audit logs are not being exported anywhere durable. - Log-based metrics (
gcp:audit_logs) — each log-based metric must have a filter pattern, proving change events are actually being distilled into monitorable signals. - Alert policies (
gcp:monitoring) — each Cloud Monitoring alert policy must be enabled, closing the loop from captured change event to human notification.
What passing evidence looks like
Boundera evaluates this KSI provider-by-provider: score = covered providers / counted providers, where a provider is covered once at least one of its resources passes. Two scoring rules worth knowing exactly:
- A connected cloud provider (AWS, Azure, GCP) that returns zero evidence is stubbed in as a failing provider — connecting a cloud and going dark counts against you rather than being silently skipped.
- Non-cloud providers (Jira, ServiceNow, GitHub, GitLab, Bitbucket) with no evidence simply drop out of scoring — they don't fail you, but they can't cover you either.
Passing automated evidence contains these signals (each row carries the collected_at timestamp of the most recent connector scan). The cloud signals, as detailed in the provider sections above:
aws:cloudtrail— trail is logging, multi-regionaws:config— recorder actively recordingaws:cloudwatch_alarms— alarm actions enabled, at least one action wiredazure:activity_log— diagnostic settings export at least one enabled log category; alert rules enabledgcp:audit_logs— sinks have a destination; log-based metrics have a filtergcp:monitoring— alert policies enabled
Plus the change-workflow signals:
jira:change_tickets— issues areChange/Change Requesttype recordsservicenow:change_requests— change requests have been submitted for approval (not sitting in Draft state)github:branch_protection— the default branch is protected and requires at least one approving PR reviewgitlab:branch_protection— the default branch restricts both push and merge access, routing changes through MR workflowbitbucket:pull_requests— at least one default reviewer is configured per repo (the evidence also reports the recently-merged PR count as activity proof)
What an assessor may challenge
- Single-region CloudTrail. The trail is logging, but only in its home region — change events elsewhere in the boundary are never captured, and the signal fails on
is_multiregion. - Alerting theater. Alarms and alert rules exist but are disabled or have no actions attached — AWS CloudWatch alarms with an empty action list, Azure alert rules toggled off, GCP alert policies disabled. Change events fire into the void.
- Config recorder created once, stopped since. The recorder exists in the account but
recordingis off, so configuration drift is invisible. - Dead-end GCP logging. A sink with no destination, or a log-based metric with no filter — the plumbing exists but exports or captures nothing.
- Untracked merge paths. A GitHub default branch without required reviews, a GitLab branch without push/merge restrictions, or a Bitbucket repo with no default reviewers — changes land in production code with no approval trail. On the ITSM side, ServiceNow change requests stuck in Draft prove intent, not tracking.
Official FedRAMP source
Verbatim from FedRAMP/rules
Modifications to the cloud service offering are logged and monitored.
How Boundera handles this
Boundera evaluates KSI-CMT-LMC continuously from your connectors, grouped per provider: aws:cloudtrail, aws:config, and aws:cloudwatch_alarms on AWS; azure:activity_log (diagnostics + alert rules) on Azure; gcp:audit_logs and gcp:monitoring on GCP; jira:change_tickets and servicenow:change_requests for ITSM change records; and github:branch_protection, gitlab:branch_protection, bitbucket:pull_requests for SCM change workflow. Each connected domain must independently demonstrate change logging — one healthy provider cannot mask another that has gone dark.
What still needs you: connect the connectors for every provider actually in your boundary, and make sure alerting resources (alarms, alert rules, policies) exist so the monitoring half has something to evaluate. Request a demo to watch KSI-CMT-LMC score your real CloudTrail trails, Activity Log settings, and audit-log sinks provider by provider.
References
- FRMR rule definition:
data/fedramp-rules/fedramp-consolidated-rules.json(KSI.CMT.indicators["KSI-CMT-LMC"]) - NIST SP 800-53 Rev 5: AU-2, CM-3, CM-3(2), CM-4(2), CM-6, CM-8(3), MA-2
Content provenance
Official requirement text is sourced from FedRAMP/rules . Boundera implementation guidance has not been fully reviewed for this item.
Guidance authors: Eddy Agu.