AWS Security Baseline Every Account Needs in 2025
Most AWS security breaches follow the same pattern: compromised credentials, over-permissive roles, and no detection. This checklist covers the baseline every account needs — regardless of size.
Account-Level Controls
Enable MFA on Root Account
The root account can do anything. If it’s compromised, you’re done. Enable MFA immediately and never use it for day-to-day operations.
# Verify MFA is enabled
aws iam get-account-summary | grep "MFAEnabled"
Create an Account Alias
aws iam create-account-alias --account-alias your-company-name
Prevents accidentally operating in the wrong account.
Enable AWS Security Hub
Security Hub aggregates findings from GuardDuty, Inspector, Macie, and third-party tools into a single dashboard.
aws securityhub enable-security-hub \
--enable-default-standards
The “AWS Foundational Security Best Practices” standard runs 200+ automated checks.
IAM Hardening
Delete or Disable Root Access Keys
Root access keys are a critical risk — they bypass all IAM policies. If they exist, delete them.
aws iam list-access-keys --user-name root
# Delete any keys found
Enforce IAM Password Policy
aws iam update-account-password-policy \
--minimum-password-length 16 \
--require-symbols \
--require-numbers \
--require-uppercase-characters \
--require-lowercase-characters \
--max-password-age 90 \
--password-reuse-prevention 12
Apply Least Privilege to All Roles
The single most common cause of breaches: over-permissive IAM roles.
Audit your roles:
# Find roles with AdministratorAccess
aws iam list-roles | jq '.Roles[].RoleName' -r | while read role; do
aws iam list-attached-role-policies --role-name "$role" | \
grep -q AdministratorAccess && echo "$role has AdministratorAccess"
done
Use IAM Access Analyzer to identify unused permissions in existing roles.
Use Service Control Policies (SCPs)
If you have AWS Organizations, SCPs are your last line of defense. Even admins can’t override them.
Essential SCPs to implement:
- Deny all actions in regions you don’t use
- Deny root account usage
- Require MFA for sensitive actions
- Prevent disabling CloudTrail
Logging and Monitoring
Enable CloudTrail in All Regions
aws cloudtrail create-trail \
--name management-events \
--s3-bucket-name your-cloudtrail-bucket \
--is-multi-region-trail \
--enable-log-file-validation
aws cloudtrail start-logging --name management-events
--is-multi-region-trail is critical — attackers often operate in regions you’re not using.
Enable GuardDuty
GuardDuty uses ML to detect: crypto mining, exfiltration, credential compromise, and unusual API calls. At $1-3/month for most accounts, it’s the best security ROI in AWS.
aws guardduty create-detector --enable --finding-publishing-frequency FIFTEEN_MINUTES
Set up SNS notifications for findings above Medium severity:
aws guardduty create-publishing-destination \
--detector-id <DETECTOR_ID> \
--destination-type SNS \
--destination-properties DestinationArn=<SNS_TOPIC_ARN>
CloudWatch Alarms for Security Events
Essential alarms to create:
alarms = [
"Root account usage",
"IAM policy changes",
"CloudTrail configuration changes",
"Console login without MFA",
"Authorization failures (threshold: 10/5min)",
"Security group changes",
]
These cost cents per month and catch the most common attack patterns.
Network Security
VPC Design Principles
- Never put application servers in a public subnet
- Use NAT Gateway for outbound internet from private subnets
- Enable VPC Flow Logs (start with REJECT to find blocked traffic)
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-xxxxxxxx \
--traffic-type REJECT \
--log-destination-type cloud-watch-logs \
--log-group-name vpc-flow-logs
Security Group Audit
The most common finding: 0.0.0.0/0 on port 22 (SSH) or port 3306 (MySQL).
# Find security groups with 0.0.0.0/0 ingress
aws ec2 describe-security-groups \
--filters Name=ip-permission.cidr,Values='0.0.0.0/0' \
--query 'SecurityGroups[*].[GroupId,GroupName,IpPermissions]'
If you need SSH access, use SSM Session Manager instead — no open ports required.
Data Protection
Enable Default Encryption on S3
aws s3api put-bucket-encryption \
--bucket your-bucket \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
},
"BucketKeyEnabled": true
}]
}'
Enable EBS Encryption by Default
aws ec2 enable-ebs-encryption-by-default
Any new EBS volumes will automatically encrypt. Zero performance impact with modern instances.
RDS Encryption
Encryption must be enabled at creation time — you can’t add it later (you can create an encrypted snapshot and restore).
Always specify --storage-encrypted when creating RDS instances.
The Security Baseline Checklist
- Root account MFA enabled
- No root access keys
- IAM password policy enforced
- CloudTrail enabled in all regions
- GuardDuty enabled
- Security Hub enabled with FSBP standard
- S3 Block Public Access enabled account-wide
- EBS default encryption enabled
- VPC Flow Logs enabled
- Security groups audited (no 0.0.0.0/0 on sensitive ports)
- CloudWatch alarms for security events
- No unused access keys (rotate or delete)
Completing this list puts you ahead of 80% of AWS accounts. Most breaches exploit basics, not sophisticated vulnerabilities.
Need a security audit or help implementing these controls? Contact us for a free assessment.
MakFam Solutions
Cloud infrastructure and AI consultant with 6+ years of AWS expertise. Helping small and medium businesses build scalable, secure cloud systems.