RDS event subscription for DB security groups is enabled for configuration change and failure events
RDS event subscriptions are evaluated for database security group events. The check expects an enabled subscription with source type db-security-group that includes the configuration change and failure event categories.
Risk
Missing alerts on security group changes or failures reduces visibility and slows response. Undetected rule changes can expose databases, while unnoticed failures prolong outages, impacting confidentiality and availability through unauthorized access or service disruption.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks rds_instance_event_subscription_security_groupsRecommendation
Create or update an RDS event subscription for source type db-security-group including configuration change and failure. Route alerts to monitored channels, restrict topic access (least privilege), integrate with incident response, and enforce change control and separation of duties for security group updates.
Remediation
CLI
aws rds create-event-subscription --subscription-name <SUBSCRIPTION_NAME> --sns-topic-arn <SNS_TOPIC_ARN> --source-type db-security-group --event-categories "configuration change" "failure"Terraform
resource "aws_db_event_subscription" "<example_resource_name>" {
name = "<example_resource_name>"
sns_topic = "<SNS_TOPIC_ARN>"
source_type = "db-security-group" # Critical: DB security group events
event_categories = ["configuration change", "failure"] # Critical: required categories
}NativeIaC
Resources:
<example_resource_name>:
Type: AWS::RDS::EventSubscription
Properties:
SnsTopicArn: <SNS_TOPIC_ARN>
SourceType: db-security-group # Critical: subscribe to DB security group events
EventCategories: # Critical: required categories
- configuration change
- failureOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.rds.rds_client import rds_client
class rds_instance_event_subscription_security_groups(Check):
def execute(self):
findings = []
if rds_client.provider.scan_unused_services or rds_client.db_instances:
for db_event in rds_client.db_event_subscriptions:
report = Check_Report_AWS(metadata=self.metadata(), resource=db_event)
report.status = "FAIL"
report.status_extended = "RDS security group event categories of configuration change and failure are not subscribed."
report.resource_id = rds_client.audited_account
report.resource_arn = rds_client._get_rds_arn_template(db_event.region)
report.resource_tags = []
if db_event.source_type == "db-security-group" and db_event.enabled:
report = Check_Report_AWS(
metadata=self.metadata(), resource=db_event
)
if db_event.event_list == [] or set(db_event.event_list) == {
"failure",
"configuration change",
}:
report.status = "PASS"
report.status_extended = (
"RDS security group events are subscribed."
)
elif db_event.event_list == ["configuration change"]:
report.status = "FAIL"
report.status_extended = "RDS security group event category of failure is not subscribed."
elif db_event.event_list == ["failure"]:
report.status = "FAIL"
report.status_extended = "RDS security group event category of configuration change is not subscribed."
findings.append(report)
return findings