DEV Community

Cover image for AWS Security Best Practices for Production Applications

AWS Security Best Practices for Production Applications

AWS can scale your business overnight — or expose it if misconfigured. From IAM sprawl to open S3 buckets, mistakes are common. Security in AWS requires defense in depth.


1. IAM as the First Line

  • Favor least privilege roles
  • Avoid all-powerful AdministratorAccess policies
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::my-app-bucket/user-uploads/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-server-side-encryption": "aws:kms"
        }
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

2. VPC for Layered Defense

  • Public subnets for entry points
  • Private subnets for app and database tiers
  • Restrictive security groups between layers
AppSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Application tier security group
    VpcId: !Ref VPC
    SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 443
        ToPort: 443
        SourceSecurityGroupId: !Ref LoadBalancerSecurityGroup
Enter fullscreen mode Exit fullscreen mode

3. Encrypt at Rest and in Transit

  • KMS for S3 and RDS
  • SSL enforcement on databases
  • TLS for all APIs
const AWS = require('aws-sdk');
const s3 = new AWS.S3();

const params = {
  Bucket: 'secure-bucket',
  Key: 'data.json',
  Body: JSON.stringify({ secure: true }),
  ServerSideEncryption: 'aws:kms',
  SSEKMSKeyId: process.env.KMS_KEY_ID
};

await s3.upload(params).promise();
Enter fullscreen mode Exit fullscreen mode

4. Monitor and Detect

  • CloudTrail for audit logs
  • CloudWatch alarms for anomalies
  • GuardDuty for threat detection
CloudTrail:
  Type: AWS::CloudTrail::Trail
  Properties:
    TrailName: my-audit-trail
    S3BucketName: !Ref AuditLogsBucket
    IsMultiRegionTrail: true
    EnableLogFileValidation: true
Enter fullscreen mode Exit fullscreen mode

5. Manage Secrets Properly

Leverage Secrets Manager or SSM Parameter Store with automated rotation.

const AWS = require('aws-sdk');
const sm = new AWS.SecretsManager();

const secret = await sm.getSecretValue({ SecretId: 'prod/db-password' }).promise();
console.log(secret.SecretString);
Enter fullscreen mode Exit fullscreen mode

6. Automate Compliance

Use Lambda or Config Rules to detect — and remediate — insecure configurations in real time.

import boto3

def lambda_handler(event, context):
    ec2 = boto3.client('ec2')
    sgs = ec2.describe_security_groups()['SecurityGroups']
    for sg in sgs:
        for rule in sg.get('IpPermissions', []):
            for ip_range in rule.get('IpRanges', []):
                if ip_range.get('CidrIp') == '0.0.0.0/0':
                    print(f"Insecure SG found: {sg['GroupId']}")
Enter fullscreen mode Exit fullscreen mode

The cloud is only as secure as the guardrails you define.

With the right practices, AWS becomes not just scalable, but dependable.


I design AWS environments where security is baked in, not bolted on.

See case studies and services: kodex.studio

Top comments (0)