PCI-DSS v4.0.1 Is Mandatory — Here's What Your AWS Infrastructure Needs to Pass

The 5 AWS misconfigurations that are failing fintech PCI-DSS v4.0.1 audits in 2026 — and a 32-rule scan that gets you audit-ready in 30 days.

Deadline passed March 31, 2025. PCI-DSS v4.0.1 is no longer a "prepare for" — it's the active standard. QSA assessors are now checking against it. If your AWS infrastructure was configured for 3.2.1, your next audit will find gaps. Here's what's changed and what to fix first.

What We'll Cover

  1. What v4.0.1 Changed That Affects Your AWS Setup
  2. #1 IAM Overpermission — The #1 PCI-DSS v4.0.1 Failure Point
  3. #2 S3 Public Buckets — Cardholder Data Exposure Path
  4. #3 CloudTrail Configuration Gaps — Your Audit Log Problem
  5. #4 KMS Key Policy Misconfiguration — Encryption Without Access Control
  6. #5 RDS Encryption Gaps — At-Rest Cardholder Data Unprotected
  7. How Guardrail's 32 Rules Map to PCI-DSS v4.0.1 Requirements
  8. Your 30-Day Path to PCI-DSS v4.0.1 AWS Audit Ready

What v4.0.1 Changed That Affects Your AWS Setup

PCI-DSS 4.0.1 is a minor revision to 4.0 — the real shift came with the March 31, 2025 deadline. The standard introduced targeted risk analysis requirements, expanded multi-factor authentication rules, and tightened controls around data encryption and key management. For AWS infrastructure running cardholder data environments (CDE), the changes that hit hardest are:

Risk-Based Approach (Req 2.2.1)

You must formally document why each control applies to your environment — no more copy-paste from generic templates. AWS service selection and configuration decisions need a written risk rationale.

MFA Expansion (Req 8.4.2)

MFA is now required for all access into the CDE, including programmatic API calls with long-lived credentials. IAM roles used by application workloads need MFA-equivalent controls.

Encryption Key Scope (Req 3.3, 3.4)

v4.0.1 clarifies that encryption keys protecting CHD must have documented key owners and documented access procedures. Unmanaged or shared keys fail.

Automated Monitoring (Req 10.1, 10.7)

Audit logs must be reviewed automatically, not manually. You need automated anomaly detection for administrative actions — CloudTrail misconfiguration is now an audit finding.

The PCI SSC's v4.0.1 summary of changes document lists 64 total changes. But for fintech CTOs running AWS, these four changes are where QSA assessors are spending the most time — and where we see the most failures in our scans.

#1 IAM Overpermission — The #1 PCI-DSS v4.0.1 Failure Point

PCI-DSS v4.0.1 Requirement 6.3.3 requires that system components and software are protected from known vulnerabilities by applying security patches and maintaining configuration baselines. For IAM, this means overprivileged roles are no longer a "best practice" finding — they're a compliance failure.

The most common IAM failures we see in fintech AWS environments: roles with Action: "*", inline policies granting iam:* to non-admin identities, permissions boundaries set to *, and service roles with resource-level wildcards across all S3 buckets. Any of these violates the principle of least privilege required by PCI-DSS 4.0 Requirement 7.2.1.

● Critical
IAM role grants wildcard actions or full administrative privileges
Affects: IAM Roles, Policies — Cardholder Data Environment (CDE)
PCI-DSS 4.0 Req 6.3.3 PCI-DSS 4.0 Req 7.2.1 PCI-DSS 4.0 Req 8.1.1

Detection — AWS CLI

# Find local policies with wildcard actions or resources
aws iam list-policies --scope Local --query 'Policies[*].[PolicyName,Arn]' --output text | while read name arn; do
  version=$(aws iam get-policy --policy-arn "$arn" --query 'Policy.DefaultVersionId' --output text)
  doc=$(aws iam get-policy-version --policy-arn "$arn" --version-id "$version" --query 'PolicyVersion.Document' --output json)
  if echo "$doc" | grep -q '"Action":\n.*"[*]'; then
    echo "WILDCARD ACTION: $name"
  fi
  if echo "$doc" | grep -q '"Resource":\n.*"[*]'; then
    echo "WILDCARD RESOURCE: $name"
  fi
done

# List roles with overly permissive trust policies (federated users, services)
aws iam list-roles --query 'Roles[*].[RoleName,Arn]' --output text | while read rname rarn; do
  trust=$(aws iam get-role --role-name "$rname" --query 'Role.AssumeRolePolicyDocument' --output json)
  if echo "$trust" | grep -q '"AWS": "arn:aws:iam::'; then
    if echo "$trust" | grep -qv 'PrincipalTag'; then
      echo "STATIC FEDERATED TRUST: $rname"
    fi
  fi
done

How to fix it for PCI-DSS compliance

  1. Run aws iam simulate-principal-policy for each role in the CDE to identify which permissions are actually used in the first 30 days — delete everything else
  2. Enable IAM Access Analyzer and configure it to publish findings to Security Hub — this creates the documented evidence your QSA will ask for
  3. Replace inline policies with customer-managed AWS Config conformance packs so that any future overpermission triggers an automated remediation
  4. Document the risk rationale for every role with elevated permissions: what business function requires it, what happens if the scope is reduced
  5. For roles used by Lambda or ECS tasks in the CDE, implement service-linked roles with resource-based policies instead of role-based policies

#2 S3 Public Buckets — Cardholder Data Exposure Path

PCI-DSS 4.0 Requirement 3.2 requires that cardholder data is protected at rest. If your S3 buckets containing CHD or cardholder data access logs are publicly accessible — or have bucket policies that don't explicitly deny public access — that's a critical finding. The 2019 Capital One breach is still the textbook example: an overpermissive IAM role combined with a public S3 bucket holding 100 million customer records.

In fintech environments, we commonly see: backup snapshots in public buckets, database exports with tokenized cardholder data, Lambda deployment packages with embedded API keys, and CloudTrail logs that include sensitive API call parameters — all with BlockPublicAcls disabled.

● Critical
S3 bucket storing CDE data allows public access or has no Block Public Access policy
Affects: S3 Buckets — Cardholder Data Environment
PCI-DSS 4.0 Req 3.2 PCI-DSS 4.0 Req 3.4 PCI-DSS 4.0 Req 8.3.2

Detection — AWS CLI

# Check every bucket for public access block settings
aws s3api list-buckets --query 'Buckets[].Name' --output text | while read bucket; do
  echo "=== $bucket ==="
  aws s3api get-public-access-block --bucket "$bucket" 2>/dev/null || echo "No block policy set — FAIL"
done

# Verify bucket ACLs don't grant AllUsers or AuthenticatedUsers access
aws s3api list-buckets --query 'Buckets[].Name' --output text | while read bucket; do
  acl=$(aws s3api get-bucket-acl --bucket "$bucket" 2>/dev/null)
  if echo "$acl" | grep -q "http://acs.amazonaws.com/groups/global/AllUsers"; then
    echo "PUBLIC ACL: $bucket"
  fi
done

# Check bucket policies for public access grants
aws s3api list-buckets --query 'Buckets[].Name' --output text | while read bucket; do
  policy=$(aws s3api get-bucket-policy --bucket "$bucket" --query 'Policy' --output json 2>/dev/null)
  if echo "$policy" | grep -qi '"Principal":\n.*"*"'; then
    echo "PUBLIC POLICY: $bucket"
  fi
done

How to fix it for PCI-DSS compliance

  1. Enable S3 Block Public Access at the account level — this is the first thing your QSA will ask to see
  2. Set all four block public access settings: BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy, RestrictPublicBuckets
  3. Tag all buckets in the CDE with PII=CHD or Compliance=PCI so a future audit can scope exactly which buckets are in scope
  4. Enable S3 server access logging for every CDE bucket — PCI-DSS 4.0 Requirement 10.2 requires automated logging of all access to CHD
  5. Enable S3 Object Lock (WORM) on log buckets so audit logs cannot be tampered with — this is a v4.0.1 explicit requirement (Req 10.7)

#3 CloudTrail Configuration Gaps — Your Audit Log Problem

PCI-DSS 4.0 Requirement 10.2 requires logging of all individual access to cardholder data. Requirement 10.7 requires automated review of security events. Requirement 10.3 requires tamper-resistant log storage. In AWS, this means CloudTrail — and misconfigured CloudTrail is one of the most common PCI-DSS findings in our scans.

The specific gaps we see most often in fintech environments: single-region CloudTrail (leaves event visibility gaps in secondary regions), log validation disabled (logs can be modified without detection), CloudTrail writing to an S3 bucket in the same account as the CDE (a compromised workload can modify its own audit logs), and no CloudTrail Insights enabled (you have no automated anomaly detection).

● High
CloudTrail not multi-region, log validation disabled, or log storage in same account as CDE
Affects: CloudTrail, CloudWatch, S3 — Cardholder Data Environment
PCI-DSS 4.0 Req 10.1 PCI-DSS 4.0 Req 10.2 PCI-DSS 4.0 Req 10.3 PCI-DSS 4.0 Req 10.7

Detection — AWS CLI

# Check CloudTrail configuration across the account
aws cloudtrail describe-trails --query 'Trails[*].[Name,IsMultiAccountTrail,IsMultiRegionTrail,IsOrganization,IsLogging,LogFileValidationEnabled]' --output table

# Verify log file validation (SHA-256) is enabled on all trails
aws cloudtrail list-trails --query 'Trails[*].Name' --output text | while read trail; do
  validation=$(aws cloudtrail get-trail-status --name "$trail" --query 'LogFileValidationEnabled' --output text)
  if [ "$validation" = "False" ]; then
    echo "LOG VALIDATION DISABLED: $trail"
  fi
done

# Check if CloudTrail is writing to a bucket in the same account
aws cloudtrail describe-trails --query 'Trails[*].[Name,S3BucketName]' --output text | while read trail bucket; do
  bucket_account=$(aws s3api get-bucket-location --bucket "$bucket" --query 'LocationConstraint' --output text 2>/dev/null)
  echo "Trail: $trail → Bucket: $bucket (region: $bucket_account)"
done

# Check for CloudTrail Insights enabled
aws cloudtrail describe-trails --query 'Trails[*].[Name,HasCustomFields]' --output text

How to fix it for PCI-DSS compliance

  1. Enable multi-region CloudTrail with a dedicated trail for the CDE — never reuse a shared trail
  2. Log file validation (LogFileValidationEnabled: true) is mandatory for PCI — this creates SHA-256 fingerprints that detect any post-hoc log modification
  3. Write CloudTrail logs to an S3 bucket in a separate security tooling AWS account — a compromised application account should not be able to alter its own audit trail
  4. Enable CloudTrail Insights and route findings to Security Hub — PCI-DSS 4.0 Requirement 10.7 requires automated detection of anomalous behavior, not manual log review
  5. Enable S3 Object Lock (Compliance mode) on the log bucket — 365-day retention so you have a full year of tamper-resistant audit history
  6. Configure a CloudWatch Logs group with the trail and enable log group encryption with a dedicated KMS key — protects logs in transit and at rest

#4 KMS Key Policy Misconfiguration — Encryption Without Access Control

PCI-DSS 4.0 Requirement 3.4 requires that CHD is protected with strong cryptography using cryptographic keys. More importantly, Requirement 3.5 mandates documented key management procedures including key owners and access lists. We see two critical KMS failures in fintech environments: customer-managed keys (CMKs) without automatic rotation, and KMS key policies that grant overly broad access to IAM principals.

The rotation requirement in v4.0.1 Requirement 3.6.1 requires documented rotation procedures. If your CMKs protecting CHD haven't rotated since creation — and you're relying on AWS-managed keys — you have a gap. AWS-managed keys cannot have rotation enabled and cannot have custom key policies, making them non-compliant with v4.0.1's documented key ownership requirements.

● High
CMK protecting CDE data lacks automatic rotation or has overly permissive key policy
Affects: KMS Keys — Encryption keys used to protect CDE data stores
PCI-DSS 4.0 Req 3.4 PCI-DSS 4.0 Req 3.5 PCI-DSS 4.0 Req 3.6.1

Detection — AWS CLI

# List all CMKs and check rotation status
aws kms list-keys --query 'Keys[*].[KeyId,KeyArn]' --output text | while read kid arn; do
  rotation=$(aws kms get-key-rotation-status --key-id "$kid" --query 'KeyRotationEnabled' --output text)
  alias=$(aws kms list-aliases --key-id "$kid" --query 'Aliases[0].AliasName' --output text 2>/dev/null || echo "no-alias")
  if [ "$rotation" = "False" ]; then
    echo "ROTATION DISABLED: $kid (alias: $alias)"
  fi
done

# Check key policy for overly permissive grants
aws kms list-keys --query 'Keys[*].KeyId' --output text | while read kid; do
  policy=$(aws kms get-key-policy --key-id "$kid" --name default --query 'Policy' --output json)
  if echo "$policy" | grep -q '"AWS": "arn:aws:iam::.*:root"'; then
    echo "ROOT KEY POLICY: $kid"
  fi
  if echo "$policy" | grep -q '"Principal":\n.*"*"'; then
    echo "WILDCARD PRINCIPAL IN KEY POLICY: $kid"
  fi
done

# Check for keys pending deletion
aws kms list-keys --query 'Keys[*].KeyId' --output text | while read kid; do
  status=$(aws kms describe-key --key-id "$kid" --query 'KeyMetadata.KeyState' --output text)
  if [ "$status" = "PendingDeletion" ]; then
    echo "KEY PENDING DELETION: $kid — this will destroy all data encrypted with this key"
  fi
done

How to fix it for PCI-DSS compliance

  1. Migrate from AWS-managed KMS keys to customer-managed keys (CMK) for all CDE data stores — you need control over rotation, key policy, and key deletion procedures
  2. Enable automatic annual rotation on all CMKs: aws kms enable-key-rotation --key-id <key-id> — rotation is free and doesn't require re-encryption of existing data
  3. Document each CMK in a key inventory: key ID, alias, purpose, key owner (name/role), key creation date, rotation schedule, and what resources use this key
  4. Write a KMS key policy that grants kms:Decrypt only to specific IAM roles, not to all users in the account — this is what your QSA will audit under Req 3.5
  5. Never set kms:* in a key policy — scope each permission to specific actions on specific resources
  6. Set up AWS Config rules to alert on CMKs with rotation disabled and on keys entering the 7-day deletion window

#5 RDS Encryption Gaps — At-Rest Cardholder Data Unprotected

PCI-DSS 4.0 Requirement 3.4 requires that CHD is rendered unreadable anywhere it is stored. This includes your RDS instances. Unencrypted RDS instances are a direct, unambiguous compliance failure — and they're common. We see fintech startups running MySQL and PostgreSQL instances created with default settings (unencrypted) holding customer transaction data, billing records, and sometimes full card numbers.

The PCI SSC is explicit: encryption at rest must use AES-256 with proper key management. The AWS default for RDS — when created without specifying --storage-encrypted — is plaintext storage. If you have production RDS instances that were created before you implemented encryption, those instances are non-compliant with v4.0.1.

● Critical
RDS instance in CDE lacks encryption at rest with customer-managed KMS key
Affects: RDS Instances — All engines (MySQL, PostgreSQL, Aurora, MariaDB)
PCI-DSS 4.0 Req 3.2 PCI-DSS 4.0 Req 3.4 PCI-DSS 4.0 Req 3.5

Detection — AWS CLI

# List all RDS instances with encryption status and KMS key
aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier,StorageEncrypted,KmsKeyId,Engine,PubliclyAccessible]' --output table

# Find all unencrypted instances
aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier,StorageEncrypted]' --output text | grep -v 'True'

# Check RDS snapshots for unencrypted snapshots (a common PCI gap)
aws rds describe-db-snapshots --query 'DBSnapshots[*].[DBSnapshotIdentifier,Encrypted]' --output table | grep -v 'True'

# Verify RDS uses the CMK (not AWS-managed key)
aws rds describe-db-instances --query 'DBInstances[?StorageEncrypted==`true`].[DBInstanceIdentifier,KmsKeyId]' --output text

How to fix it for PCI-DSS compliance

  1. You cannot enable encryption on an existing unencrypted RDS instance — you must create a new encrypted instance and migrate. Use AWS DMS (Database Migration Service) for zero-downtime migration or AWS Backup for point-in-time restoration to an encrypted snapshot
  2. Create the encrypted instance using a CMK you control (not the default AWS-managed key): aws rds create-db-instance ... --storage-encrypted --kms-key-id <cmk-key-id>
  3. After migration, enable automated backups on the encrypted instance: --backup-retention-period 7 — PCI-DSS requires minimum 7-day retention for backup data
  4. Tag all encrypted RDS instances with Compliance=PCI-DSS-4.0 and Owner=<team-email> for the key ownership documentation required by Req 3.5
  5. Enable Performance Insights for security monitoring on all CDE RDS instances — this gives you audit-grade query performance data for PCI-DSS Requirement 10.1
  6. Create an AWS Config rule that alerts when a new RDS instance is created without encryption — catch the gap before the next audit

How Guardrail's 32 Rules Map to PCI-DSS v4.0.1 Requirements

Guardrail scans all 7 core AWS services (S3, IAM, Security Groups, CloudTrail, KMS, RDS, Lambda) against 32 misconfiguration rules. Here's how the rules map to the PCI-DSS v4.0.1 requirements most commonly cited in QSA assessments:

PCI-DSS v4.0.1 Requirement AWS Service Guardrail Rule Severity
Req 3.2 — CHD protected at rest RDS, S3, EBS RDS unencrypted, S3 unencrypted, EBS unencrypted Critical
Req 3.4 — Render CHD unreadable at rest KMS, RDS KMS key no CMK, RDS uses AWS-managed key High
Req 3.6.1 — Key rotation procedures KMS KMS CMK rotation disabled, key pending deletion High
Req 6.3.3 — Configuration baselines for vulnerabilities IAM Wildcard actions, wildcard resources, iam:* privilege Critical
Req 7.2.1 — Least privilege access control IAM, S3, RDS Overpermissioned IAM roles, public bucket ACLs Critical
Req 8.3.2 — MFA for all access to CDE IAM IAM users with long-lived access keys, no MFA enforced High
Req 8.4.2 — MFA for administrative access IAM Overpermissioned admin roles, static credentials in env vars Critical
Req 10.1 — Audit log coverage of all access to CHD CloudTrail CloudTrail disabled, single-region trail, no Insights High
Req 10.2 — Individual access to CHD logged CloudTrail, S3 CloudTrail misconfigured, S3 access logging disabled High
Req 10.3 — Tamper-resistant log storage CloudTrail, S3 Log file validation disabled, logs in same account as CDE High
Req 10.7 — Automated log anomaly detection CloudTrail CloudTrail Insights disabled, no Security Hub integration Medium

Your 30-Day Path to PCI-DSS v4.0.1 AWS Audit Ready

Most Series A–C fintech companies can close their critical and high findings in 3–4 weeks. Here's the sequence that produces the fastest audit readiness progress:

Week 1 — Inventory and Critical Fixes

  1. Run Guardrail's full 32-rule scan to get a complete inventory of your AWS security posture
  2. Identify all CDE-scoped resources: tag everything with Compliance=PCI to establish audit scope — un-scoped resources are a QSA's first question
  3. Fix Critical findings first: unencrypted RDS instances, S3 public access, wildcard IAM policies — these fail the assessment regardless of everything else

Week 2 — IAM and CloudTrail

  1. Audit every IAM role in the CDE using aws iam simulate-principal-policy — document the actual permissions in use vs. what's granted
  2. Enable multi-region CloudTrail with log file validation and write to a dedicated security account S3 bucket with Object Lock enabled
  3. Enable CloudTrail Insights and route findings to Security Hub for automated anomaly detection

Week 3 — Encryption and KMS

  1. For unencrypted RDS instances: migrate using DMS or create encrypted snapshots and point-in-time restore — use CMKs, not AWS-managed keys
  2. Enable KMS CMK rotation for all keys protecting CDE data
  3. Document all CMKs in a key inventory: owner, purpose, rotation date, resources using this key

Week 4 — Documentation and Validation

  1. Run Guardrail's scan again to validate all findings are closed
  2. Export the Guardrail scan report as evidence for your QSA: each finding mapped to the specific PCI-DSS v4.0.1 requirement it addresses
  3. Confirm AWS Config conformance packs are in place so new misconfigurations are detected automatically before the next audit cycle
Related: If you want to understand the full AWS security misconfiguration landscape (not just PCI-relevant issues), see our guide on 8 AWS Misconfigurations That Will Get You Hacked — covers the broader S3, Lambda, Security Group, and KMS findings that apply across all compliance frameworks.

Get Your PCI-DSS v4.0.1 AWS Readiness Score

Guardrail scans all 32 rules that map to PCI-DSS v4.0.1 requirements — including all 5 misconfigurations in this guide. Runs against your AWS account in under 5 minutes. No credentials stored.

Run Free PCI-DSS AWS Scan →