Back to Blog
Keita Higaki

RDS Enhanced: Comprehensive Database Drift Detection with 31 CloudTrail Events

TFDrift-Falco v0.3.0 development adds comprehensive RDS support with 31 CloudTrail events covering DB instances, clusters, snapshots, parameter groups, subnet groups, and option groups. Now at 169 events (85% of target).

releaserdsauroradatabaseaws

RDS Enhanced: Comprehensive Database Drift Detection with 31 CloudTrail Events

We're excited to announce comprehensive RDS (Relational Database Service) support for TFDrift-Falco! This update brings our CloudTrail event coverage from 164 to 169 events, achieving 85% of our v0.3.0 target.

What's New

🗃️ RDS Enhanced (31 Events Total)

Complete database drift detection across all RDS resource types:

DB Instances (8 Events)

  • CreateDBInstance, DeleteDBInstance
  • ModifyDBInstance, RebootDBInstance
  • StartDBInstance, StopDBInstance
  • ModifyDBInstanceAttribute
  • CreateDBInstanceReadReplica

DB Clusters - Aurora (12 Events)

  • CreateDBCluster, DeleteDBCluster, ModifyDBCluster
  • StartDBCluster, StopDBCluster, FailoverDBCluster
  • AddRoleToDBCluster, RemoveRoleFromDBCluster
  • ModifyDBClusterEndpoint, CreateDBClusterEndpoint, DeleteDBClusterEndpoint
  • ModifyGlobalCluster

Snapshots (5 Events)

  • CreateDBSnapshot, DeleteDBSnapshot
  • ModifyDBSnapshotAttribute
  • CreateDBClusterSnapshot, DeleteDBClusterSnapshot

Parameter Groups (3 Events)

  • CreateDBParameterGroup, DeleteDBParameterGroup
  • ModifyDBParameterGroup

Subnet Groups (3 Events)

  • CreateDBSubnetGroup, DeleteDBSubnetGroup
  • ModifyDBSubnetGroup

Restore Operations (3 Events)

  • RestoreDBInstanceFromDBSnapshot
  • RestoreDBInstanceToPointInTime
  • RestoreDBClusterFromSnapshot

Option Groups (3 Events)

  • CreateOptionGroup, DeleteOptionGroup
  • ModifyOptionGroup

Coverage Progress

MetricValue
Total Events169
Target (v0.3.0)198
Progress85%
AWS Services16

Service Rankings

RDS now ranks #2 in event coverage:

  1. VPC/Networking - 33 events
  2. RDS - 31 events 🆕
  3. EC2 - 17 events
  4. ELB/ALB - 15 events

Why RDS Drift Detection Matters

Security Risks

Manual database changes can introduce critical security vulnerabilities:

  • Public Access Exposure: publiclyAccessible flag modified via console
  • Encryption Disabled: Storage encryption turned off on existing instances
  • Backup Deletion: Critical snapshots deleted bypassing retention policies
  • Network Isolation Breach: Subnet groups modified to allow public access

Compliance Requirements

Many compliance frameworks require:

  • Audit trail of all database configuration changes
  • Automated detection of unauthorized modifications
  • Immutable infrastructure (IaC-only changes)

Cost Management

Untracked database changes impact costs:

  • Instance type upgrades (db.t3.micro → db.r6g.xlarge)
  • Read replica creation without approval
  • Storage expansion without capacity planning
  • Multi-AZ enablement without budget approval

Use Cases

Critical Security Event: Public Access Detection

Detect when someone exposes a database to the internet:

- rule: RDS Instance Made Public
  desc: Detect when RDS instance is made publicly accessible
  condition: >
    ct.name="ModifyDBInstanceAttribute" and
    ct.request.publiclyAccessible="true"
  output: >
    Critical: RDS instance exposed to public internet
    (user=%ct.user instance=%ct.request.dBInstanceIdentifier
     region=%ct.region account=%ct.account)
  priority: CRITICAL
  source: aws_cloudtrail
  tags: [terraform, drift, rds, security, critical]

Parameter Group Configuration Drift

Track database parameter changes:

- rule: RDS Parameter Group Modified
  desc: Detect RDS parameter group configuration changes
  condition: ct.name="ModifyDBParameterGroup"
  output: >
    RDS parameter group modified
    (user=%ct.user group=%ct.request.dBParameterGroupName
     region=%ct.region)
  priority: WARNING
  source: aws_cloudtrail
  tags: [terraform, drift, rds, configuration]

Snapshot Deletion Tracking

Monitor backup integrity:

- rule: RDS Snapshot Deleted
  desc: Detect RDS snapshot deletion for audit trail
  condition: ct.name="DeleteDBSnapshot"
  output: >
    RDS snapshot deleted - verify retention policy compliance
    (user=%ct.user snapshot=%ct.request.dBSnapshotIdentifier
     region=%ct.region)
  priority: HIGH
  source: aws_cloudtrail
  tags: [terraform, drift, rds, backup, compliance]

Read Replica Creation

Track replication for cost and data governance:

- rule: RDS Read Replica Created
  desc: Detect read replica creation for cost tracking
  condition: ct.name="CreateDBInstanceReadReplica"
  output: >
    RDS read replica created - review capacity plan
    (user=%ct.user source=%ct.request.sourceDBInstanceIdentifier
     replica=%ct.request.dBInstanceIdentifier region=%ct.region)
  priority: WARNING
  source: aws_cloudtrail
  tags: [terraform, drift, rds, cost, capacity]

Subnet Group Modification

Detect network configuration changes:

- rule: RDS Subnet Group Modified
  desc: Detect RDS subnet group network changes
  condition: ct.name="ModifyDBSubnetGroup"
  output: >
    RDS subnet group modified - verify network isolation
    (user=%ct.user group=%ct.request.dBSubnetGroupName
     region=%ct.region)
  priority: HIGH
  source: aws_cloudtrail
  tags: [terraform, drift, rds, network, security]

Real-World Drift Scenarios

Scenario 1: Emergency Capacity Increase

Incident: During a traffic spike, an engineer manually upgrades a database instance from db.t3.large to db.r6g.2xlarge via AWS Console.

Detection:

[2025-12-14 15:23:45] ALERT Drift Detected: RDS Instance Modified
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Resource:     aws_db_instance.production_db
Event:        ModifyDBInstance
Severity:     HIGH

Changes:
  dbInstanceClass: db.t3.large → db.r6g.2xlarge
  allocatedStorage: 100 → 500 (GB)

Context:
  User:         ops-engineer@example.com
  Source:       AWS Console
  Region:       us-east-1
  Time:         2025-12-14T15:23:40Z

Impact:
  - Monthly cost increase: ~$350 → ~$1,200 (+$850/mo)
  - Storage cost increase: ~$12 → ~$60 (+$48/mo)
  - Total monthly impact: ~$898

Recommendation:
  - Update Terraform configuration if change is permanent
  - Review capacity planning with team
  - Schedule downsize after traffic spike resolves
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Scenario 2: Unauthorized Snapshot Deletion

Incident: A contractor accidentally deletes a critical production snapshot.

Detection:

[2025-12-14 09:15:22] ALERT Drift Detected: RDS Snapshot Deleted
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Resource:     aws_db_snapshot.prod_backup_20251201
Event:        DeleteDBSnapshot
Severity:     CRITICAL

Context:
  User:         contractor-user@external.com
  Snapshot ID:  prod-db-backup-20251201-final
  Source DB:    production-postgresql-master
  Region:       us-east-1
  Age:          13 days

Compliance Impact:
  - Violates 30-day retention policy
  - Missing required audit snapshot
  - SOC2 compliance violation

Action Required:
  - Verify if snapshot can be recovered
  - Document incident for audit trail
  - Review contractor IAM permissions
  - Update Terraform to prevent deletion protection bypass
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Scenario 3: Parameter Group Security Change

Incident: SSL enforcement disabled in production parameter group.

Detection:

[2025-12-14 11:45:33] ALERT Drift Detected: Parameter Group Modified
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Resource:     aws_db_parameter_group.production_pg
Event:        ModifyDBParameterGroup
Severity:     CRITICAL

Changes:
  rds.force_ssl: 1 → 0 (SSL enforcement disabled)
  log_statement: 'all' → 'none' (Query logging disabled)

Context:
  User:         dev-user@example.com
  Group:        production-postgres-13-params
  Region:       us-east-1

Security Impact:
  - Database connections no longer encrypted
  - Query audit logging disabled
  - PCI-DSS compliance violation
  - HIPAA compliance violation

Immediate Actions:
  1. Re-enable SSL enforcement immediately
  2. Re-enable query logging
  3. Review all connections made without SSL
  4. Rotate database credentials
  5. Update Terraform and apply
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Terraform Resource Mappings

Complete mapping of RDS CloudTrail events to Terraform resources:

CloudTrail EventTerraform Resource
CreateDBInstance, ModifyDBInstance, DeleteDBInstanceaws_db_instance
ModifyDBInstanceAttributeaws_db_instance
CreateDBInstanceReadReplicaaws_db_instance (read replica)
CreateDBCluster, ModifyDBCluster, DeleteDBClusteraws_rds_cluster
AddRoleToDBCluster, RemoveRoleFromDBClusteraws_rds_cluster_role_association
CreateDBClusterEndpoint, ModifyDBClusterEndpointaws_rds_cluster_endpoint
ModifyGlobalClusteraws_rds_global_cluster
CreateDBSnapshot, DeleteDBSnapshotaws_db_snapshot
CreateDBClusterSnapshot, DeleteDBClusterSnapshotaws_db_cluster_snapshot
CreateDBParameterGroup, ModifyDBParameterGroupaws_db_parameter_group
CreateDBSubnetGroup, ModifyDBSubnetGroupaws_db_subnet_group
CreateOptionGroup, ModifyOptionGroup, DeleteOptionGroupaws_db_option_group
RestoreDBInstanceFromDBSnapshotaws_db_instance (restored)
RestoreDBInstanceToPointInTimeaws_db_instance (PITR)

Test Coverage

100% test coverage for all 31 RDS events:

$ go test ./pkg/falco/... -v -run TestMapEventToResourceType

=== RUN   TestMapEventToResourceType
=== RUN   TestMapEventToResourceType/RDS_Instance_Create
=== RUN   TestMapEventToResourceType/RDS_Instance_Modify
=== RUN   TestMapEventToResourceType/RDS_Instance_Attribute_Modify
=== RUN   TestMapEventToResourceType/RDS_Instance_Read_Replica_Create
... (31 RDS tests)
--- PASS: TestMapEventToResourceType (0.00s)
PASS

All 31 RDS CloudTrail events now have comprehensive test coverage, ensuring reliable drift detection.

Getting Started

1. Update to Latest Version

git pull origin main

2. Configure RDS Falco Rules

Create rules/rds.yaml:

# RDS Security Rules
- rule: RDS Critical Security Change
  desc: Detect critical RDS security configuration changes
  condition: >
    ct.name in (ModifyDBInstanceAttribute, ModifyDBParameterGroup) and
    (ct.request.publiclyAccessible="true" or
     ct.request.storageEncrypted="false" or
     ct.request.deletionProtection="false")
  output: >
    Critical RDS security change detected
    (user=%ct.user event=%ct.name resource=%ct.request.dBInstanceIdentifier
     region=%ct.region account=%ct.account)
  priority: CRITICAL
  source: aws_cloudtrail
  tags: [terraform, drift, rds, security, critical]

# RDS Configuration Drift
- rule: RDS Configuration Drift
  desc: Detect RDS configuration changes
  condition: >
    ct.name in (ModifyDBInstance, ModifyDBCluster, ModifyDBParameterGroup,
                ModifyDBSubnetGroup, ModifyOptionGroup)
  output: >
    RDS configuration modified outside Terraform
    (user=%ct.user event=%ct.name resource=%ct.request.dBInstanceIdentifier
     region=%ct.region)
  priority: WARNING
  source: aws_cloudtrail
  tags: [terraform, drift, rds, configuration]

# RDS Backup Integrity
- rule: RDS Snapshot Deleted
  desc: Track RDS snapshot deletions for compliance
  condition: ct.name in (DeleteDBSnapshot, DeleteDBClusterSnapshot)
  output: >
    RDS snapshot deleted - verify retention policy
    (user=%ct.user snapshot=%ct.request.dBSnapshotIdentifier
     region=%ct.region)
  priority: HIGH
  source: aws_cloudtrail
  tags: [terraform, drift, rds, backup, compliance]

# RDS Cost Impact
- rule: RDS Read Replica Created
  desc: Track read replica creation for cost management
  condition: ct.name="CreateDBInstanceReadReplica"
  output: >
    RDS read replica created - review capacity and cost
    (user=%ct.user source=%ct.request.sourceDBInstanceIdentifier
     replica=%ct.request.dBInstanceIdentifier region=%ct.region)
  priority: WARNING
  source: aws_cloudtrail
  tags: [terraform, drift, rds, cost]

3. Test Event Detection

go test ./pkg/falco/... -v

All 169 CloudTrail events (including 31 RDS events) have 100% test coverage!

Best Practices

1. Deletion Protection

Always enable deletion protection in Terraform:

resource "aws_db_instance" "production" {
  identifier = "production-db"

  # Prevent accidental deletion
  deletion_protection = true

  # Require final snapshot
  skip_final_snapshot       = false
  final_snapshot_identifier = "production-db-final-snapshot"

  # Other configuration...
}

2. Encryption at Rest

Enforce encryption for all databases:

resource "aws_db_instance" "secure" {
  identifier = "secure-db"

  # Encryption
  storage_encrypted = true
  kms_key_id        = aws_kms_key.rds.arn

  # Other configuration...
}

3. Network Isolation

Never expose databases publicly:

resource "aws_db_instance" "private" {
  identifier = "private-db"

  # Network security
  publicly_accessible = false
  db_subnet_group_name = aws_db_subnet_group.private.name
  vpc_security_group_ids = [aws_security_group.rds.id]

  # Other configuration...
}

4. Backup Configuration

Configure automated backups:

resource "aws_db_instance" "backed_up" {
  identifier = "backed-up-db"

  # Backup configuration
  backup_retention_period = 30
  backup_window          = "03:00-04:00"

  # Enable automated backups
  skip_final_snapshot = false

  # Other configuration...
}

5. Parameter Group Management

Use custom parameter groups for production:

resource "aws_db_parameter_group" "production" {
  name   = "production-postgres-13"
  family = "postgres13"

  # Security parameters
  parameter {
    name  = "rds.force_ssl"
    value = "1"
  }

  parameter {
    name  = "log_statement"
    value = "all"
  }

  parameter {
    name  = "log_min_duration_statement"
    value = "1000"  # Log queries > 1 second
  }
}

What's Next

We're continuing toward the v0.3.0 milestone (198 events). Remaining services:

  • SageMaker - ML model deployment tracking
  • DynamoDB Enhanced - Additional table operations
  • VPC Enhanced - More network infrastructure events

29 events remaining to reach v0.3.0!

Community


Ready to enhance your RDS drift detection? Update to the latest version today and start monitoring your databases in real-time!

git clone https://github.com/higakikeita/tfdrift-falco.git
cd tfdrift-falco
make install

Happy drift hunting! 🗃️