{
  "title": "How to Configure Cloud Platforms (Azure/AWS) for NIST SP 800-171 REV.2 / CMMC 2.0 Level 2 - Control - AU.L2-3.3.9: Restricting Audit Log Management to Privileged Roles",
  "date": "2026-04-22",
  "author": "Lakeridge Technologies",
  "featured_image": "/assets/images/blog/2026/4/how-to-configure-cloud-platforms-azureaws-for-nist-sp-800-171-rev2-cmmc-20-level-2-control-aul2-339-restricting-audit-log-management-to-privileged-roles.jpg",
  "content": {
    "full_html": "<p>NIST SP 800-171 Rev.2 / CMMC 2.0 Level 2 Control AU.L2-3.3.9 requires that management of audit logs is restricted to privileged roles so that logs cannot be altered, disabled, or deleted by unauthorized users — a core protection for integrity and non-repudiation of your system monitoring and incident response capability.</p>\n\n<h2>Why this control matters (context for Compliance Framework)</h2>\n<p>From a Compliance Framework perspective, the objective is to ensure audit trail integrity by limiting who can change logging configuration, retention, or delete log data. For small businesses handling Controlled Unclassified Information (CUI) or contractor data, failure to restrict audit-log management increases the risk that an insider or attacker can erase evidence of malicious activity or hide changes to critical resources, which directly undermines incident investigations and compliance attestations.</p>\n\n<h2>Implementation approach — core concepts (apply to both Azure and AWS)</h2>\n<p>Start with three core activities: (1) centralize logs so management is simpler and fewer principals need privileged access (use a dedicated logging account / subscription), (2) apply strong least-privilege access for any administrative tasks (use built-in roles + custom roles and just-in-time elevation), and (3) make log storage immutable or strongly protected (object lock / immutable blob / resource locks) and monitor any changes to logging configuration itself. These map directly to Compliance Framework expectations for role separation, least privilege, and evidence retention.</p>\n\n<h2>Azure-specific implementation details</h2>\n<p>For Azure, centralize diagnostics and platform logs into a dedicated Log Analytics workspace, storage account with immutable blob (WORM), or an Event Hubs stream to a SIEM. Use Azure RBAC to restrict who can manage diagnostic settings (resource type microsoft.insights/diagnosticSettings). Avoid giving broad Owner or Contributor rights across subscriptions. Instead, assign minimal monitoring roles (Monitoring Reader, Log Analytics Reader) to most users, and assign a small set of users the roles that can change diagnostic settings, such as Log Analytics Contributor or a custom privileged role that includes only specific write actions. Use Azure AD Privileged Identity Management (PIM) to require approval and time-limited elevation for those privileged roles.</p>\n\n<p>Harden the storage destination: enable Azure Storage immutable blob storage (Legal Hold or Retention Policy) on any storage account used for diagnostic logs, and apply resource locks to log destinations to prevent accidental deletion of the storage account. Use Azure Policy to enforce diagnostic settings and to deny or remediate resources that do not send logs to your central workspace. Create Activity Log alerts for actions that change diagnostic settings or role assignments (e.g., alerts on \"Write\" operations to Microsoft.Authorization/roleAssignments or microsoft.insights/diagnosticSettings), and send those alerts to a secure team (or playbook) for investigation.</p>\n\n<h2>AWS-specific implementation details</h2>\n<p>In AWS, centralize CloudTrail logs into a dedicated logging account and an S3 bucket configured for security/audit use. Configure CloudTrail to log management events and to enable CloudTrail log file validation and SNS notifications on new logs. Protect the S3 bucket with bucket policies that allow only the CloudTrail service and an explicit, small set of principals to write or manage objects. Use S3 Object Lock in “Compliance” mode to prevent object deletion during the retention period. At the account level, use SCPs (Service Control Policies) in AWS Organizations to deny CloudTrail and CloudWatch Logs management actions across member accounts except for an allow-listed administrative role in the logging account.</p>\n\n<p>Also lock down IAM actions that can alter logging: explicitly deny actions such as cloudtrail:DeleteTrail, cloudtrail:StopLogging, cloudtrail:UpdateTrail, logs:DeleteLogGroup, logs:DeleteLogStream, logs:PutRetentionPolicy, and s3:DeleteObject (for the logging bucket) except for a small privileged principal. Deploy AWS Config rules to detect disabled CloudTrail or changes to the trail configuration and automate remediation with Lambda where appropriate. Create CloudWatch Alarms and EventBridge rules that notify security on any API calls that change logging configuration or role assignments (these API calls are themselves recorded by CloudTrail).</p>\n\n<h2>Practical small-business scenarios and examples</h2>\n<p>Scenario 1 — Small dev shop with 2 admins: Create a dedicated logging account (or subscription), enable CloudTrail/Azure Diagnostic to central destination, and put a single Log Admin role in a small group of 2 people. Require PIM/JIT for Azure and require AssumeRole with approval for AWS. Store break-glass credentials in a hardware-protected vault and audit any use. This reduces the blast radius and simplifies compliance evidence collection for auditors.</p>\n\n<p>Scenario 2 — Contractor with multi-environment accounts: Use organization-level SCPs (AWS) and Azure Management Group policies to prevent member accounts from creating logging destinations that bypass central storage. Use IAM permission boundaries or Azure custom roles to prevent developers from assigning themselves logging-admin capabilities. Automate detection of changes to logging config and configure automated remediation to re-enable logging and flag the incident for investigation.</p>\n\n<h2>Sample technical artifacts and quick references</h2>\n<p>Example AWS SCP snippet (deny log-management except for an allow-listed role — replace ARNs with your own):</p>\n<pre><code>{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"DenyCloudTrailChangesExceptLoggingAdmin\",\n      \"Effect\": \"Deny\",\n      \"Action\": [\n        \"cloudtrail:DeleteTrail\",\n        \"cloudtrail:StopLogging\",\n        \"cloudtrail:UpdateTrail\",\n        \"logs:DeleteLogGroup\",\n        \"logs:DeleteLogStream\",\n        \"s3:DeleteObject\"\n      ],\n      \"Resource\": \"*\",\n      \"NotPrincipal\": {\n        \"AWS\": [\n          \"arn:aws:iam::123456789012:role/LoggingAdminRole\",\n          \"arn:aws:iam::123456789012:role/SecurityAuditRole\"\n        ]\n      }\n    }\n  ]\n}</code></pre>\n\n<p>Azure tip: create a narrow custom role that grants only the actions needed to manage diagnostic settings and assign it to a specific Azure AD group. Use PIM to require approval and limited activation times for that group. Also enable immutable blob storage on the target storage account to enforce WORM retention for logs.</p>\n\n<h2>Compliance tips, monitoring, and best practices</h2>\n<p>Best practices you can implement quickly: (1) centralize and minimize the number of principals who can manage logs, (2) apply least privilege and use time-limited elevation (PIM / assume-role), (3) enforce immutability for log storage (S3 Object Lock / Azure Immutable Blob), (4) monitor and alert on any changes to logging configuration and to role assignments, (5) use organization-level guardrails (AWS SCPs / Azure Management Group Policies) to prevent circumvention, and (6) document a “break-glass” process with approvals and recorded justification for any log management actions. Regularly (quarterly) review who has privileged log-management access and require attestation for those principals as part of your Compliance Framework evidence.</p>\n\n<h2>Risk of not implementing AU.L2-3.3.9</h2>\n<p>If you do not restrict audit-log management to privileged roles, attackers or negligent insiders can disable or delete logs and eradication of evidence will hamper forensic investigations and incident reporting, lead to failed supplier or government audits, and create a higher risk of data exfiltration going undetected. For organizations required to meet NIST SP 800-171 / CMMC, this can translate into non-conformance, loss of contracts, and financial penalties.</p>\n\n<p>In summary, meeting AU.L2-3.3.9 on Azure and AWS is a combination of architecture (centralized log collection), access control (RBAC/IAM least privilege and PIM/assume-role), storage hardening (immutable logs / object lock / resource locks), and detection (alerts for logging/config changes). For small businesses, start by centralizing logs, shrinking the list of principals with log-management privileges, and putting immutability and monitoring in place — those steps will get you a long way toward satisfying the Compliance Framework requirement while reducing your operational and legal risk.</p>",
    "plain_text": "NIST SP 800-171 Rev.2 / CMMC 2.0 Level 2 Control AU.L2-3.3.9 requires that management of audit logs is restricted to privileged roles so that logs cannot be altered, disabled, or deleted by unauthorized users — a core protection for integrity and non-repudiation of your system monitoring and incident response capability.\n\nWhy this control matters (context for Compliance Framework)\nFrom a Compliance Framework perspective, the objective is to ensure audit trail integrity by limiting who can change logging configuration, retention, or delete log data. For small businesses handling Controlled Unclassified Information (CUI) or contractor data, failure to restrict audit-log management increases the risk that an insider or attacker can erase evidence of malicious activity or hide changes to critical resources, which directly undermines incident investigations and compliance attestations.\n\nImplementation approach — core concepts (apply to both Azure and AWS)\nStart with three core activities: (1) centralize logs so management is simpler and fewer principals need privileged access (use a dedicated logging account / subscription), (2) apply strong least-privilege access for any administrative tasks (use built-in roles + custom roles and just-in-time elevation), and (3) make log storage immutable or strongly protected (object lock / immutable blob / resource locks) and monitor any changes to logging configuration itself. These map directly to Compliance Framework expectations for role separation, least privilege, and evidence retention.\n\nAzure-specific implementation details\nFor Azure, centralize diagnostics and platform logs into a dedicated Log Analytics workspace, storage account with immutable blob (WORM), or an Event Hubs stream to a SIEM. Use Azure RBAC to restrict who can manage diagnostic settings (resource type microsoft.insights/diagnosticSettings). Avoid giving broad Owner or Contributor rights across subscriptions. Instead, assign minimal monitoring roles (Monitoring Reader, Log Analytics Reader) to most users, and assign a small set of users the roles that can change diagnostic settings, such as Log Analytics Contributor or a custom privileged role that includes only specific write actions. Use Azure AD Privileged Identity Management (PIM) to require approval and time-limited elevation for those privileged roles.\n\nHarden the storage destination: enable Azure Storage immutable blob storage (Legal Hold or Retention Policy) on any storage account used for diagnostic logs, and apply resource locks to log destinations to prevent accidental deletion of the storage account. Use Azure Policy to enforce diagnostic settings and to deny or remediate resources that do not send logs to your central workspace. Create Activity Log alerts for actions that change diagnostic settings or role assignments (e.g., alerts on \"Write\" operations to Microsoft.Authorization/roleAssignments or microsoft.insights/diagnosticSettings), and send those alerts to a secure team (or playbook) for investigation.\n\nAWS-specific implementation details\nIn AWS, centralize CloudTrail logs into a dedicated logging account and an S3 bucket configured for security/audit use. Configure CloudTrail to log management events and to enable CloudTrail log file validation and SNS notifications on new logs. Protect the S3 bucket with bucket policies that allow only the CloudTrail service and an explicit, small set of principals to write or manage objects. Use S3 Object Lock in “Compliance” mode to prevent object deletion during the retention period. At the account level, use SCPs (Service Control Policies) in AWS Organizations to deny CloudTrail and CloudWatch Logs management actions across member accounts except for an allow-listed administrative role in the logging account.\n\nAlso lock down IAM actions that can alter logging: explicitly deny actions such as cloudtrail:DeleteTrail, cloudtrail:StopLogging, cloudtrail:UpdateTrail, logs:DeleteLogGroup, logs:DeleteLogStream, logs:PutRetentionPolicy, and s3:DeleteObject (for the logging bucket) except for a small privileged principal. Deploy AWS Config rules to detect disabled CloudTrail or changes to the trail configuration and automate remediation with Lambda where appropriate. Create CloudWatch Alarms and EventBridge rules that notify security on any API calls that change logging configuration or role assignments (these API calls are themselves recorded by CloudTrail).\n\nPractical small-business scenarios and examples\nScenario 1 — Small dev shop with 2 admins: Create a dedicated logging account (or subscription), enable CloudTrail/Azure Diagnostic to central destination, and put a single Log Admin role in a small group of 2 people. Require PIM/JIT for Azure and require AssumeRole with approval for AWS. Store break-glass credentials in a hardware-protected vault and audit any use. This reduces the blast radius and simplifies compliance evidence collection for auditors.\n\nScenario 2 — Contractor with multi-environment accounts: Use organization-level SCPs (AWS) and Azure Management Group policies to prevent member accounts from creating logging destinations that bypass central storage. Use IAM permission boundaries or Azure custom roles to prevent developers from assigning themselves logging-admin capabilities. Automate detection of changes to logging config and configure automated remediation to re-enable logging and flag the incident for investigation.\n\nSample technical artifacts and quick references\nExample AWS SCP snippet (deny log-management except for an allow-listed role — replace ARNs with your own):\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"DenyCloudTrailChangesExceptLoggingAdmin\",\n      \"Effect\": \"Deny\",\n      \"Action\": [\n        \"cloudtrail:DeleteTrail\",\n        \"cloudtrail:StopLogging\",\n        \"cloudtrail:UpdateTrail\",\n        \"logs:DeleteLogGroup\",\n        \"logs:DeleteLogStream\",\n        \"s3:DeleteObject\"\n      ],\n      \"Resource\": \"*\",\n      \"NotPrincipal\": {\n        \"AWS\": [\n          \"arn:aws:iam::123456789012:role/LoggingAdminRole\",\n          \"arn:aws:iam::123456789012:role/SecurityAuditRole\"\n        ]\n      }\n    }\n  ]\n}\n\nAzure tip: create a narrow custom role that grants only the actions needed to manage diagnostic settings and assign it to a specific Azure AD group. Use PIM to require approval and limited activation times for that group. Also enable immutable blob storage on the target storage account to enforce WORM retention for logs.\n\nCompliance tips, monitoring, and best practices\nBest practices you can implement quickly: (1) centralize and minimize the number of principals who can manage logs, (2) apply least privilege and use time-limited elevation (PIM / assume-role), (3) enforce immutability for log storage (S3 Object Lock / Azure Immutable Blob), (4) monitor and alert on any changes to logging configuration and to role assignments, (5) use organization-level guardrails (AWS SCPs / Azure Management Group Policies) to prevent circumvention, and (6) document a “break-glass” process with approvals and recorded justification for any log management actions. Regularly (quarterly) review who has privileged log-management access and require attestation for those principals as part of your Compliance Framework evidence.\n\nRisk of not implementing AU.L2-3.3.9\nIf you do not restrict audit-log management to privileged roles, attackers or negligent insiders can disable or delete logs and eradication of evidence will hamper forensic investigations and incident reporting, lead to failed supplier or government audits, and create a higher risk of data exfiltration going undetected. For organizations required to meet NIST SP 800-171 / CMMC, this can translate into non-conformance, loss of contracts, and financial penalties.\n\nIn summary, meeting AU.L2-3.3.9 on Azure and AWS is a combination of architecture (centralized log collection), access control (RBAC/IAM least privilege and PIM/assume-role), storage hardening (immutable logs / object lock / resource locks), and detection (alerts for logging/config changes). For small businesses, start by centralizing logs, shrinking the list of principals with log-management privileges, and putting immutability and monitoring in place — those steps will get you a long way toward satisfying the Compliance Framework requirement while reducing your operational and legal risk."
  },
  "metadata": {
    "description": "Practical, step-by-step guidance to configure Azure and AWS so that only privileged roles can manage audit logs, meeting NIST SP 800-171 Rev.2 / CMMC 2.0 Level 2 AU.L2-3.3.9 requirements.",
    "permalink": "/how-to-configure-cloud-platforms-azureaws-for-nist-sp-800-171-rev2-cmmc-20-level-2-control-aul2-339-restricting-audit-log-management-to-privileged-roles.json",
    "categories": [],
    "tags": []
  }
}