🚨 CMMC Phase One started November 10! Here's everything you need to know →

How to Configure AWS IAM Least-Privilege Policies to Satisfy NIST SP 800-171 REV.2 / CMMC 2.0 Level 2 - Control - AC.L2-3.1.5

Step-by-step guidance and practical AWS IAM policy examples to implement least-privilege access required by NIST SP 800-171 Rev.2 / CMMC 2.0 Level 2 (AC.L2-3.1.5) for small businesses.

•
March 31, 2026
•
5 min read

Share:

Schedule Your Free Compliance Consultation

Feeling overwhelmed by compliance requirements? Not sure where to start? Get expert guidance tailored to your specific needs in just 15 minutes.

Personalized Compliance Roadmap
Expert Answers to Your Questions
No Obligation, 100% Free

Limited spots available!

This post explains how to design and implement AWS IAM least-privilege policies to satisfy NIST SP 800-171 Rev.2 / CMMC 2.0 Level 2 control AC.L2-3.1.5 (implement least privilege for access to systems and data), with practical steps, real-world small-business examples, specific policy snippets, validation techniques, and operational tips to maintain compliance.

What AC.L2-3.1.5 requires and the compliance objective

At a high level AC.L2-3.1.5 (the Level 2 access-control requirement mapped to NIST 800-171) enforces the principle of least privilege: only authorized users, processes, or devices may access Controlled Unclassified Information (CUI) or systems that handle it, and only to the minimum extent and duration necessary. For AWS this translates into designing IAM identities, roles, and policies so that actions are restricted by action, resource, and condition, using temporary credentials and automation to reduce standing privileges.

Practical implementation steps (Compliance Framework)

Start with an identity inventory and function-to-permission mapping: enumerate human users, service principals, CI/CD systems, and contractors; map each to the specific AWS actions/resources required to perform their job function; and document this mapping as your "least-privilege matrix." Use that matrix to create scoped IAM roles (one role per job function) and customer-managed policies that list only the necessary actions on specific resource ARNs. Keep the mapping and policies in source control and tag policies/roles with a compliance owner and review cadence.

Policy construction: actions, resources, and conditions

When authoring policies, prefer explicit allow statements for narrow actions and resource ARNs rather than broad wildcards. Use policy variables (e.g., ${aws:username} or ${aws:PrincipalTag/Team}) and condition keys to enforce constraints (for example ipAddress, aws:RequestedRegion, aws:MultiFactorAuthPresent, aws:PrincipalTag). Below is a common small-business example: a policy granting developers permission to start/stop EC2 instances only when those instances are tagged with "Environment:dev" and only for specified instance ARNs.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DevEC2StartStop",
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:ec2:us-east-1:123456789012:instance/i-0abcde12345f67890"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/Environment": "dev"
        }
      }
    }
  ]
}

For S3 access, scope by bucket and prefix and require server-side encryption and specific request tags where possible. Example: allow GetObject and PutObject only to arn:aws:s3:::company-cui-bucket/app-data/* and require x-amz-server-side-encryption header via aws:RequestTag or s3:x-amz-server-side-encryption condition.

Limit iam:PassRole and use Permission Boundaries

One common misconfiguration that violates least privilege is over-permissive iam:PassRole. Limit which roles an identity can pass via an explicit iam:PassRole statement constrained to a list of Role ARNs, and add a condition such as "StringEquals": {"iam:PassedToService": "ec2.amazonaws.com"} when roles are service-specific. Implement permission boundaries for developer and contractor accounts so that even if a policy grants more rights, the boundary prevents privilege escalation. Example permission-boundary snippet (allowing only S3 read/write and limited EC2 actions):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Boundary",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": "*"
    }
  ]
}

Authentication patterns: temporary credentials, SSO, and ABAC

Prefer AWS SSO (IAM Identity Center) or federated identities (SAML/OIDC) to avoid long-lived IAM user credentials. Use STS AssumeRole for cross-account access and set short session durations (1 hour or less) for privileged roles. Attribute-based access control (ABAC) using PrincipalTags allows dynamic scoping (for example grant access to resources that match the tag on the principal). For contractors, issue time-bound roles (temporary credentials) and require MFA for roles that can access CUI.

Validation, monitoring, and evidence for auditors

Validate policies with IAM Policy Simulator and generate access reports via Access Advisor; then run IAM Access Analyzer to find broad permissions. Use AWS CloudTrail to log API activity, AWS Config rules to ensure role and policy configurations follow baseline templates (e.g., deny public S3 buckets, require encryption), and automate daily checks that no role has AdministratorAccess attached. Keep these logs for the retention period required by the contract and produce a simple audit packet: identity inventory, role-to-policy mapping, evidence of policy simulation, Access Analyzer warnings addressed, CloudTrail logs showing enforcement actions.

Small-business scenarios and practical tips

Scenario 1: A 10-person shop with one DevOps engineer. Create three roles: dev-role (dev EC2 and S3 sandbox), ci-role (limited access to ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer, and s3:PutObject to a build-artifact bucket), and admin-role (strictly for infrastructure team, MFA required, assume duration 1 hour). Use permission boundaries to protect the account root scope. Scenario 2: Contractor needs temporary access to review logs — create a contractor role with CloudWatchReadOnly permissions and a tag-based expiration date; revoke by removing the trust relationship or changing a tag. Keep policies small, test them in a staging environment, and use infrastructure-as-code (CloudFormation, Terraform) so policy changes are auditable.

Risks, compliance tips, and best practices

Failing to implement least-privilege IAM increases the risk of credential abuse, lateral movement, data exfiltration, and supply-chain compromise — and for DoD contractors can result in losing contracts or failing an audit. Best practices: enforce a policy review cadence (quarterly), automate remediation for known misconfigurations, adopt "deny-by-default" service control policies (SCPs) at the organization level for high-risk actions (like disabling CloudTrail), require MFA for privilege elevation, and document justifications for any exceptions. Use metrics: percentage of roles with admin privileges, number of policies using wildcards, and average session length for privileged roles.

Summary: To satisfy AC.L2-3.1.5 you must design IAM around least privilege — inventory identities, map roles to specific actions/resources, use conditions, permission boundaries, temporary credentials, and automation to validate and monitor permission scope; for small businesses this is achievable with a small set of scoped roles, policy examples as provided, and an automated validation and audit process to prove compliance and reduce risk.

 

Quick & Simple

Discover Our Cybersecurity Compliance Solutions:

Whether you need to meet and maintain your compliance requirements, help your clients meet them, or verify supplier compliance we have the expertise and solution for you

 CMMC Level 1 Compliance App

CMMC Level 1 Compliance

Become compliant, provide compliance services, or verify partner compliance with CMMC Level 1 Basic Safeguarding of Covered Contractor Information Systems requirements.
 NIST SP 800-171 & CMMC Level 2 Compliance App

NIST SP 800-171 & CMMC Level 2 Compliance

Become compliant, provide compliance services, or verify partner compliance with NIST SP 800-171 and CMMC Level 2 requirements.
 HIPAA Compliance App

HIPAA Compliance

Become compliant, provide compliance services, or verify partner compliance with HIPAA security rule requirements.
 ISO 27001 Compliance App

ISO 27001 Compliance

Become compliant, provide compliance services, or verify partner compliance with ISO 27001 requirements.
 FAR 52.204-21 Compliance App

FAR 52.204-21 Compliance

Become compliant, provide compliance services, or verify partner compliance with FAR 52.204-21 Basic Safeguarding of Covered Contractor Information Systems requirements.
 
Hello! How can we help today? 😃

Chat with Lakeridge

We typically reply within minutes