SSM Incidents replication set is ACTIVE and has at least one response plan
Incident Manager uses a replication set and response plans. This evaluates whether a replication set exists and is ACTIVE, and that at least one response plan is configured for coordinated incident handling.
Risk
Without an ACTIVE replication set or response plans, incidents lack coordinated engagement and automation, raising MTTR and impacting availability and integrity.
Threats include prolonged outages, lateral movement, and data exfiltration from delayed containment and misrouted escalation.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks ssmincidents_enabled_with_plansRecommendation
Establish an ACTIVE replication set and create response plans that define engagement, escalation, runbooks, severity, and communication.
Apply least privilege to automation roles, test plans regularly, integrate with monitoring to trigger them, and use defense in depth with redundant contacts and Regions.
Remediation
Terraform
# Ensure replication set exists and becomes ACTIVE
resource "aws_ssmincidents_replication_set" "example" {
regions { # Critical: creates the replication set so it can be ACTIVE
region_name = "us-east-1"
}
}
# Create a minimal response plan
resource "aws_ssmincidents_response_plan" "example" {
name = "<example_resource_name>" # Critical: ensures at least one response plan exists
incident_template { # Critical: required template for the plan
title = "<example_title>"
impact = 5
}
}NativeIaC
# CloudFormation: create a minimal Incident Manager response plan
Resources:
ResponsePlan:
Type: AWS::SSMIncidents::ResponsePlan
Properties:
Name: <example_resource_name> # Critical: ensures at least one response plan exists
IncidentTemplate: # Critical: required template for the response plan
Title: <example_title> # Critical: required
Impact: 5 # Critical: required (1=highest, 5=lowest)Other
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.ssmincidents.ssmincidents_client import (
ssmincidents_client,
)
class ssmincidents_enabled_with_plans(Check):
def execute(self):
findings = []
if ssmincidents_client.replication_set is not None:
report = Check_Report_AWS(
metadata=self.metadata(),
resource={},
)
report.status = "FAIL"
report.status_extended = "No SSM Incidents replication set exists."
report.resource_arn = ssmincidents_client.replication_set_arn_template
report.resource_id = ssmincidents_client.audited_account
report.region = ssmincidents_client.region
if ssmincidents_client.replication_set:
report = Check_Report_AWS(
metadata=self.metadata(),
resource=ssmincidents_client.replication_set[0],
)
report.resource_id = ssmincidents_client.audited_account
report.region = ssmincidents_client.region
report.resource_arn = ssmincidents_client.replication_set[0].arn
report.resource_tags = [] # Not supported for replication sets
report.status = "FAIL"
report.status_extended = f"SSM Incidents replication set {ssmincidents_client.replication_set[0].arn} exists but not ACTIVE."
if ssmincidents_client.replication_set[0].status == "ACTIVE":
report.status_extended = f"SSM Incidents replication set {ssmincidents_client.replication_set[0].arn} is ACTIVE but no response plans exist."
if ssmincidents_client.response_plans:
report.status = "PASS"
report.status_extended = f"SSM Incidents replication set {ssmincidents_client.replication_set[0].arn} is ACTIVE and has response plans."
findings.append(report)
return findings