Back to Checks
RDS instance event subscription is enabled for maintenance, configuration change, and failure categories
rds_instance_critical_event_subscription
Service: rdsSeverity: medium
OfficialBuilt-inVerified
Categories:logging
Resource Type:AwsRdsEventSubscription
RDS event subscriptions for DB instances are assessed for coverage of the critical categories maintenance, configuration change, and failure.
The evaluation looks for enabled db-instance subscriptions and confirms these categories are included or that all events are selected.
Risk
Without these notifications, critical DB events go unseen, undermining availability and integrity. Missed outages, unexpected restarts, or silent parameter changes can delay response, prolong downtime, corrupt data flows, and leave misconfigurations unaddressed.
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks rds_instance_critical_event_subscriptionRecommendation
Establish and sustain RDS event subscriptions for db-instance that include maintenance, configuration change, and failure.
- Deliver to monitored channels (ticketing/chat/paging)
- Enforce least privilege on topics
- Test alert delivery and runbooks
- Periodically review coverage across Regions
Remediation
CLI
aws rds create-event-subscription --subscription-name <example_resource_name> --sns-topic-arn <sns-topic-arn> --source-type db-instance --event-categories "maintenance" "configuration change" "failure"Terraform
# Terraform: RDS DB instance event subscription
resource "aws_db_event_subscription" "<example_resource_name>" {
name = "<example_resource_name>"
sns_topic = "<sns-topic-arn>"
source_type = "db-instance" # critical: DB instance events
event_categories = ["maintenance", "configuration change", "failure"] # critical: required categories
}NativeIaC
# CloudFormation: RDS DB instance event subscription
Resources:
<example_resource_name>:
Type: AWS::RDS::EventSubscription
Properties:
SnsTopicArn: <sns-topic-arn> # critical: SNS topic to receive notifications
SourceType: db-instance # critical: subscribe to DB instance events
EventCategories: # critical: required categories for PASS
- maintenance
- configuration change
- failureOther
1Open the AWS Console and go to RDS
2In the left menu, select Event subscriptions > Create event subscription
3Send notifications to: select an existing SNS topic (<sns-topic-arn>)
4Source type: choose Instances
5Event categories: select Maintenance, Configuration change, and Failure
6Create the subscription
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_critical_event_subscription(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 instance event categories of maintenance, 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.region = db_event.region
report.resource_tags = db_event.tags
if db_event.source_type == "db-instance" 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) == {
"maintenance",
"configuration change",
"failure",
}:
report.status = "PASS"
report.status_extended = "RDS instance events are subscribed."
elif set(db_event.event_list) == {"maintenance"}:
report.status = "FAIL"
report.status_extended = "RDS instance event categories of configuration change and failure are not subscribed."
elif set(db_event.event_list) == {"configuration change"}:
report.status = "FAIL"
report.status_extended = "RDS instance event categories of maintenance and failure are not subscribed."
elif set(db_event.event_list) == {"failure"}:
report.status = "FAIL"
report.status_extended = "RDS instance event categories of maintenance and configuration change are not subscribed."
elif set(db_event.event_list) == {
"maintenance",
"configuration change",
}:
report.status = "FAIL"
report.status_extended = (
"RDS instance event category of failure is not subscribed."
)
elif set(db_event.event_list) == {
"maintenance",
"failure",
}:
report.status = "FAIL"
report.status_extended = "RDS instance event category of configuration change is not subscribed."
elif set(db_event.event_list) == {
"configuration change",
"failure",
}:
report.status = "FAIL"
report.status_extended = "RDS instance event category of maintenance is not subscribed."
else:
report.status = "FAIL"
report.status_extended = "RDS instance event categories of maintenance, configuration change, and failure are not subscribed."
findings.append(report)
return findingsReferences
- https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Subscribing.html
- https://docs.aws.amazon.com/securityhub/latest/userguide/rds-controls.html
- https://www.trendmicro.com/trendaivisiononecloudriskmanagement/knowledge-base/aws/RDS/rds-instance-level-events.html
- https://docs.aws.amazon.com/securityhub/latest/userguide/rds-controls.html#rds-20