diff --git a/checks/check31 b/checks/check31
index 13a11eb1e44..8a8d1329cdb 100644
--- a/checks/check31
+++ b/checks/check31
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/MyCloudTrailLG \
+# --filter-name AWSAuthorizationFailures \
+# --filter-pattern '{ $.errorCode = "*UnauthorizedOperation" || $.errorCode = "AccessDenied*" }' \
+# --metric-transformations metricName=AuthorizationFailureCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name "Authorization Failures" \
+# --alarm-description "Alarm triggered when unauthorized API calls are made" \
+# --metric-name AuthorizationFailureCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check31="3.1,3.01"
CHECK_TITLE_check31="[check31] Ensure a log metric filter and alarm exist for unauthorized API calls (Scored)"
diff --git a/checks/check310 b/checks/check310
index 3c1e1d11243..77f4b5a3ce2 100644
--- a/checks/check310
+++ b/checks/check310
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name SecurityGroupConfigChanges \
+# --filter-pattern '{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }' \
+# --metric-transformations metricName=SecurityGroupEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name SecurityGroupConfigChangesAlarm \
+# --alarm-description "Triggered by AWS security group(s) config changes." \
+# --metric-name SecurityGroupEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check310="3.10"
CHECK_TITLE_check310="[check310] Ensure a log metric filter and alarm exist for security group changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check310="LEVEL2"
CHECK_ALTERNATE_check310="check310"
check310(){
- check3x '\$\.eventName\s*=\s*AuthorizeSecurityGroupIngress.+\$\.eventName\s*=\s*AuthorizeSecurityGroupEgress.+\$\.eventName\s*=\s*CreateSecurityGroup.+\$\.eventName\s*=\s*DeleteSecurityGroup'
+ check3x '\$\.eventName\s*=\s*AuthorizeSecurityGroupIngress.+\$\.eventName\s*=\s*AuthorizeSecurityGroupEgress.+\$\.eventName\s*=\s*RevokeSecurityGroupIngress.+\$\.eventName\s*=\s*RevokeSecurityGroupEgress.+\$\.eventName\s*=\s*CreateSecurityGroup.+\$\.eventName\s*=\s*DeleteSecurityGroup'
}
diff --git a/checks/check311 b/checks/check311
index 12aec273f45..b69fc75a2de 100644
--- a/checks/check311
+++ b/checks/check311
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name NetworkACLConfigChanges \
+# --filter-pattern '{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }' \
+# --metric-transformations metricName=NetworkAclEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name NetworkACLConfigChangesAlarm \
+# --alarm-description "Triggered by AWS Network ACL(s) config changes." \
+# --metric-name NetworkAclEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check311="3.11"
CHECK_TITLE_check311="[check311] Ensure a log metric filter and alarm exist for changes to Network Access Control Lists (NACL) (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check311="LEVEL2"
CHECK_ALTERNATE_check311="check311"
check311(){
- check3x '\$\.eventName\s*=\s*CreateNetworkAcl.+\$\.eventName\s*=\s*CreateNetworkAclEntry.+\$\.eventName\s*=\s*ReplaceNetworkAclEntry.+\$\.eventName\s*=\s*ReplaceNetworkAclAssociation'
+ check3x '\$\.eventName\s*=\s*CreateNetworkAcl.+\$\.eventName\s*=\s*CreateNetworkAclEntry.+\$\.eventName\s*=\s*DeleteNetworkAcl.+\$\.eventName\s*=\s*DeleteNetworkAclEntry.+\$\.eventName\s*=\s*ReplaceNetworkAclEntry.+\$\.eventName\s*=\s*ReplaceNetworkAclAssociation'
}
diff --git a/checks/check312 b/checks/check312
index 0bf516b6933..49e1462e3e7 100644
--- a/checks/check312
+++ b/checks/check312
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name VPCGatewayConfigChanges \
+# --filter-pattern '{ ($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }' \
+# --metric-transformations metricName=GatewayEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name VPCGatewayConfigChangesAlarm \
+# --alarm-description "Triggered by VPC Customer/Internet Gateway changes." \
+# --metric-name GatewayEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check312="3.12"
CHECK_TITLE_check312="[check312] Ensure a log metric filter and alarm exist for changes to network gateways (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check312="LEVEL1"
CHECK_ALTERNATE_check312="check312"
check312(){
- check3x '\$\.eventName\s*=\s*CreateCustomerGateway.+\$\.eventName\s*=\s*DeleteCustomerGateway.+\$\.eventName\s*=\s*DeleteInternetGateway.+\$\.eventName\s*=\s*DetachInternetGateway'
+ check3x '\$\.eventName\s*=\s*CreateCustomerGateway.+\$\.eventName\s*=\s*DeleteCustomerGateway.+\$\.eventName\s*=\s*AttachInternetGateway.+\$\.eventName\s*=\s*CreateInternetGateway.+\$\.eventName\s*=\s*DeleteInternetGateway.+\$\.eventName\s*=\s*DetachInternetGateway'
}
diff --git a/checks/check313 b/checks/check313
index ca619ecc725..a6a81edc01b 100644
--- a/checks/check313
+++ b/checks/check313
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name RouteTableConfigChanges \
+# --filter-pattern '{ ($.eventName = CreateRoute) || ($.eventName = CreateRouteTable) || ($.eventName = ReplaceRoute) || ($.eventName = ReplaceRouteTableAssociation) || ($.eventName = DeleteRouteTable) || ($.eventName = DeleteRoute) || ($.eventName = DisassociateRouteTable) }' \
+# --metric-transformations metricName=RouteTableEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name RouteTableConfigChangesAlarm \
+# --alarm-description "Triggered by AWS Route Table config changes." \
+# --metric-name RouteTableEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check313="3.13"
CHECK_TITLE_check313="[check313] Ensure a log metric filter and alarm exist for route table changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check313="LEVEL1"
CHECK_ALTERNATE_check313="check313"
check313(){
- check3x '\$\.eventName\s*=\s*CreateRoute.+\$\.eventName\s*=\s*CreateRouteTable.+\$\.eventName\s*=\s*DeleteRoute.+\$\.eventName\s*=\s*DisassociateRouteTable'
+ check3x '\$\.eventName\s*=\s*CreateRoute.+\$\.eventName\s*=\s*CreateRouteTable.+\$\.eventName\s*=\s*ReplaceRoute.+\$\.eventName\s*=\s*ReplaceRouteTableAssociation.+\$\.eventName\s*=\s*DeleteRouteTable.+\$\.eventName\s*=\s*DeleteRoute.+\$\.eventName\s*=\s*DisassociateRouteTable'
}
diff --git a/checks/check314 b/checks/check314
index 6c29c946320..3a6c9d7d27c 100644
--- a/checks/check314
+++ b/checks/check314
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name VPCNetworkConfigChanges \
+# --filter-pattern '{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }' \
+# --metric-transformations metricName=VpcEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name VPCNetworkConfigChangesAlarm \
+# --alarm-description "Triggered by AWS VPC(s) environment config changes." \
+# --metric-name VpcEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check314="3.14"
CHECK_TITLE_check314="[check314] Ensure a log metric filter and alarm exist for VPC changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check314="LEVEL1"
CHECK_ALTERNATE_check314="check314"
check314(){
- check3x '\$\.eventName\s*=\s*CreateVpc.+\$\.eventName\s*=\s*DeleteVpc.+\$\.eventName\s*=\s*DisableVpcClassicLink.+\$\.eventName\s*=\s*EnableVpcClassicLink'
+ check3x '\$\.eventName\s*=\s*CreateVpc.+\$\.eventName\s*=\s*DeleteVpc.+\$\.eventName\s*=\s*ModifyVpcAttribute.+\$\.eventName\s*=\s*AcceptVpcPeeringConnection.+\$\.eventName\s*=\s*CreateVpcPeeringConnection.+\$\.eventName\s*=\s*DeleteVpcPeeringConnection.+\$\.eventName\s*=\s*RejectVpcPeeringConnection.+\$\.eventName\s*=\s*AttachClassicLinkVpc.+\$\.eventName\s*=\s*DetachClassicLinkVpc.+\$\.eventName\s*=\s*DisableVpcClassicLink.+\$\.eventName\s*=\s*EnableVpcClassicLink'
}
diff --git a/checks/check32 b/checks/check32
index e13b18dd577..83779842dff 100644
--- a/checks/check32
+++ b/checks/check32
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name ConsoleSignInWithoutMfaCount \
+# --filter-pattern '{ $.eventName = "ConsoleLogin" && $.additionalEventData.MFAUsed != "Yes" }' \
+# --metric-transformations metricName=ConsoleSignInWithoutMfaCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name ConsoleSignInWithoutMfaAlarm \
+# --alarm-description "Triggered by sign-in requests made without MFA." \
+# --metric-name ConsoleSignInWithoutMfaCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check32="3.2,3.02"
CHECK_TITLE_check32="[check32] Ensure a log metric filter and alarm exist for Management Console sign-in without MFA (Scored)"
diff --git a/checks/check33 b/checks/check33
index b6825566c0b..00c6d7dd65c 100644
--- a/checks/check33
+++ b/checks/check33
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name RootAccountUsage \
+# --filter-pattern '{ $.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent" }' \
+# --metric-transformations metricName=RootAccountUsageEventCount,metricNamespace=CloudTrailMetrics,metricValue=1 \
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name RootAccountUsageAlarm \
+# --alarm-description "Triggered by AWS Root Account usage." \
+# --metric-name RootAccountUsageEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check33="3.3,3.03"
CHECK_TITLE_check33="[check33] Ensure a log metric filter and alarm exist for usage of root account (Scored)"
diff --git a/checks/check34 b/checks/check34
index 4eaf345cd6a..e4751c79e1e 100644
--- a/checks/check34
+++ b/checks/check34
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name IAMAuthConfigChanges \
+# --filter-pattern '{ ($.eventName = DeleteGroupPolicy) || ($.eventName = DeleteRolePolicy) || ($.eventName = DeleteUserPolicy) || ($.eventName = PutGroupPolicy) || ($.eventName = PutRolePolicy) || ($.eventName = PutUserPolicy) || ($.eventName = CreatePolicy) || ($.eventName = DeletePolicy) || ($.eventName = CreatePolicyVersion) || ($.eventName = DeletePolicyVersion) || ($.eventName = AttachRolePolicy) || ($.eventName = DetachRolePolicy) || ($.eventName = AttachUserPolicy) || ($.eventName = DetachUserPolicy) || ($.eventName = AttachGroupPolicy) || ($.eventName = DetachGroupPolicy) }' \
+# --metric-transformations metricName=IAMPolicyEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name IAMAuthorizationActivityAlarm \
+# --alarm-description "Triggered by AWS IAM authorization config changes." \
+# --metric-name IAMPolicyEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check34="3.4,3.04"
CHECK_TITLE_check34="[check34] Ensure a log metric filter and alarm exist for IAM policy changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check34="LEVEL1"
CHECK_ALTERNATE_check304="check34"
check34(){
- check3x '\$\.eventName\s*=\s*DeleteGroupPolicy.+\$\.eventName\s*=\s*DeleteRolePolicy.+\$\.eventName\s*=\s*AttachGroupPolicy.+\$\.eventName\s*=\s*DetachGroupPolicy'
+ check3x '\$\.eventName\s*=\s*DeleteGroupPolicy.+\$\.eventName\s*=\s*DeleteRolePolicy.+\$\.eventName\s*=\s*DeleteUserPolicy.+\$\.eventName\s*=\s*PutGroupPolicy.+\$\.eventName\s*=\s*PutRolePolicy.+\$\.eventName\s*=\s*PutUserPolicy.+\$\.eventName\s*=\s*CreatePolicy.+\$\.eventName\s*=\s*DeletePolicy.+\$\.eventName\s*=\s*CreatePolicyVersion.+\$\.eventName\s*=\s*DeletePolicyVersion.+\$\.eventName\s*=\s*AttachRolePolicy.+\$\.eventName\s*=\s*DetachRolePolicy.+\$\.eventName\s*=\s*AttachUserPolicy.+\$\.eventName\s*=\s*DetachUserPolicy.+\$\.eventName\s*=\s*AttachGroupPolicy.+\$\.eventName\s*=\s*DetachGroupPolicy'
}
diff --git a/checks/check35 b/checks/check35
index 63ba2243cb9..b8b4c6cf7f8 100644
--- a/checks/check35
+++ b/checks/check35
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/MyCloudTrailLG \
+# --filter-name AWSCloudTrailChanges \
+# --filter-pattern '{ ($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }' \
+# --metric-transformations metricName=CloudTrailEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name "CloudTrail Changes" \
+# --alarm-description "Triggered by AWS CloudTrail configuration changes." \
+# --metric-name CloudTrailEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check35="3.5,3.05"
CHECK_TITLE_check35="[check35] Ensure a log metric filter and alarm exist for CloudTrail configuration changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check35="LEVEL1"
CHECK_ALTERNATE_check305="check35"
check35(){
- check3x '\$\.eventName\s*=\s*CreateTrail.+\$\.eventName\s*=\s*UpdateTrail.+\$\.eventName\s*=\s*StartLogging.+\$\.eventName\s*=\s*StopLogging'
+ check3x '\$\.eventName\s*=\s*CreateTrail.+\$\.eventName\s*=\s*UpdateTrail.+\$\.eventName\s*=\s*DeleteTrail.+\$\.eventName\s*=\s*StartLogging.+\$\.eventName\s*=\s*StopLogging'
}
diff --git a/checks/check36 b/checks/check36
index 8fc6d86f5ee..699739d89a4 100644
--- a/checks/check36
+++ b/checks/check36
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/MyCloudTrailLG \
+# --filter-name AWSConsoleSignInFailures \
+# --filter-pattern '{ ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }' \
+# --metric-transformations metricName=ConsoleSigninFailureCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name "Console Sign-in Failures" \
+# --alarm-description "AWS Management Console Sign-in Failure Alarm." \
+# --metric-name ConsoleSigninFailureCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 3 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check36="3.6,3.06"
CHECK_TITLE_check36="[check36] Ensure a log metric filter and alarm exist for AWS Management Console authentication failures (Scored)"
diff --git a/checks/check37 b/checks/check37
index 44e671135ed..c0390bc97b1 100644
--- a/checks/check37
+++ b/checks/check37
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name AWSCMKChanges \
+# --filter-pattern '{ ($.eventSource = kms.amazonaws.com) && (($.eventName = DisableKey) || ($.eventName = ScheduleKeyDeletion)) }' \
+# --metric-transformations metricName=CMKEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name AWSCMKChangesAlarm \
+# --alarm-description "Triggered by AWS CMK changes." \
+# --metric-name CMKEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check37="3.7,3.07"
CHECK_TITLE_check37="[check37] Ensure a log metric filter and alarm exist for disabling or scheduled deletion of customer created CMKs (Scored)"
diff --git a/checks/check38 b/checks/check38
index f0188751324..ddc69d36894 100644
--- a/checks/check38
+++ b/checks/check38
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name S3BucketConfigChanges \
+# --filter-pattern '{ ($.eventSource = s3.amazonaws.com) && (($.eventName = PutBucketAcl) || ($.eventName = PutBucketPolicy) || ($.eventName = PutBucketCors) || ($.eventName = PutBucketLifecycle) || ($.eventName = PutBucketReplication) || ($.eventName = DeleteBucketPolicy) || ($.eventName = DeleteBucketCors) || ($.eventName = DeleteBucketLifecycle) || ($.eventName = DeleteBucketReplication)) }' \
+# --metric-transformations metricName=S3BucketEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name S3BucketConfigChangesAlarm \
+# --alarm-description "Triggered by AWS S3 Bucket config changes." \
+# --metric-name S3BucketEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check38="3.8,3.08"
CHECK_TITLE_check38="[check38] Ensure a log metric filter and alarm exist for S3 bucket policy changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check38="LEVEL1"
CHECK_ALTERNATE_check308="check38"
check38(){
- check3x '\$\.eventSource\s*=\s*s3.amazonaws.com.+\$\.eventName\s*=\s*PutBucketAcl.+\$\.eventName\s*=\s*DeleteBucketLifecycle.+\$\.eventName\s*=\s*DeleteBucketReplication'
+ check3x '\$\.eventSource\s*=\s*s3.amazonaws.com.+\$\.eventName\s*=\s*PutBucketAcl.+\$\.eventName\s*=\s*PutBucketPolicy.+\$\.eventName\s*=\s*PutBucketCors.+\$\.eventName\s*=\s*PutBucketLifecycle.+\$\.eventName\s*=\s*PutBucketReplication.+\$\.eventName\s*=\s*DeleteBucketPolicy.+\$\.eventName\s*=\s*DeleteBucketCors.+\$\.eventName\s*=\s*DeleteBucketLifecycle.+\$\.eventName\s*=\s*DeleteBucketReplication'
}
diff --git a/checks/check39 b/checks/check39
index d8feb0de29e..3a812a4ae52 100644
--- a/checks/check39
+++ b/checks/check39
@@ -7,6 +7,31 @@
#
# You should have received a copy of the license along with this
# work. If not, see .
+#
+# Remediation:
+#
+# https://d1.awsstatic.com/whitepapers/compliance/AWS_CIS_Foundations_Benchmark.pdf
+#
+# aws logs put-metric-filter \
+# --region us-east-1 \
+# --log-group-name CloudTrail/CloudWatchLogGroup \
+# --filter-name AWSConfigChanges \
+# --filter-pattern '{ ($.eventSource = config.amazonaws.com) && (($.eventName = StopConfigurationRecorder)||($.eventName = DeleteDeliveryChannel)||($.eventName = PutDeliveryChannel)||($.eventName = PutConfigurationRecorder)) }' \
+# --metric-transformations metricName=ConfigEventCount,metricNamespace=CloudTrailMetrics,metricValue=1
+#
+# aws cloudwatch put-metric-alarm \
+# --region us-east-1 \
+# --alarm-name AWSConfigChangesAlarm \
+# --alarm-description "Triggered by AWS Config changes." \
+# --metric-name ConfigEventCount \
+# --namespace CloudTrailMetrics \
+# --statistic Sum \
+# --comparison-operator GreaterThanOrEqualToThreshold \
+# --evaluation-periods 1 \
+# --period 300 \
+# --threshold 1 \
+# --actions-enabled \
+# --alarm-actions arn:aws:sns:us-east-1:123456789012:CloudWatchAlarmTopic
CHECK_ID_check39="3.9,3.09"
CHECK_TITLE_check39="[check39] Ensure a log metric filter and alarm exist for AWS Config configuration changes (Scored)"
@@ -15,5 +40,5 @@ CHECK_TYPE_check39="LEVEL2"
CHECK_ALTERNATE_check309="check39"
check39(){
- check3x '\$\.eventSource\s*=\s*config.amazonaws.com.+\$\.eventName\s*=\s*StopConfigurationRecorder.+\$\.eventName\s*=\s*PutDeliveryChannel.+\$\.eventName\s*=\s*PutConfigurationRecorder'
+ check3x '\$\.eventSource\s*=\s*config.amazonaws.com.+\$\.eventName\s*=\s*StopConfigurationRecorder.+\$\.eventName\s*=\s*DeleteDeliveryChannel.+\$\.eventName\s*=\s*PutDeliveryChannel.+\$\.eventName\s*=\s*PutConfigurationRecorder'
}