Prioritized Remediation Plan
Recommendations sorted by severity and impact. Address Critical items immediately, then work through High and Medium priority.
Restrict Security Group Ingress
Security group allows inbound traffic from 0.0.0.0/0 (the entire internet) on sensitive ports.
Remediation Steps
- Identify which resources use this security group
- Determine the minimum required source IPs/ranges
- Replace 0.0.0.0/0 with specific CIDR blocks (corporate IPs, VPN ranges)
- For web servers, use an ALB + WAF in front instead of direct public access
- Or run: python 04-network-exposure/harden_network.py --action security-groups --no-dry-run
AWS CLI Command
$ aws ec2 revoke-security-group-ingress --group-id SG_ID --protocol tcp --port PORT --cidr 0.0.0.0/0
Affected Resources
Strengthen IAM Password Policy
The account password policy does not meet organizational security standards. Minimum length should be 14 characters with complexity requirements.
Remediation Steps
- Navigate to IAM > Account Settings > Password Policy
- Set minimum length to 14 characters
- Enable: require uppercase, lowercase, numbers, and symbols
- Set password expiration to 90 days
- Enable password reuse prevention (24 passwords)
- Or run: python 02-iam/iam_hardening.py --action password-policy --no-dry-run
AWS CLI Command
$ aws iam update-account-password-policy --minimum-password-length 14 --require-symbols --require-numbers --require-uppercase-characters --require-lowercase-characters --max-password-age 90 --password-reuse-prevention 24 --allow-users-to-change-password
Affected Resources
Rotate Stale Access Keys
Access keys older than 90 days should be rotated to limit the window of exposure if compromised.
Remediation Steps
- Create a new access key for the user
- Update applications using the old key with the new key
- Deactivate the old access key (monitor for issues)
- After confirmation, delete the old key
- Or run: python 02-iam/iam_hardening.py --action stale-keys --no-dry-run
AWS CLI Command
$ aws iam create-access-key --user-name USERNAME
$ aws iam update-access-key --user-name USERNAME --access-key-id OLD_KEY_ID --status Inactive
Affected Resources
Enable S3 Public Access Block
Buckets without public access block can be accidentally made public, exposing data.
Remediation Steps
- Enable all four public access block settings on the bucket
- Verify no applications depend on public access
- Or run: python 07-remediation/remediate.py --finding-type S3_NO_PUBLIC_ACCESS_BLOCK --no-dry-run
AWS CLI Command
$ aws s3api put-public-access-block --bucket BUCKET_NAME --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
Affected Resources
Enable VPC Flow Logs
VPC Flow Logs provide network traffic visibility critical for security investigations and monitoring.
Remediation Steps
- Create a CloudWatch Log Group for flow logs
- Create an IAM role for VPC Flow Logs
- Enable flow logs on the VPC
- Set retention to 90 days
- Or run: python 04-network-exposure/harden_network.py --action flow-logs --no-dry-run
AWS CLI Command
$ aws ec2 create-flow-logs --resource-ids VPC_ID --resource-type VPC --traffic-type ALL --log-destination-type cloud-watch-logs --log-group-name /aws/vpc-flow-logs/VPC_ID
Affected Resources
Enable EBS Default Encryption
New EBS volumes will not be encrypted by default, requiring teams to remember encryption for each volume.
Remediation Steps
- Enable EBS encryption by default in the account settings
- This affects only new volumes; existing unencrypted volumes require migration
- Or run: python 05-encryption-kms/enforce_encryption.py --action ebs-default --no-dry-run
AWS CLI Command
$ aws ec2 enable-ebs-encryption-by-default
Affected Resources
Enable Amazon GuardDuty
GuardDuty provides intelligent threat detection using ML and threat intelligence feeds at no upfront cost.
Remediation Steps
- Enable GuardDuty in all regions
- Configure S3 protection, EKS audit, and malware scanning
- Set up SNS notifications for HIGH/CRITICAL findings
- Or run: python 04-network-exposure/harden_network.py --action guardduty --no-dry-run
AWS CLI Command
$ aws guardduty create-detector --enable --data-sources S3Logs={Enable=true}
Affected Resources
Enable AWS Security Hub
Security Hub centralizes findings from GuardDuty, Inspector, Macie, Config, and third-party tools with automated compliance checks.
Remediation Steps
- Enable Security Hub in us-east-1
- Enable CIS AWS Foundations Benchmark standard
- Enable AWS Foundational Security Best Practices standard
- Configure cross-region aggregation
AWS CLI Command
$ aws securityhub enable-security-hub --enable-default-standards
Affected Resources
Require Symbols in Passwords
Password policy does not require special characters, reducing password entropy.
Remediation Steps
- Update password policy to require symbols
- Included in the full password policy remediation above
AWS CLI Command
$ aws iam update-account-password-policy --require-symbols
Affected Resources
Require Numbers in Passwords
Password policy does not require numeric characters.
Remediation Steps
- Update password policy to require numbers
AWS CLI Command
$ aws iam update-account-password-policy --require-numbers
Affected Resources
Require Uppercase Characters in Passwords
Password policy does not require uppercase characters.
Remediation Steps
- Update password policy to require uppercase characters
AWS CLI Command
$ aws iam update-account-password-policy --require-uppercase-characters
Affected Resources
Enable Password Expiration
Passwords never expire, meaning compromised credentials remain valid indefinitely.
Remediation Steps
- Set maximum password age to 90 days
- Communicate to users that they will need to rotate passwords
AWS CLI Command
$ aws iam update-account-password-policy --max-password-age 90
Affected Resources
Enable S3 Default Encryption
Bucket has no default encryption, meaning objects can be stored unencrypted.
Remediation Steps
- Enable default encryption with SSE-KMS or SSE-S3
- KMS encryption provides key management and audit trail
AWS CLI Command
$ aws s3api put-bucket-encryption --bucket BUCKET_NAME --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms"},"BucketKeyEnabled":true}]}'
Affected Resources
Remove Rules from Default Security Group
CIS Benchmark requires the default security group to have no rules. Resources should use custom security groups.
Remediation Steps
- Identify if any resources are using the default SG
- Migrate resources to purpose-built security groups
- Remove all ingress and egress rules from the default SG
AWS CLI Command
$ aws ec2 revoke-security-group-ingress --group-id DEFAULT_SG_ID --ip-permissions '[CURRENT_RULES]'