Remediation

The Fix Library: how every AWS finding gets fixed

The AWS scan runs 46 checks. For each one, this library says what is wrong, why it matters and how it gets fixed: 7 are applied automatically once a human has ticked and approved them, the rest are guided step by step. Every fix is verified by a rescan, so the fix itself becomes evidence.

Nothing is changed in your AWS account without a person approving it first. Automatic fixes run only through an opt-in fix role that cannot touch IAM and cannot delete anything. A fixed check is evidence for a requirement, not proof that the requirement is met. TrustProof prepares and organises your evidence. Your auditor tests it independently and forms their own opinion, and you remain responsible for your controls.

Tier 1: automatic, reversible, no downtime

TrustProof prepares the exact change for each resource. Your engineer ticks the resources, a second person approves with a fresh two-factor sign-in, TrustProof applies the change through an opt-in fix role and a rescan verifies it. Every change is reversible by hand and causes no downtime.

  • S3 public access

    Automatic after approval

    A bucket does not block public access (Block Public Access settings are off, or a policy or ACL makes it public).

    Public buckets are the most common cause of large data leaks. Block Public Access stops a policy or ACL mistake from exposing data.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of s3_public_access.
    Supports
    • SOC 2: CC6.1, CC6.7
    • HIPAA Security Rule: §164.312(a)(1)
    • ISO/IEC 27001:2022 Annex A: A.8.3
    • ISO/IEC 20000-1:2018: 8.7.3
    • NIST Cybersecurity Framework 2.0: PR.IR-01
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Open S3, the bucket, Permissions tab.
    2. Under Block public access (bucket settings), choose Edit, tick Block all public access, save and confirm.
    3. Review the bucket policy and ACL for public grants and remove them; for a genuinely public website, serve it through CloudFront with an origin access control instead.
    4. Turn on the account-level Block Public Access setting (S3, Block Public Access settings for this account).
    aws s3api put-public-access-block --bucket <bucket-name> --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
    aws s3control put-public-access-block --account-id <account-id> --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

    Rollback: Set the four Block Public Access flags back to their previous values (recorded in the fix history) with put-public-access-block.

  • S3 default encryption

    Automatic after approval

    A bucket has no default encryption setting, or one TrustProof does not recognise.

    Default encryption makes sure every new object is encrypted at rest without each uploader remembering to ask for it. Most frameworks expect it.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of s3_bucket_encryption.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(a)(2)(iv)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • ISO/IEC 20000-1:2018: 7.5
    • ISO/IEC 42001:2023: A.4.3
    • NIST Cybersecurity Framework 2.0: PR.DS-01
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Open S3, the bucket, Properties tab.
    2. Under Default encryption, choose Edit, pick SSE-S3 (or SSE-KMS with your key), save.
    3. Existing objects are not re-encrypted; use S3 Batch Operations (Copy) if they must be.
    aws s3api put-bucket-encryption --bucket <bucket-name> --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'

    Rollback: Default encryption is normally left on. If it must be removed: aws s3api delete-bucket-encryption --bucket <bucket-name>. Objects already written stay encrypted.

  • RDS public access

    Automatic after approval

    A database instance or cluster is set to Publicly accessible, giving it a public IP address.

    A public database is one weak password or one open security group away from the internet. Databases should be reachable only from inside your VPC or a VPN.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of rds_public_access.
    Supports
    • SOC 2: CC6.6
    • HIPAA Security Rule: §164.312(a)(1)
    • ISO/IEC 27001:2022 Annex A: A.8.20
    • NIST Cybersecurity Framework 2.0: PR.IR-01
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Confirm how the application connects (it must be inside the VPC, over VPN or a bastion, not from the internet).
    2. Open RDS, the database, Modify, Connectivity, Additional configuration, choose Not publicly accessible, continue and Apply immediately.
    3. Review the database security group so it only allows the application subnets or security group.
    aws rds modify-db-instance --db-instance-identifier <db-id> --no-publicly-accessible --apply-immediately

    Rollback: aws rds modify-db-instance --db-instance-identifier <db-id> --publicly-accessible --apply-immediately (the instance must be in public subnets).

  • CloudTrail logging

    Automatic after approval

    A CloudTrail trail exists but has stopped logging, so account activity is no longer being recorded.

    Without CloudTrail there is no record of who did what. Every framework expects an activity log, and incident response is impossible without one.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of cloudtrail_logging, cloudtrail_integrity.
    Supports
    • SOC 2: CC7.2
    • HIPAA Security Rule: §164.312(b)
    • ISO/IEC 27001:2022 Annex A: A.8.15
    • ISO/IEC 20000-1:2018: 8.2.6, 8.5.1
    • ISO/IEC 42001:2023: A.6.2.8
    • NIST Cybersecurity Framework 2.0: PR.PS-04, DE.CM-03
    • APRA CPS 234 Information Security: Para 23
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Open CloudTrail, Trails, the trail.
    2. Choose Start logging (top right). If logging keeps stopping, check the S3 bucket policy and KMS key the trail writes with.
    aws cloudtrail start-logging --name <trail-arn-or-name>
    aws cloudtrail get-trail-status --name <trail-arn-or-name>

    Rollback: Nothing to undo: turning a protection on is the intended state. If it must be turned off again, do it through your change process and TrustProof will report it as a finding.

  • IAM password policy

    Automatic after approval

    The account password policy allows passwords shorter than 14 characters or lets users reuse recent passwords.

    Short or reused passwords are easier to guess and are often already in breach lists. The policy applies to every IAM user with console access.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of password_policy.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(d)
    • ISO/IEC 27001:2022 Annex A: A.8.5
    • NIST Cybersecurity Framework 2.0: PR.AA-03
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open IAM, Account settings.
    2. Under Password policy, choose Edit and pick Custom.
    3. Set the minimum length to 14 or more, require upper and lower case, numbers and symbols, allow users to change their own password, and prevent reuse of the last 24 passwords.
    4. Save. Existing passwords are not reset; the rules apply at the next change.
    aws iam update-account-password-policy --minimum-password-length 14 --require-symbols --require-numbers --require-uppercase-characters --require-lowercase-characters --allow-users-to-change-password --password-reuse-prevention 24

    Rollback: Edit the password policy back in IAM Account settings. The previous values are recorded in the fix history.

  • SSH or RDP open to the internet

    Automatic after approval

    A security group lets anyone on the internet (0.0.0.0/0) reach SSH (22) or Remote Desktop (3389).

    Exposed admin ports are scanned and brute-forced within minutes of appearing. They are the most common way servers are taken over.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of security_group_ssh_rdp_exposure, security_group_unrestricted_ingress.
    Supports
    • SOC 2: CC6.6
    • HIPAA Security Rule: §164.312(a)(1)
    • ISO/IEC 27001:2022 Annex A: A.8.20
    • ISO/IEC 20000-1:2018: 8.7.3
    • NIST Cybersecurity Framework 2.0: PR.IR-01
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Set up AWS Systems Manager Session Manager (no inbound port needed) or note your office/VPN IP range.
    2. Open EC2, Security Groups, the group, Inbound rules, Edit inbound rules.
    3. Delete the rule for port 22 or 3389 with source 0.0.0.0/0 (and ::/0), or change its source to your office/VPN range.
    4. Save and test that administrators can still connect through the new path.
    aws ec2 revoke-security-group-ingress --group-id <sg-id> --protocol tcp --port 22 --cidr 0.0.0.0/0
    aws ec2 revoke-security-group-ingress --group-id <sg-id> --protocol tcp --port 3389 --cidr 0.0.0.0/0
    aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 22 --cidr <office-cidr>

    Rollback: Add the rule back with authorize-security-group-ingress, but limited to your office or VPN range rather than 0.0.0.0/0. The removed rules are listed in the fix history.

  • Security groups open to the internet

    Automatic after approval

    A security group allows inbound traffic from anywhere on the internet (0.0.0.0/0 or ::/0), on some or all ports.

    Every open port is attack surface. Databases, caches, admin consoles and internal APIs should never be reachable from the whole internet.

    How it is fixed
    TrustProof applies it after approval (reversible, no downtime). By hand: a few minutes.
    Verified by
    Rescan of security_group_unrestricted_ingress, security_group_ssh_rdp_exposure.
    Supports
    • SOC 2: CC6.6
    • HIPAA Security Rule: §164.312(a)(1)
    • ISO/IEC 27001:2022 Annex A: A.8.20
    • NIST Cybersecurity Framework 2.0: PR.IR-01
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open EC2, Security Groups, the group, Inbound rules, Edit inbound rules.
    2. For each rule with source 0.0.0.0/0 or ::/0: delete it, or change the source to the load balancer's security group, your office/VPN range or the specific client range.
    3. Keep 80/443 open only on groups attached to internet-facing load balancers or CloudFront origins; everything else should be reachable through them.
    aws ec2 describe-security-group-rules --filters Name=group-id,Values=<sg-id>
    aws ec2 revoke-security-group-ingress --group-id <sg-id> --ip-permissions 'IpProtocol=-1,IpRanges=[{CidrIp=0.0.0.0/0}]'
    aws ec2 revoke-security-group-ingress --group-id <sg-id> --ip-permissions 'IpProtocol=tcp,FromPort=<from>,ToPort=<to>,Ipv6Ranges=[{CidrIpv6=::/0}]'

    Rollback: Add rules back with authorize-security-group-ingress for the exact port, limited to the source that needs it. Every removed rule (protocol, ports, source) is listed in the fix history.

Tier 2: automatic in principle, service-affecting (not automated yet)

These changes are technically possible to automate but affect the service: an encrypted copy of a database or volume has to replace the original, which needs a maintenance window and an acknowledgement. The library describes the path; automating it is a separate decision.

  • EBS volume encryption

    Guided (automation planned)

    EBS volumes exist that are not encrypted.

    An unencrypted volume, or any snapshot made from it, can be attached or shared and read elsewhere. Encryption is transparent to the instance once set.

    How it is fixed
    Guided. By hand: half a day, needs a restart.
    Verified by
    Rescan of rds_ebs_encryption, snapshot_encryption.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(a)(2)(iv)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • NIST Cybersecurity Framework 2.0: PR.DS-01
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Turn on EBS encryption by default for the region first (EC2, Settings, EBS encryption, Manage) so new volumes are always encrypted.
    2. For each existing volume: create a snapshot, copy the snapshot with encryption on, create a new volume from the encrypted copy in the same Availability Zone.
    3. Stop the instance, detach the old volume (note its device name), attach the new volume on the same device name, start the instance and check it.
    4. Keep the old volume for your retention period, then delete it and the unencrypted snapshot.
    aws ec2 enable-ebs-encryption-by-default --region <region>
    aws ec2 create-snapshot --volume-id <volume-id> --description "pre-encryption copy"
    aws ec2 copy-snapshot --source-region <region> --source-snapshot-id <snapshot-id> --encrypted --kms-key-id <kms-key-id>
    aws ec2 create-volume --availability-zone <az> --snapshot-id <encrypted-snapshot-id> --volume-type gp3

    Rollback: Stop the instance, swap the original (unencrypted) volume back onto the same device name and start it. Keep the original until the new volume has run cleanly.

  • RDS encryption at rest

    Guided (automation planned)

    An RDS database or Aurora cluster was created without storage encryption.

    Unencrypted storage, snapshots and backups can be read if the underlying media or a snapshot copy is exposed. Encryption at rest is expected by every framework TrustProof maps.

    How it is fixed
    Guided. By hand: half a day, needs a cutover (maintenance window).
    Verified by
    Rescan of rds_encryption_at_rest.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(a)(2)(iv)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • ISO/IEC 20000-1:2018: 8.7.3
    • NIST Cybersecurity Framework 2.0: PR.DS-01
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. AWS cannot turn encryption on for an existing database. Plan a maintenance window and tell dependent teams.
    2. Open RDS, the database, Actions, Take snapshot.
    3. Select the snapshot, Actions, Copy snapshot, tick Enable encryption and choose the KMS key.
    4. Restore the encrypted copy as a new instance (or cluster) with the same parameter and option groups, subnet group and security groups.
    5. Stop writes, catch up any changes (or use DMS for near-zero downtime), then repoint the application to the new endpoint (or rename the instances so the endpoint stays the same).
    6. Keep the old, unencrypted instance stopped for your retention period, then delete it and its unencrypted snapshots.
    aws rds create-db-snapshot --db-instance-identifier <db-id> --db-snapshot-identifier <snapshot-id>
    aws rds copy-db-snapshot --source-db-snapshot-identifier <snapshot-id> --target-db-snapshot-identifier <snapshot-id>-encrypted --kms-key-id <kms-key-id>
    aws rds restore-db-instance-from-db-snapshot --db-instance-identifier <db-id>-encrypted --db-snapshot-identifier <snapshot-id>-encrypted

    Rollback: Repoint the application back to the old, still-stopped unencrypted instance within your retention period. Data written to the new instance in the meantime must be reconciled.

Tier 3: guided, verified by rescan

TrustProof shows the exact console and CLI steps and verifies the change on the next scan. Several of these are IAM changes the fix role refuses by design (it has no IAM write permission); the rest are services TrustProof reads but does not configure.

  • IAM users without MFA

    Guided fix

    One or more IAM users can sign in to the AWS console with a password alone; no second factor is set up.

    A phished or reused password is enough to take over the account. MFA is the single most effective control against that.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of iam_mfa.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(d)
    • ISO/IEC 27001:2022 Annex A: A.8.5
    • ISO/IEC 20000-1:2018: 8.7.3
    • NIST Cybersecurity Framework 2.0: PR.AA-03
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Open IAM, choose Users, then the affected user.
    2. On the Security credentials tab, under Multi-factor authentication (MFA), choose Assign MFA device.
    3. Pick an authenticator app, passkey or hardware key and follow the prompts; the user can do this themselves from their own security credentials page.
    4. Repeat for every listed user. For people who no longer need console access, remove their console password instead.
    aws iam enable-mfa-device --user-name <user-name> --serial-number <mfa-device-arn> --authentication-code1 <code1> --authentication-code2 <code2>
    # only after the user is confirmed not to need console access: aws iam delete-login-profile --user-name <user-name>

    Rollback: Removing an MFA device weakens access control. If a device is lost, an administrator can deactivate it in IAM and the user enrols a new one.

  • IAM access key rotation

    Guided fix

    Active IAM user access keys are older than 90 days.

    The longer a key lives, the more places it is copied to and the longer a leaked key stays useful. Regular rotation limits the damage window.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of iam_access_key_rotation.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.308(a)(3), §164.312(a)(1)
    • ISO/IEC 27001:2022 Annex A: A.8.2
    • NIST Cybersecurity Framework 2.0: PR.AA-01
    • APRA CPS 234 Information Security: supporting context for Para 21
    Manual steps and rollback
    1. Open IAM, Users, the affected user, Security credentials.
    2. Create a second access key and update every system that uses the old one.
    3. Set the old key to Inactive. Watch for failures for a day or two.
    4. Delete the inactive key. Longer term, replace user keys with IAM roles (instance profiles, IRSA, GitHub OIDC) so there is nothing to rotate.
    aws iam create-access-key --user-name <user-name>
    aws iam update-access-key --user-name <user-name> --access-key-id <old-key-id> --status Inactive
    # only after the new key is verified in every system: aws iam delete-access-key --user-name <user-name> --access-key-id <old-key-id>

    Rollback: Set the old key back to Active (if it has not been deleted) while you finish moving the dependent system.

  • CloudTrail coverage and log integrity

    Guided fix

    No trail covers all regions with log file validation on, so activity in some regions is missed or log tampering cannot be detected.

    Attackers often work in regions you do not use. Log file validation produces digests that prove the logs have not been changed, which auditors ask for.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of cloudtrail_integrity, cloudtrail_logging.
    Supports
    • SOC 2: CC7.2
    • HIPAA Security Rule: §164.308(a)(1)(ii)(D), §164.312(b)
    • ISO/IEC 27001:2022 Annex A: A.8.15
    • ISO/IEC 42001:2023: A.6.2.8
    • NIST Cybersecurity Framework 2.0: PR.PS-04, RS.AN-07
    • APRA CPS 234 Information Security: Para 23
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open CloudTrail, Trails, the trail, Edit.
    2. Tick Enable for all accounts in my organization if applicable, set Multi-region trail to Yes, and under Additional settings turn on Log file validation.
    3. Confirm the destination bucket blocks public access and has a lifecycle rule for retention.
    aws cloudtrail update-trail --name <trail-name> --is-multi-region-trail --enable-log-file-validation
    aws cloudtrail start-logging --name <trail-name>

    Rollback: aws cloudtrail update-trail --name <trail-name> --no-is-multi-region-trail --no-enable-log-file-validation (not recommended).

  • KMS key rotation

    Guided fix

    Customer-managed KMS keys do not have automatic annual rotation turned on.

    Rotation limits how much data is protected by one key version. It is transparent: old versions stay available to decrypt existing data.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of kms_key_rotation.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(a)(2)(iv)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • NIST Cybersecurity Framework 2.0: PR.DS-01
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open KMS, Customer managed keys, the key, Key rotation tab.
    2. Tick Automatically rotate this KMS key every year (or a period of 90 to 2560 days) and save.
    aws kms enable-key-rotation --key-id <key-id>

    Rollback: aws kms disable-key-rotation --key-id <key-id>. Existing key versions remain usable.

  • GuardDuty threat detection

    Guided fix

    Amazon GuardDuty is not turned on in one or more regions your account uses.

    GuardDuty watches CloudTrail, DNS and VPC flow data for credential theft, crypto-mining and other attacks with nothing to install.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of guardduty_enabled.
    Supports
    • SOC 2: CC7.2
    • HIPAA Security Rule: §164.308(a)(1)(ii)(D), §164.312(b)
    • ISO/IEC 27001:2022 Annex A: A.8.16
    • ISO/IEC 20000-1:2018: supporting context for 8.6.1, 8.7.3
    • NIST Cybersecurity Framework 2.0: DE.CM-01, DE.CM-09, DE.AE-02
    • APRA CPS 234 Information Security: Para 23
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Open GuardDuty in each region you use and choose Get started, then Enable GuardDuty.
    2. From an organisation management account, delegate an administrator and turn on auto-enable for all member accounts.
    3. Route findings to the Security Hub or an SNS topic so someone is told.
    aws guardduty create-detector --enable --region <region>

    Rollback: aws guardduty update-detector --detector-id <detector-id> --no-enable (suspends; findings are kept).

  • AWS Config recording

    Guided fix

    AWS Config is not recording resource changes in one or more regions your account uses.

    Config keeps a history of how each resource was set up and when it changed, which is what an auditor asks for when they want to see a control over time.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of aws_config_enabled, config_conformance_packs.
    Supports
    • SOC 2: CC7.2
    • HIPAA Security Rule: §164.312(b)
    • ISO/IEC 27001:2022 Annex A: A.8.9; supporting context for A.5.9
    • ISO/IEC 20000-1:2018: supporting context for 8.2.5, 8.2.6, 8.5.1
    • ISO/IEC 42001:2023: supporting context for A.4.5
    • NIST Cybersecurity Framework 2.0: ID.AM-02, PR.PS-01, PR.PS-04, DE.CM-09
    • APRA CPS 234 Information Security: Para 20
    Manual steps and rollback
    1. Open AWS Config in each region, Settings (or Get started), create a recorder for all resource types including global resources in one region, with a delivery bucket.
    2. Start the recorder.
    aws configservice put-configuration-recorder --configuration-recorder name=default,roleARN=<config-role-arn> --recording-group allSupported=true,includeGlobalResourceTypes=true
    aws configservice put-delivery-channel --delivery-channel name=default,s3BucketName=<config-bucket>
    aws configservice start-configuration-recorder --configuration-recorder-name default

    Rollback: aws configservice stop-configuration-recorder --configuration-recorder-name default.

  • VPC flow logs

    Guided fix

    A VPC has no flow logs, so network connections in and out of it are not recorded.

    Flow logs show which addresses talked to which, which is how you find data exfiltration, lateral movement or a misbehaving service after the fact.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of vpc_flow_logs.
    Supports
    • SOC 2: CC7.2
    • HIPAA Security Rule: §164.312(b)
    • ISO/IEC 27001:2022 Annex A: A.8.15
    • NIST Cybersecurity Framework 2.0: PR.PS-04, DE.CM-01
    • APRA CPS 234 Information Security: Para 23
    Manual steps and rollback
    1. Open VPC, Your VPCs, the VPC, Flow logs tab, Create flow log.
    2. Filter All, destination CloudWatch Logs (with an IAM role) or an S3 bucket, and create it.
    3. Set a retention period on the log group or bucket.
    aws ec2 create-flow-logs --resource-type VPC --resource-ids <vpc-id> --traffic-type ALL --log-destination-type s3 --log-destination arn:aws:s3:::<flow-logs-bucket>

    Rollback: aws ec2 delete-flow-logs --flow-log-ids <flow-log-id>.

  • S3 HTTPS-only access

    Guided fix

    A bucket policy does not refuse requests made over plain HTTP.

    Without the deny, a misconfigured client can send and receive objects unencrypted in transit, which most frameworks treat as a gap.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of s3_secure_transport.
    Supports
    • SOC 2: CC6.7
    • HIPAA Security Rule: §164.312(e)(1), §164.312(e)(2)(ii)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • NIST Cybersecurity Framework 2.0: PR.DS-02
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Open S3, the bucket, Permissions, Bucket policy, Edit.
    2. Add a statement: Effect Deny, Principal *, Action s3:*, Resource the bucket and bucket/*, Condition Bool aws:SecureTransport = false.
    3. Save and test that your clients still work (SDKs use HTTPS by default).
    aws s3api put-bucket-policy --bucket <bucket-name> --policy '{"Version":"2012-10-17","Statement":[{"Sid":"DenyInsecureTransport","Effect":"Deny","Principal":"*","Action":"s3:*","Resource":["arn:aws:s3:::<bucket-name>","arn:aws:s3:::<bucket-name>/*"],"Condition":{"Bool":{"aws:SecureTransport":"false"}}}]}'

    Rollback: Remove the Deny statement from the bucket policy.

  • Load balancer HTTPS

    Guided fix

    An internet-facing load balancer serves plain HTTP without redirecting to HTTPS, or has no HTTPS listener.

    Traffic over HTTP can be read or altered on the way. Every public application should serve HTTPS and send HTTP visitors to it.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of load_balancer_tls, tls_policy_strength.
    Supports
    • SOC 2: CC6.7
    • HIPAA Security Rule: §164.312(e)(1), §164.312(e)(2)(ii)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • NIST Cybersecurity Framework 2.0: PR.DS-02
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Request or import a certificate in ACM for the hostname.
    2. Open EC2, Load Balancers, the balancer, Listeners, Add listener: HTTPS 443 with the certificate, forwarding to the target group.
    3. Edit the HTTP 80 listener so its default action is Redirect to HTTPS 443 (301).
    aws elbv2 create-listener --load-balancer-arn <alb-arn> --protocol HTTPS --port 443 --certificates CertificateArn=<certificate-arn> --ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 --default-actions Type=forward,TargetGroupArn=<target-group-arn>
    aws elbv2 modify-listener --listener-arn <http-listener-arn> --default-actions '[{"Type":"redirect","RedirectConfig":{"Protocol":"HTTPS","Port":"443","StatusCode":"HTTP_301"}}]'

    Rollback: Change the port-80 listener's default action back to forward.

  • Snapshot encryption

    Guided fix

    EBS or RDS snapshots you own are unencrypted.

    Snapshots are easy to copy or share by mistake, and an unencrypted snapshot is a complete readable copy of the disk or database.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of snapshot_encryption.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(a)(2)(iv)
    • ISO/IEC 27001:2022 Annex A: A.8.24
    • NIST Cybersecurity Framework 2.0: PR.DS-11; supporting context for PR.DS-01
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Fix the source first (EBS encryption by default, encrypted volumes and databases) so new snapshots are encrypted.
    2. For snapshots you must keep: copy each one with encryption on, then delete the unencrypted original once the copy is complete.
    3. Delete unencrypted snapshots you no longer need (check they are not referenced by an AMI or a backup plan first).
    aws ec2 copy-snapshot --source-region <region> --source-snapshot-id <snapshot-id> --encrypted --kms-key-id <kms-key-id>
    aws rds copy-db-snapshot --source-db-snapshot-identifier <snapshot-id> --target-db-snapshot-identifier <snapshot-id>-encrypted --kms-key-id <kms-key-id>
    # only after the encrypted copy is verified and no AMI or backup plan references it: aws ec2 delete-snapshot --snapshot-id <snapshot-id>

    Rollback: A deleted snapshot cannot be recovered. Keep the unencrypted original until the encrypted copy is verified.

  • Bedrock model invocation logging

    Guided fix

    Amazon Bedrock is used but model invocation logging is off.

    Invocation logs are the record of what your AI systems were asked and answered, which ISO/IEC 42001 and your own incident reviews depend on.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of bedrock_invocation_logging.
    Supports
    • ISO/IEC 42001:2023: A.6.2.6, A.6.2.8
    Manual steps and rollback
    1. Open Bedrock, Settings, Model invocation logging, Edit.
    2. Turn it on, choose which data to log (text, image, embeddings) and a destination (CloudWatch Logs and/or an S3 bucket with a role), save.
    aws bedrock put-model-invocation-logging-configuration --logging-config '{"cloudWatchConfig":{"logGroupName":"<log-group>","roleArn":"<role-arn>"},"textDataDeliveryEnabled":true}'

    Rollback: aws bedrock delete-model-invocation-logging-configuration.

  • Bedrock guardrails

    Guided fix

    Amazon Bedrock is used but no guardrail exists.

    Guardrails filter harmful content, denied topics and sensitive information in prompts and responses, which is how you show an AI system is controlled.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of bedrock_guardrails.
    Supports
    • ISO/IEC 42001:2023: A.9.2
    Manual steps and rollback
    1. Open Bedrock, Guardrails, Create guardrail: set content filters, denied topics and sensitive-information (PII) handling.
    2. Create a version and reference the guardrail ID and version in every InvokeModel / Converse call or agent.
    aws bedrock create-guardrail --name <name> --blocked-input-messaging "<message>" --blocked-outputs-messaging "<message>" --content-policy-config file://content.json

    Rollback: aws bedrock delete-guardrail --guardrail-identifier <guardrail-id>.

  • AI resource inventory (for information)

    Guided fix

    Nothing is wrong by itself: this lists Bedrock and SageMaker resources (agents, knowledge bases, models, endpoints) so you can compare them with your AI system inventory.

    ISO/IEC 42001 expects you to know every AI system you run. An agent or endpoint nobody documented is a governance gap.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of ai_resource_inventory.
    Supports
    • ISO/IEC 42001:2023: A.4.2
    Manual steps and rollback
    1. Compare the listed resources with your AI system inventory (the AI Compliance module or your register).
    2. Add any missing system to the inventory with its owner and purpose, or remove the AWS resource if it is no longer needed.
    aws bedrock list-agents
    aws bedrock list-knowledge-bases
    aws sagemaker list-endpoints

    Rollback: Not applicable: nothing is changed in AWS.

  • AWS Backup plans and recent backups

    Guided fix

    AWS Backup has no plan, or protected resources have no recovery point from the last 7 days.

    A tested, recent backup is the difference between an outage and a data loss. Frameworks expect scheduled backups with a defined retention.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of aws_backup_coverage.
    Supports
    • SOC 2: supporting context for A1.2
    • HIPAA Security Rule: §164.308(a)(7)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.13
    • ISO/IEC 20000-1:2018: supporting context for 8.7.2
    • NIST Cybersecurity Framework 2.0: supporting context for PR.DS-11
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open AWS Backup, Backup plans, Create backup plan (start from the Daily-35day-Retention template).
    2. Assign resources by tag (for example backup=true) or by type, with an IAM role for AWS Backup.
    3. Tag the databases, volumes and file systems that matter. Check the Jobs page after the first run.
    aws backup create-backup-plan --backup-plan file://plan.json
    aws backup create-backup-selection --backup-plan-id <plan-id> --backup-selection file://selection.json

    Rollback: aws backup delete-backup-plan --backup-plan-id <plan-id>; existing recovery points stay in the vault.

  • RDS backups, deletion protection and Multi-AZ

    Guided fix

    A database keeps automated backups for less than 7 days, has deletion protection off, or runs in a single Availability Zone.

    Short retention limits point-in-time recovery, deletion protection stops an accidental delete, and Multi-AZ keeps the database up through an AZ failure.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of rds_backup_resilience.
    Supports
    • SOC 2: supporting context for A1.2
    • HIPAA Security Rule: §164.308(a)(7), §164.312(c)(1)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.13, A.8.14
    • ISO/IEC 20000-1:2018: supporting context for 8.7.1, 8.7.2
    • NIST Cybersecurity Framework 2.0: supporting context for PR.DS-11, PR.IR-03
    Manual steps and rollback
    1. Open RDS, the database, Modify.
    2. Set Backup retention period to 7 days or more, tick Enable deletion protection, and under Availability choose Multi-AZ (this causes a brief failover when applied).
    3. Apply during the next maintenance window unless you can take the failover now.
    aws rds modify-db-instance --db-instance-identifier <db-id> --backup-retention-period 7 --deletion-protection --multi-az --apply-immediately

    Rollback: Modify the instance back (--no-deletion-protection, --no-multi-az, shorter retention). Reducing retention deletes older automated backups.

  • DynamoDB point-in-time recovery

    Guided fix

    DynamoDB tables do not have point-in-time recovery turned on.

    PITR lets you restore a table to any second in the last 35 days after a bad deploy or accidental delete, with no backup job to schedule.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of dynamodb_pitr.
    Supports
    • SOC 2: supporting context for A1.2
    • HIPAA Security Rule: §164.308(a)(7), §164.312(c)(1)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.13
    • ISO/IEC 20000-1:2018: supporting context for 8.7.2
    • NIST Cybersecurity Framework 2.0: supporting context for PR.DS-11
    Manual steps and rollback
    1. Open DynamoDB, Tables, the table, Backups tab.
    2. Under Point-in-time recovery, choose Edit, turn it on, save.
    aws dynamodb update-continuous-backups --table-name <table-name> --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true

    Rollback: Run the same command with PointInTimeRecoveryEnabled=false.

  • S3 bucket versioning

    Guided fix

    Buckets do not have versioning turned on.

    Versioning keeps every overwritten or deleted object, so a mistake or ransomware-style deletion can be undone. It is also the basis for Object Lock and replication.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of s3_versioning.
    Supports
    • SOC 2: supporting context for A1.2
    • HIPAA Security Rule: §164.308(a)(7), §164.312(c)(1)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.13
    • ISO/IEC 20000-1:2018: supporting context for 7.5, 8.7.2
    • NIST Cybersecurity Framework 2.0: supporting context for PR.DS-11
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open S3, the bucket, Properties, Bucket Versioning, Edit, Enable, save.
    2. Add a lifecycle rule to expire noncurrent versions after a set period so storage does not grow forever.
    aws s3api put-bucket-versioning --bucket <bucket-name> --versioning-configuration Status=Enabled

    Rollback: aws s3api put-bucket-versioning --bucket <bucket-name> --versioning-configuration Status=Suspended (existing versions are kept).

  • Certificate expiry

    Guided fix

    An in-use ACM certificate has expired or expires within 30 days.

    An expired certificate takes the application offline for every browser and client. Imported certificates do not renew themselves.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of acm_certificate_expiry.
    Supports
    • SOC 2: supporting context for CC6.7
    • HIPAA Security Rule: §164.312(e)(1)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.24
    • NIST Cybersecurity Framework 2.0: supporting context for PR.DS-02
    Manual steps and rollback
    1. Open Certificate Manager, the certificate. If it is ACM-issued, check why renewal failed: usually a missing DNS validation record or the domain no longer pointing at AWS. Fix the record and ACM renews it.
    2. If it was imported, obtain a renewed certificate from your CA and use Reimport certificate (same ARN, so listeners keep working).
    aws acm describe-certificate --certificate-arn <certificate-arn>
    aws acm import-certificate --certificate-arn <certificate-arn> --certificate fileb://cert.pem --private-key fileb://key.pem --certificate-chain fileb://chain.pem

    Rollback: Not applicable: a renewed certificate replaces an expiring one. Keep the old files until the new one is confirmed in use.

  • TLS version on CloudFront and load balancers

    Guided fix

    A CloudFront distribution or HTTPS listener still accepts TLS 1.0 or 1.1.

    Old TLS versions have known weaknesses and are refused by PCI DSS and most security baselines. Modern browsers all support TLS 1.2 and 1.3.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of tls_policy_strength.
    Supports
    • SOC 2: supporting context for CC6.7
    • HIPAA Security Rule: §164.312(e)(1), §164.312(e)(2)(ii)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.24
    • NIST Cybersecurity Framework 2.0: supporting context for PR.DS-02
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Load balancers: EC2, Load Balancers, the balancer, Listeners, the HTTPS listener, Edit, Security policy ELBSecurityPolicy-TLS13-1-2-2021-06 (or newer).
    2. CloudFront: the distribution, General, Edit, Security policy TLSv1.2_2021. This needs a custom certificate (not the default *.cloudfront.net one).
    aws elbv2 modify-listener --listener-arn <listener-arn> --ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06
    aws cloudfront update-distribution --id <distribution-id> --distribution-config file://config.json   # ViewerCertificate.MinimumProtocolVersion = TLSv1.2_2021

    Rollback: Set the previous security policy back with the same command.

  • CloudWatch Logs retention

    Guided fix

    CloudWatch Logs log groups have no retention period (they keep logs forever) and may not use a customer-managed key.

    A retention policy is what your data-retention commitments rest on, and it keeps storage cost under control. A customer-managed key is expected where logs hold sensitive data.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of log_group_retention_encryption.
    Supports
    • SOC 2: supporting context for CC7.2
    • HIPAA Security Rule: §164.312(b)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.15
    • ISO/IEC 42001:2023: supporting context for A.6.2.8
    • NIST Cybersecurity Framework 2.0: supporting context for PR.PS-04
    Manual steps and rollback
    1. Open CloudWatch, Log groups, select the group, Actions, Edit retention setting, pick a period (for example 1 year) and save.
    2. Optionally Actions, Edit encryption, and choose a KMS key whose policy allows the logs service principal.
    aws logs put-retention-policy --log-group-name <log-group-name> --retention-in-days 365
    aws logs associate-kms-key --log-group-name <log-group-name> --kms-key-id <kms-key-arn>

    Rollback: aws logs delete-retention-policy --log-group-name <log-group-name> (already-expired events are gone).

  • Security Hub standards

    Guided fix

    AWS Security Hub is off, or has no security standard enabled, in one or more regions you use.

    Security Hub runs hundreds of checks (AWS Foundational Security Best Practices, CIS) continuously and gives one place to see findings from GuardDuty, Inspector and Macie.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of security_hub_standards.
    Supports
    • SOC 2: supporting context for CC7.1
    • HIPAA Security Rule: §164.308(a)(8)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.8, A.8.9, A.8.16
    • ISO/IEC 20000-1:2018: supporting context for 8.7.3
    • NIST Cybersecurity Framework 2.0: supporting context for ID.RA-01, PR.PS-01, DE.CM-09, DE.AE-03
    • APRA CPS 234 Information Security: supporting context for Para 23, Para 27
    Manual steps and rollback
    1. Open Security Hub in each region, Go to Security Hub, tick AWS Foundational Security Best Practices (and CIS if you want), Enable Security Hub.
    2. From an organisation management account, delegate an administrator and auto-enable new accounts.
    aws securityhub enable-security-hub --enable-default-standards --region <region>

    Rollback: aws securityhub disable-security-hub --region <region>.

  • AWS Config conformance packs

    Guided fix

    AWS Config has no conformance pack deployed.

    A conformance pack is a ready-made set of Config rules (for example Operational Best Practices for CIS or PCI) that continuously evaluates your resources and gives you an evidence trail.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of config_conformance_packs.
    Supports
    • SOC 2: supporting context for CC7.1
    • HIPAA Security Rule: §164.308(a)(8)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.9
    • NIST Cybersecurity Framework 2.0: supporting context for PR.PS-01
    • APRA CPS 234 Information Security: supporting context for Para 27
    Manual steps and rollback
    1. Open AWS Config, Conformance packs, Deploy conformance pack.
    2. Choose a sample template (for example Operational Best Practices for CIS AWS Foundations Benchmark) and deploy it.
    3. Review the resources the rules flag, fix them or document exceptions.
    aws configservice put-conformance-pack --conformance-pack-name <name> --template-s3-uri s3://<bucket>/<template>.yaml

    Rollback: aws configservice delete-conformance-pack --conformance-pack-name <name>.

  • IAM Access Analyzer

    Guided fix

    No IAM Access Analyzer for external access exists in one or more regions your account uses.

    Access Analyzer finds resources (buckets, roles, keys, queues) that outside accounts or the public can reach, continuously and for free.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of access_analyzer_enabled.
    Supports
    • SOC 2: supporting context for CC6.3
    • HIPAA Security Rule: §164.308(a)(4), §164.312(a)(1)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.3
    • NIST Cybersecurity Framework 2.0: supporting context for PR.AA-05
    • APRA CPS 234 Information Security: supporting context for Para 21
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open IAM, Access Analyzer, Analyzers, Create analyzer.
    2. Choose External access, zone of trust = this account (or the organisation from the management account), and create it in each region you use.
    3. Review and archive or fix the findings it produces.
    aws accessanalyzer create-analyzer --analyzer-name <name> --type ACCOUNT --region <region>

    Rollback: Delete the analyzer (aws accessanalyzer delete-analyzer). Its findings are lost.

  • Amazon Inspector coverage

    Guided fix

    Amazon Inspector vulnerability scanning is off or does not cover your EC2 instances.

    Inspector finds unpatched software and risky network reachability on your instances, containers and Lambda functions automatically.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of inspector_coverage, ssm_managed_instances.
    Supports
    • SOC 2: supporting context for CC7.1
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.8
    • NIST Cybersecurity Framework 2.0: supporting context for ID.RA-01, PR.PS-02, DE.CM-09
    • APRA CPS 234 Information Security: supporting context for Para 27
    Manual steps and rollback
    1. Open Inspector, Get started, Activate Inspector (EC2, ECR and Lambda scanning).
    2. Make sure instances are managed by Systems Manager (the SSM agent is how Inspector scans EC2), or turn on agentless scanning.
    aws inspector2 enable --resource-types EC2 ECR LAMBDA --region <region>

    Rollback: aws inspector2 disable --resource-types EC2 ECR LAMBDA.

  • Systems Manager managed instances

    Guided fix

    EC2 instances are not registered and online with AWS Systems Manager.

    Managed instances can be patched, inventoried and reached (Session Manager) without open ports or SSH keys. Unmanaged ones are invisible to patch reporting.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of ssm_managed_instances.
    Supports
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.8, A.8.18
    • NIST Cybersecurity Framework 2.0: supporting context for PR.PS-02
    Manual steps and rollback
    1. Attach an instance profile with the AmazonSSMManagedInstanceCore policy to each instance (or use Default Host Management Configuration in Systems Manager, Fleet Manager settings).
    2. Make sure the instance can reach the SSM endpoints (internet, NAT or ssm/ssmmessages/ec2messages VPC endpoints) and the SSM agent is installed (it is on Amazon Linux, Ubuntu and Windows AMIs).
    3. Check Fleet Manager shows the instance Online, then set up Patch Manager.
    aws ec2 associate-iam-instance-profile --instance-id <instance-id> --iam-instance-profile Name=<profile-name>
    aws ssm describe-instance-information

    Rollback: Detach the instance profile; the instance drops out of Systems Manager.

  • CloudWatch alarms with notifications

    Guided fix

    There are no CloudWatch alarms whose actions notify a person (for example through an SNS topic).

    Monitoring that tells nobody is not monitoring. Frameworks expect alerts for security events (root sign-in, policy changes) and for availability.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of cloudwatch_alarms.
    Supports
    • SOC 2: supporting context for CC7.2, A1.1
    • HIPAA Security Rule: §164.308(a)(1)(ii)(D)
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.6, A.8.16
    • ISO/IEC 20000-1:2018: supporting context for 8.4.3, 8.6.1, 8.7.1
    • ISO/IEC 42001:2023: supporting context for A.6.2.6
    • NIST Cybersecurity Framework 2.0: supporting context for PR.IR-04, DE.AE-06
    • APRA CPS 234 Information Security: supporting context for Para 23
    Manual steps and rollback
    1. Create an SNS topic with an email (or chat) subscription and confirm it.
    2. Open CloudWatch, Alarms, Create alarm, for example on a CloudTrail metric filter for root sign-in or unauthorised API calls, and set the alarm action to the topic.
    3. Add availability alarms (5xx rate, unhealthy hosts, CPU) for your main services.
    aws sns create-topic --name <topic-name>
    aws cloudwatch put-metric-alarm --alarm-name <alarm-name> --metric-name <metric> --namespace <namespace> --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --alarm-actions <topic-arn>

    Rollback: aws cloudwatch delete-alarms --alarm-names <alarm-name>.

  • Secrets Manager rotation

    Guided fix

    Secrets in Secrets Manager have no rotation configured.

    Database passwords and API keys that never change stay valid forever once copied. Rotation turns a leak into a time-limited problem.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of secrets_rotation.
    Supports
    • SOC 2: supporting context for CC6.1
    • ISO/IEC 27001:2022 Annex A: supporting context for A.5.17
    • NIST Cybersecurity Framework 2.0: supporting context for PR.AA-01
    Manual steps and rollback
    1. Open Secrets Manager, the secret, Rotation configuration, Edit rotation.
    2. Turn on automatic rotation, choose a schedule (for example every 30 days) and a rotation function (AWS provides templates for RDS, Redshift and DocumentDB).
    3. Test rotation once by hand and confirm the application picks up the new value.
    aws secretsmanager rotate-secret --secret-id <secret-name> --rotation-lambda-arn <rotation-function-arn> --rotation-rules AutomaticallyAfterDays=30

    Rollback: aws secretsmanager cancel-rotate-secret --secret-id <secret-name>; the current value stays valid.

  • AWS WAF on public applications

    Guided fix

    An internet-facing CloudFront distribution or Application Load Balancer has no AWS WAF web ACL attached.

    A web ACL with the AWS managed rule groups blocks common injection, bot and known-bad-input attacks before they reach your application.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of waf_shield_protection.
    Supports
    • SOC 2: supporting context for CC6.6
    • ISO/IEC 27001:2022 Annex A: supporting context for A.8.20
    • NIST Cybersecurity Framework 2.0: supporting context for PR.IR-01
    • APRA CPS 234 Information Security: supporting context for Para 21
    Manual steps and rollback
    1. Open WAF & Shield, Web ACLs, Create web ACL (scope CloudFront for distributions, Regional for ALBs).
    2. Add the AWS managed rule groups Core rule set and Known bad inputs (and Amazon IP reputation list), in Count mode first if you are unsure.
    3. Associate the web ACL with the distribution or load balancer; watch the sampled requests, then switch rules to Block.
    aws wafv2 create-web-acl --name <name> --scope REGIONAL --default-action Allow={} --rules file://rules.json --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=<name>
    aws wafv2 associate-web-acl --web-acl-arn <web-acl-arn> --resource-arn <load-balancer-arn>

    Rollback: aws wafv2 disassociate-web-acl --resource-arn <resource-arn> (or clear web_acl_id on the distribution).

  • Amazon Macie

    Guided fix

    Amazon Macie is off in regions where you keep S3 buckets.

    Macie finds personal and sensitive data in S3 and flags buckets that are public, unencrypted or shared, which supports privacy and data-classification requirements.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of macie_enabled.
    Supports
    • SOC 2: supporting context for C1.1
    • ISO/IEC 27001:2022 Annex A: supporting context for A.5.12
    • NIST Cybersecurity Framework 2.0: supporting context for ID.AM-07
    • APRA CPS 234 Information Security: supporting context for Para 20
    • Australian Privacy Principles: supporting context for APP 11.1
    Manual steps and rollback
    1. Open Macie in each region with buckets, Get started, Enable Macie.
    2. Create a sensitive data discovery job for the buckets that may hold personal data (automated discovery is on by default).
    aws macie2 enable-macie --region <region>

    Rollback: aws macie2 disable-macie --region <region>.

  • VPC endpoints

    Guided fix

    VPCs that call AWS services have no VPC endpoints, so that traffic leaves through the internet gateway or NAT.

    Endpoints keep traffic to S3, DynamoDB, Secrets Manager and other services on the AWS network, let you restrict which buckets and tables can be reached, and often cut NAT costs.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of vpc_endpoints.
    Supports
    • SOC 2: supporting context for CC6.6
    • NIST Cybersecurity Framework 2.0: supporting context for PR.IR-01
    Manual steps and rollback
    1. Open VPC, Endpoints, Create endpoint.
    2. Add gateway endpoints for S3 and DynamoDB (free) to the route tables of your private subnets.
    3. Add interface endpoints for the services your workloads use (for example Secrets Manager, SSM, ECR, CloudWatch Logs) in each private subnet, with private DNS on.
    aws ec2 create-vpc-endpoint --vpc-id <vpc-id> --service-name com.amazonaws.<region>.s3 --route-table-ids <rtb-id>
    aws ec2 create-vpc-endpoint --vpc-id <vpc-id> --vpc-endpoint-type Interface --service-name com.amazonaws.<region>.secretsmanager --subnet-ids <subnet-id> --security-group-ids <sg-id>

    Rollback: aws ec2 delete-vpc-endpoints --vpc-endpoint-ids <endpoint-id>; traffic returns to the NAT or internet route.

  • AWS regions in use (for information)

    Guided fix

    Nothing is wrong by itself: this lists the regions where you have buckets, databases, volumes, tables or non-default VPCs so you can compare them with your data residency commitments.

    Privacy law and customer contracts often say where data may be stored. A forgotten bucket in another region is a breach of that promise.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of data_residency_regions.
    Supports
    Not yet mapped to a framework requirement. Shown as supporting information only.
    Manual steps and rollback
    1. Compare the listed regions with your documented data residency commitments.
    2. Move or delete resources in regions you did not intend to use, then disable unused regions (Account, AWS Regions) or restrict them with an SCP.
    aws ec2 describe-regions --all-regions
    # only after the region is verified empty: aws account disable-region --region-name <region>

    Rollback: aws account enable-region --region-name <region>.

  • IAM role session length

    Guided fix

    IAM roles allow sessions longer than 4 hours.

    Long-lived temporary credentials stay valid long after a laptop is lost or a job ends. Shorter sessions limit how long stolen credentials work.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of iam_role_session_duration.
    Supports
    • HIPAA Security Rule: §164.312(a)(2)(iii)
    Manual steps and rollback
    1. Open IAM, Roles, the affected role, then Edit next to Maximum session duration.
    2. Set 1 to 4 hours and save. Callers that asked for longer sessions will be refused until they request a shorter one.
    aws iam update-role --role-name <role-name> --max-session-duration 14400

    Rollback: Set the maximum session duration back with the same command.

  • AWS Artifact agreements

    Guided fix

    Agreements such as the AWS Business Associate Addendum (needed for HIPAA workloads) have not been accepted in AWS Artifact.

    Under HIPAA, AWS is your business associate; without the accepted BAA you have no agreement covering protected health information on AWS.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of aws_artifact_agreements.
    Supports
    Not yet mapped to a framework requirement. Shown as supporting information only.
    Manual steps and rollback
    1. Open AWS Artifact, Agreements, Account agreements (or Organization agreements from the management account).
    2. Find the AWS Business Associate Addendum, review it, tick the acknowledgement and choose Accept.
    3. Keep only HIPAA-eligible services in scope for PHI.
    aws artifact list-customer-agreements

    Rollback: Agreements can be terminated in AWS Artifact; do not without legal advice.

  • AWS security contact

    Guided fix

    The account has no security alternate contact.

    AWS sends abuse reports, vulnerability notices and security bulletins to this contact. Without one they go only to the root email, which is often unmonitored.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of security_contact_set.
    Supports
    • SOC 2: supporting context for CC7.4
    • ISO/IEC 27001:2022 Annex A: supporting context for A.5.24
    • APRA CPS 234 Information Security: supporting context for Para 23
    Manual steps and rollback
    1. Open the Account page (account menu, Account), Alternate contacts, Edit.
    2. Fill in the Security contact with a monitored team address and phone number, save.
    aws account put-alternate-contact --alternate-contact-type SECURITY --email-address <security-team-email> --name "<name>" --phone-number "<phone>" --title "<title>"

    Rollback: aws account delete-alternate-contact --alternate-contact-type SECURITY (not recommended).

  • Broad IAM permissions

    Guided fix

    IAM users, groups or roles carry policies with broad Allow statements (wildcard actions or resources).

    Wildcard permissions turn any compromised credential into full control. Least privilege keeps a mistake or a breach contained.

    How it is fixed
    Guided. By hand: half a day.
    Verified by
    Rescan of iam_excessive_permissions.
    Supports
    Not yet mapped to a framework requirement. Shown as supporting information only.
    Manual steps and rollback
    1. Open IAM, Access Analyzer, and generate a policy from CloudTrail activity for the affected principal, or review Access Advisor (Last accessed) on the principal.
    2. Write a replacement policy that lists only the actions and resources actually used.
    3. Attach the new policy, detach the broad one, and watch for AccessDenied errors over a normal business cycle.
    aws iam generate-service-last-accessed-details --arn <principal-arn>
    aws iam detach-role-policy --role-name <role-name> --policy-arn <broad-policy-arn>

    Rollback: Re-attach the previous policy version (IAM keeps up to five versions of a customer managed policy).

Tier 4: root user only, no tool can automate it

AWS only lets the root user manage root credentials. No tool, including TrustProof, can make these changes; TrustProof reports them and verifies when they are done.

  • Root user MFA

    Root user only

    The AWS account root user, which can do anything in the account including closing it, has no multi-factor device.

    A compromised root password without MFA is a full account takeover with no way for IAM policies to limit the damage.

    How it is fixed
    Guided. By hand: a few minutes.
    Verified by
    Rescan of iam_root_mfa.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(d)
    • ISO/IEC 27001:2022 Annex A: A.8.5
    • ISO/IEC 20000-1:2018: 8.7.3
    • NIST Cybersecurity Framework 2.0: PR.AA-03
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Sign in as the root user (the account email address), not as an IAM user. Only the root user can change root settings; no IAM role, including TrustProof's, can.
    2. Open the account menu (top right), choose Security credentials.
    3. Under Multi-factor authentication (MFA), choose Assign MFA device and register a hardware key or authenticator app. AWS allows up to eight devices; register two and store one securely.
    4. Sign out and keep the root credentials and recovery codes in your organisation's secure store.
    # No CLI path: root MFA is set in the console by the root user.

    Rollback: Not applicable: removing root MFA is never recommended. If the device is lost, use the AWS account recovery process.

  • Root user access keys

    Root user only

    The root user has an active access key, so scripts or anyone holding the key can act with unlimited permissions.

    Root keys cannot be restricted by IAM policy. If one leaks, every resource in the account is exposed.

    How it is fixed
    Guided. By hand: about an hour.
    Verified by
    Rescan of iam_root_access_key.
    Supports
    • SOC 2: CC6.1
    • HIPAA Security Rule: §164.312(a)(1), §164.312(d)
    • ISO/IEC 27001:2022 Annex A: A.8.2
    • NIST Cybersecurity Framework 2.0: PR.AA-01
    • APRA CPS 234 Information Security: Para 21
    • Australian Privacy Principles: APP 11.1
    Manual steps and rollback
    1. Find what uses the key first: check CloudTrail for recent calls made with the root access key ID.
    2. Sign in as the root user and open Security credentials.
    3. Under Access keys, make the key Inactive, wait for any dependent job to fail or be moved to an IAM role, then Delete it.
    4. Replace any automation with an IAM role or, if a key is unavoidable, a least-privilege IAM user key with rotation.
    # Root keys are managed by the root user in the console. For the replacement IAM user:
    aws iam create-access-key --user-name <automation-user>

    Rollback: A deactivated key can be made active again by the root user until it is deleted. A deleted key cannot be recovered; create a new one only if there is no alternative.

What no tool can automate

Some things stay with you by design: AWS reserves them for the root user, or TrustProof chooses never to hold the permission.

  • Root-account items cannot be automated by any tool

    AWS only lets the root user manage root credentials (MFA and access keys). TrustProof, and every other product, can only tell you and verify the change afterwards.

  • TrustProof never writes to your identity provider

    Microsoft Entra ID and Google Workspace are read for evidence only. Every identity-provider fix is guided; your tenant administrator makes the change.

  • TrustProof never writes IAM policies, users or keys

    The fix role explicitly denies IAM writes and every delete. Rotating keys, enrolling MFA and tightening policies are guided, then verified by rescan.

  • Service-affecting fixes are not automated yet

    Encrypting an existing database or volume means a snapshot, an encrypted copy, a restore and a cutover. The library describes the path; automating it is a separate, explicit decision.

  • Every automatic fix needs a human first

    An engineer ticks the exact resources, an approver confirms with a fresh two-factor sign-in, and a rescan verifies the result so the fix becomes evidence.

Start your free AWS scanAbout One-Button FixSee pricing