Skip to main content

Audit Readiness Guide

This guide describes how to collect evidence, generate reports, and present CloudForge CI infrastructure during external compliance audits (SOC 2, HIPAA, PCI-DSS, GDPR).

CloudForge provides infrastructure controls and evidence sources. It does not make an organization audit-ready by itself: organizational policies, application controls, and the auditor's own testing remain out of scope. Commands below use example stack names; replace them with your own. Some examples use GNU date -d; on macOS use date -v instead.

Table of Contents​

  1. Pre-Audit Preparation
  2. Evidence Collection
  3. Audit Artifacts
  4. Auditor Access
  5. Common Audit Questions
  6. Framework-Specific Guidance
  7. Post-Audit Actions

Pre-Audit Preparation​

1. Run Compliance Validation​

# Generate compliance report (argument: stack name)
./scripts/generate-compliance-report.sh CloudForge-Prod-SOC2

# Check for non-compliant resources
aws configservice describe-compliance-by-config-rule \
--compliance-types NON_COMPLIANT \
--output json > compliance-status.json

# Review and remediate non-compliant resources
cat compliance-status.json | jq '.ComplianceByConfigRules[] | select(.Compliance.ComplianceType == "NON_COMPLIANT")'

2. Generate Evidence Package​

# Run evidence generation script
./scripts/generate-audit-evidence.sh \
--stack-name CloudForge-Prod-SOC2 \
--framework SOC2 \
--start-date 2024-01-01 \
--end-date 2024-12-31 \
--output audit-evidence-2024

# This creates:
# - audit-evidence-2024/
# ├── AUDIT_EVIDENCE_README.md
# ├── infrastructure/ (template, stack metadata and resources)
# ├── iam/ (policies, roles, users, credential report)
# ├── config/ (rules, compliance status, recorders, remediation)
# ├── encryption/ (KMS, EFS, ACM, S3 encryption)
# ├── logging/ (CloudTrail, log groups, VPC Flow Logs)
# ├── monitoring/ (alarms, GuardDuty, SNS, Security Hub)
# ├── network/ (VPCs, security groups, NACLs, load balancers, WAF)
# └── compliance/ (compliance-matrix.md)
# - audit-evidence-2024.tar.gz

3. Document Infrastructure Changes​

# Export CloudFormation change sets for the audit period
aws cloudformation list-change-sets \
--stack-name CloudForge-Prod-SOC2 \
--output json > change-sets.json

# Export Git commits for infrastructure code
git log --since="2024-01-01" --until="2024-12-31" \
--pretty=format:"%h - %an, %ar : %s" > infrastructure-changes.txt

4. Prepare Documentation Package​

Collect these documents for auditors:


Evidence Collection​

Evidence Types by Control Area​

1. Access Control Evidence​

What auditors need:

  • IAM policies and roles
  • Cognito user pool configuration
  • MFA enforcement evidence
  • Access logs

How to collect:

# Export IAM policies
aws iam list-policies --scope Local --output json > iam-policies.json

# Export IAM roles
aws iam list-roles --output json > iam-roles.json

# Export Cognito User Pool configuration
POOL_ID=$(aws cloudformation describe-stacks \
--stack-name CloudForge-Prod-SOC2 \
--query 'Stacks[0].Outputs[?OutputKey==`CognitoUserPoolId`].OutputValue' \
--output text)

aws cognito-idp describe-user-pool \
--user-pool-id $POOL_ID \
--output json > cognito-config.json

# Verify MFA enforcement
aws cognito-idp describe-user-pool \
--user-pool-id $POOL_ID \
--query 'UserPool.MfaConfiguration' \
--output text

2. Encryption Evidence​

What auditors need:

  • KMS key policies
  • S3 bucket encryption configuration
  • EFS encryption status
  • TLS/SSL certificate details

How to collect:

# List KMS keys
aws kms list-keys --output json > kms-keys.json

# Check S3 bucket encryption
aws s3api list-buckets --query 'Buckets[].Name' --output text | \
while read bucket; do
echo "Bucket: $bucket"
aws s3api get-bucket-encryption --bucket $bucket 2>/dev/null || echo "No encryption"
done > s3-encryption-status.txt

# Check EFS encryption
aws efs describe-file-systems \
--query 'FileSystems[].[FileSystemId,Encrypted]' \
--output table > efs-encryption-status.txt

# Export ACM certificates
aws acm list-certificates --output json > acm-certificates.json

3. Audit Logging Evidence​

What auditors need:

  • CloudTrail configuration
  • CloudTrail logs for audit period
  • Config history
  • VPC Flow Logs configuration

How to collect:

# Export CloudTrail configuration
aws cloudtrail describe-trails --output json > cloudtrail-config.json

# Sample CloudTrail events (lookup-events covers the last 90 days;
# older events are in the trail's S3 bucket)
aws cloudtrail lookup-events \
--start-time 2024-10-01 \
--end-time 2024-12-31 \
--max-items 10000 \
--output json > cloudtrail-events.json

# Export Config timeline for a resource
aws configservice get-resource-config-history \
--resource-type AWS::EC2::Instance \
--resource-id i-1234567890abcdef0 \
--output json > config-history.json

# Verify VPC Flow Logs
aws ec2 describe-flow-logs --output json > vpc-flow-logs.json

4. Change Management Evidence​

What auditors need:

  • Infrastructure as Code (IaC) repository history
  • CloudFormation stack events
  • Config rule compliance history
  • Remediation execution history

How to collect:

# Export CloudFormation events
aws cloudformation describe-stack-events \
--stack-name CloudForge-Prod-SOC2 \
--max-items 1000 \
--output json > stack-events.json

# Export Config rule compliance timeline
aws configservice describe-compliance-by-config-rule \
--output json > config-compliance-history.json

# Export Config remediation executions
aws configservice describe-remediation-execution-status \
--config-rule-name <rule-name> \
--output json > remediation-executions.json

5. Monitoring and Incident Response Evidence​

What auditors need:

  • GuardDuty findings
  • CloudWatch alarms configuration
  • SNS notification topics
  • Security incident response logs

How to collect:

# Export GuardDuty findings
aws guardduty list-detectors --query 'DetectorIds[0]' --output text | \
xargs -I {} aws guardduty list-findings --detector-id {} --output json > guardduty-findings.json

# Export CloudWatch alarms
aws cloudwatch describe-alarms --output json > cloudwatch-alarms.json

# Export SNS topics
aws sns list-topics --output json > sns-topics.json

# Export Security Hub findings (if enabled)
aws securityhub get-findings --output json > securityhub-findings.json

Audit Artifacts​

Evidence Generation Script​

scripts/generate-audit-evidence.sh collects the evidence listed above into a timestamped directory and archive. Options:

OptionDefault
--stack-name NAMECloudForge-Prod-SOC2
--framework FRAMEWORKSOC2 (also HIPAA, PCI-DSS, GDPR)
--start-date YYYY-MM-DDOne year ago
--end-date YYYY-MM-DDToday
--output DIRaudit-evidence-<timestamp>
--region REGIONAWS_DEFAULT_REGION or us-east-1

See Evidence Generation Output Example for sample output.

Control Evidence Mapping (SOC 2 example)​

ControlEvidenceRelated AWS Config rulesValidation
CC6.1 - Logical accessiam/policies.json, iam/roles.json, Cognito user pool configurationIAM_PASSWORD_POLICY, IAM_USER_MFA_ENABLEDjq '.Policies[] | select(.PolicyName | contains("CloudForge"))' iam/policies.json
CC6.6 - Network segmentationnetwork/security-groups.json, network/vpcs.json, AWS::EC2::SecurityGroup resources in the templateVPC_SG_OPEN_ONLY_TO_AUTHORIZED_PORTSaws ec2 describe-security-groups --filters "Name=tag:aws:cloudformation:stack-name,Values=<stack-name>"
CC6.7 - Transmission securityencryption/acm-certificates.json, AWS::ElasticLoadBalancingV2::Listener resourcesALB_HTTP_TO_HTTPS_REDIRECTION_CHECKaws elbv2 describe-listeners --load-balancer-arn <alb-arn>
CC7.2 - System monitoringlogging/cloudtrail-trails.json, monitoring/cloudwatch-alarms.json, monitoring/guardduty-detectors.json, config/config-rules.jsonAll deployed rulesaws cloudtrail get-trail-status --name cloudforge-cloudtrail-<stack-name>
A1.2 / A1.3 - Backup and recoveryencryption/efs-filesystems.json, DeletionPolicy: Retain resources in the templateS3_BUCKET_VERSIONING_ENABLEDaws efs describe-file-systems

AWS Config rule names in your account are generated per stack; the identifiers above are the AWS managed rule source identifiers.


Auditor Access​

Read-Only IAM Policy for Auditors​

Create a restricted IAM policy for auditor access:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyCloudFormation",
"Effect": "Allow",
"Action": [
"cloudformation:Describe*",
"cloudformation:Get*",
"cloudformation:List*"
],
"Resource": "*"
},
{
"Sid": "ReadOnlyConfig",
"Effect": "Allow",
"Action": [
"config:Describe*",
"config:Get*",
"config:List*"
],
"Resource": "*"
},
{
"Sid": "ReadOnlyCloudTrail",
"Effect": "Allow",
"Action": [
"cloudtrail:Describe*",
"cloudtrail:Get*",
"cloudtrail:List*",
"cloudtrail:LookupEvents"
],
"Resource": "*"
},
{
"Sid": "ReadOnlyIAM",
"Effect": "Allow",
"Action": [
"iam:Get*",
"iam:List*"
],
"Resource": "*"
},
{
"Sid": "ReadOnlyS3Evidence",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::audit-evidence-bucket",
"arn:aws:s3:::audit-evidence-bucket/*"
]
}
]
}

Granting Temporary Access​

# Create auditor user
aws iam create-user --user-name auditor-external

# Attach read-only policy
aws iam put-user-policy \
--user-name auditor-external \
--policy-name AuditorReadOnly \
--policy-document file://auditor-policy.json

# Create an access key (long-lived until deleted; prefer an assumable role
# with a short session duration where your process allows it)
aws iam create-access-key --user-name auditor-external

# After audit, remove access
aws iam delete-access-key --user-name auditor-external --access-key-id AKIAIOSFODNN7EXAMPLE
aws iam delete-user-policy --user-name auditor-external --policy-name AuditorReadOnly
aws iam delete-user --user-name auditor-external

Common Audit Questions​

Q1: "How do you ensure that only authorized users can access the Jenkins environment?"​

Answer:

  • Cognito User Pool with MFA (TOTP) enabled
  • IAM roles with least-privilege permissions
  • Security groups restricting network access
  • ALB authentication with OIDC

Evidence:

  • Cognito configuration: cognito-config.json
  • IAM policies: iam/policies.json
  • Security groups: CloudFormation template section AWS::EC2::SecurityGroup

Demonstration:

# Show MFA is enforced
aws cognito-idp describe-user-pool --user-pool-id <pool-id> \
--query 'UserPool.MfaConfiguration'
# Output: "ON" or "OPTIONAL"

Q2: "How do you monitor for security incidents and unauthorized access?"​

Answer:

  • AWS CloudTrail for API call logging
  • GuardDuty for threat detection
  • AWS Config for compliance monitoring
  • CloudWatch alarms for anomaly detection
  • VPC Flow Logs for network traffic analysis

Evidence:

  • CloudTrail: logging/cloudtrail.json
  • GuardDuty: monitoring/guardduty.json
  • Config rules: config/rules.json

Demonstration:

# Show recent CloudTrail events
aws cloudtrail lookup-events --max-results 10

# Show GuardDuty findings
aws guardduty list-findings --detector-id <detector-id>

Q3: "How do you ensure data is encrypted at rest and in transit?"​

Answer:

  • EFS encryption enabled with AWS managed keys
  • S3 bucket encryption enforced via Config rules
  • TLS 1.2+ enforced on ALB listeners
  • KMS keys for sensitive data

Evidence:

  • EFS encryption: encryption/efs-filesystems.json
  • ALB listeners: CloudFormation template AWS::ElasticLoadBalancingV2::Listener
  • Config rule: encrypted-volumes, s3-bucket-server-side-encryption-enabled

Demonstration:

# Verify EFS encryption
aws efs describe-file-systems --query 'FileSystems[].[FileSystemId,Encrypted]'

# Verify ALB uses HTTPS
aws elbv2 describe-listeners --query 'Listeners[?Protocol==`HTTPS`]'

Q4: "How do you handle compliance violations?"​

Answer:

  • AWS Config automatic remediation for common violations
  • SNS notifications for critical findings
  • Runbook for manual remediation
  • Quarterly compliance reviews

Evidence:

Demonstration:

# Show auto-remediation configuration
aws configservice describe-remediation-configurations \
--config-rule-names <rule-name>

Q5: "How do you ensure infrastructure changes are authorized and tracked?"​

Answer:

  • Infrastructure as Code (AWS CDK) with Git version control
  • CloudFormation change sets reviewed before deployment
  • CloudTrail logging all infrastructure changes
  • Required approvals for production changes (GitHub branch protection)

Evidence:

  • Git repository: Source code with commit history
  • CloudFormation events: stack-events.json
  • CloudTrail: API call logs for CloudFormation operations

Demonstration:

# Show recent infrastructure changes
git log --since="30 days ago" --oneline

# Show CloudFormation stack updates
aws cloudformation describe-stack-events --stack-name CloudForge-Prod \
--max-items 20

Framework-Specific Guidance​

SOC 2 Type II​

Observation Period: Commonly 6 to 12 months, agreed with the auditor

Key Focus Areas:

  • CC6: Logical and physical access controls
  • CC7: System operations (monitoring, backup, incident response)

Evidence Timeline:

  • Prepare 6+ months of CloudTrail logs
  • Config compliance history for audit period
  • GuardDuty findings and remediation

Script:

./scripts/generate-audit-evidence.sh \
--stack-name CloudForge-Prod-SOC2 \
--framework SOC2 \
--start-date $(date -d '6 months ago' +%Y-%m-%d) \
--end-date $(date +%Y-%m-%d)

CloudTrail lookup-events returns only the last 90 days; for longer periods, use the trail's S3 bucket or CloudTrail Lake.

HIPAA​

Audit Duration: Typically annual

Key Focus Areas:

  • §164.312(a): Access control
  • §164.312(b): Audit controls
  • §164.312(d): Authentication
  • §164.312(e): Transmission security

Evidence Timeline:

  • HIPAA requires retaining required documentation for 6 years; CloudForge's HIPAA lifecycle rules retain compliance logs for 6 years
  • Access logs for PHI/ePHI
  • Encryption validation

Additional Documentation:

  • Business Associate Agreement (BAA) with AWS
  • HIPAA risk assessment
  • Breach notification procedures

PCI-DSS​

Audit Duration: Annual

Key Focus Areas:

  • Req 1-2: Network security
  • Req 3-4: Data encryption
  • Req 7-8: Access control
  • Req 10: Logging and monitoring

Evidence Timeline:

  • 1 year of audit logs minimum
  • Quarterly network scans
  • Penetration testing reports

Additional Documentation:

  • Attestation of Compliance (AOC)
  • Self-Assessment Questionnaire (SAQ)
  • Network diagram

GDPR​

Audit Duration: Ongoing (data protection impact assessment)

Key Focus Areas:

  • Article 25: Data protection by design
  • Article 30: Records of processing
  • Article 32: Security of processing
  • Article 33: Breach notification

Evidence Timeline:

  • Data processing records
  • Data breach incident logs (if any)
  • DPO communications

Additional Documentation:

  • Data Processing Agreement (DPA)
  • Privacy policy
  • Data subject rights procedures

Post-Audit Actions​

1. Address Findings​

# Document audit findings
cat > audit-findings.md <<EOF
# Audit Findings - $(date +%Y)

## Finding 1: [Description]
- **Severity**: High/Medium/Low
- **Control**: [Control ID]
- **Remediation**: [Steps to fix]
- **Timeline**: [Completion date]
- **Status**: Open/In Progress/Closed

EOF

2. Update Documentation​

# Update compliance posture
vim docs/COMPLIANCE_POSTURE.md

# Update CHANGELOG with audit-related changes
vim CHANGELOG.md

3. Implement Corrective Actions​

# Example: Fix non-compliant resource
aws s3api put-bucket-versioning \
--bucket my-bucket \
--versioning-configuration Status=Enabled

# Verify remediation
aws configservice describe-compliance-by-config-rule \
--config-rule-names <rule-name>

4. Schedule Follow-Up​

# Create reminder for next audit
echo "Next audit: $(date -d '+1 year' +%Y-%m-%d)" >> audit-schedule.txt

Audit Checklist​

Pre-Audit​

  • Run compliance validation scripts
  • Generate evidence package
  • Review and remediate non-compliant resources
  • Prepare documentation package
  • Export CloudFormation templates
  • Create auditor read-only IAM user

During Audit​

  • Provide evidence package to auditors
  • Be available for questions
  • Demonstrate controls in real-time
  • Document all auditor requests
  • Track findings in real-time

Post-Audit​

  • Address all findings
  • Update documentation
  • Implement corrective actions
  • Schedule follow-up audit
  • Archive evidence package
  • Remove auditor access

Resources​