如何使用 CloudWatch Events 和 Amazon SNS 主题设置自定义电子邮件通知?

上次更新日期:2021 年 6 月 22 日

我想要使用 Amazon CloudWatch Events 和 Amazon Simple Notification Service (Amazon SNS) 主题设置自定义电子邮件通知。

简短描述

以下解决方法介绍了如何配置使用 SNS 主题作为其目标的 CloudWatch Events 规则。根据该规则,Amazon SNS 会在您的事件发生时发送通知到电子邮件地址或订阅主题的地址。由于它的格式设置,消息难以被读取。不过,您可以使用 AWS Lambda 函数优化格式,以便创建自定义提醒消息。

重要提示:以下解决方法使用 AWS Security Hub 事件和 Lambda 函数进行自定义。如需了解关于成本的更多信息,见 AWS Security Hub 定价AWS Lambda 定价

解决方法

创建 SNS 主题

1.    打开 Amazon SNS 控制台

2.    在导航窗格中,选择 Topics(主题)。

3.    选择创建主题

4.    在 Details(详细信息)部分,为 Type(类型)选择 Standard(标准)。

5.    对于 Name(名称),输入主题的名称。

6.    选择 Create topic(创建主题)。

创建订阅

1.    在创建的主题中,选择 Create subscription(创建订阅)。

2.    对于 Topic ARN(主题 ARN),选择您之前所创建主题的 Amazon Resource Name (ARN)。

注意:Topic ARN(主题 ARN)可能已经使用您之前所创建主题的 ARN 进行填充。

3.    对于 Protocol(协议),输入 Email(电子邮件)。 

4.    对于 Endpoint(终端节点),输入您希望接收 SNS 通知的电子邮件地址。

5.    选择 Create subscription(创建订阅)。

重要提示:您必须在发送给订阅者的确认电子邮件中确认订阅,以便订阅的状态从 PendingConfirmation(待确认)切换到 Confirmed(已确认)。 

注意:(可选)您还可以创建基于身份验证的订阅,防止对您的主题进行取消订阅操作。

配置 CloudWatch Events 规则

1.    打开 CloudWatch 控制台

2.    在导航窗格的 Events(事件)部分,选择 Rules(规则)。

3.    选择 Create rule(创建规则)。

4.    对于 Service Name(服务名称),选择 Security Hub

5.    对于 Event Type(事件类型),选择 All Events(全部事件)。

注意:要为更多特定事件配置提醒,见 EventBridge 的 Security Hub 集成类型

6.    在 Targets(目标)部分,选择 Add target(添加目标)。

7.    从目标菜单中,选择 SNS topic(SNS 主题)。

8.    对于 Topic(目标),选择您之前创建的主题。

9.    选择 Configure details

10.    对于 Name(名称),输入您的规则名称。

11.    选择 Create rule(创建规则)。

测试规则

1.    打开 AWS Security Hub

2.    在导航窗格中,选择 Findings(发现结果)。

3.    在发现结果列表中,选择您想要收到提醒项目的复选框。

4.    选择 Actions(操作),然后选择 Send to email(发送到电子邮件)。

5.    查收您的电子邮件收件箱,以确定您是否收到发自 no-reply@sns.amazonaws.com 的 AWS 通知消息。例如:

{“version”: “0”,“id”: “91ce02aa-7c08-bacc-cc71-10837f6ef124”,“detail-type”: “Security Hub Findings - Custom Action”,“source”: “aws.securityhub”,“account”: “111122223333”,“time”: “2021-06-17T11:44:13Z”,“region”: “us-east-1”,“resources”: [“arn:aws:securityhub:us-east-1:111122223333:action/custom/SendToEmail”],“detail”: {“actionName”: “Send to email”,“actionDescription”: “This Custom Action sends selected findings to email addresses defined in an SNS Topic Subscription.”,“findings”: [{“ProductArn”: “arn:aws:securityhub:us-east-1::product/aws/securityhub”,“Types”: [“Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark”],“Description”: “The \”root\” account has unrestricted access to all resources in the AWS account.It is highly recommended that the use of this account be avoided.”,“Compliance”: {“Status”: “FAILED”,“StatusReasons”: [{“Description”: “Multi region CloudTrail with the required configuration does not exist in the account”,“ReasonCode”:“CLOUDTRAIL_MULTI_REGION_NOT_PRESENT”}]},“ProductName”: “Security Hub”,“FirstObservedAt”:“2020-10-22T10:18:10.991Z”,“CreatedAt”: “2020-10-22T10:18:10.991Z”,“LastObservedAt”: “2021-06-17T10:36:41.175Z”,“CompanyName”: “AWS”,“FindingProviderFields”: {“Types”: [“Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark”],“Severity”: {“Normalized”: 30,“Label”: “LOW”,“Product”: 30,“Original”: “LOW”}},“ProductFields”: {“StandardsGuideArn”: “arn: aws: securityhub: : : ruleset/cis-aws-foundations-benchmark/v/1.2.0”,“StandardsGuideSubscriptionArn”: “arn: aws: securityhub: us-east-1: 111122223333: subscription/cis-aws-foundations-benchmark/v/1.2.0”,“RuleId”: “1.1”,“RecommendationUrl”: “SampleURL”,“aws/securityhub/CompanyName”: “AWS”,“aws/securityhub/annotation”:“MultiregionCloudTrailwiththerequiredconfigurationdoesnotexistintheaccount”,“Resources: 0/Id”: “arn: aws: iam: : 111122223333: root”,“aws/securityhub/FindingId”: “arn: aws: securityhub: us-east-1: : product/aws/securityhub/arn: aws: securityhub: us-east-1:111122223333: subscription/cis-aws-foundations-benchmark/v/1.2.0/1.1/finding/4eccb91a-c940-4e1d-90de-7c046369b89f”},“Remediation”: {“Recommendation”:{“Text”:“FordirectionsonhowtofixthisissuepleaseconsulttheAWSSecurityHubCISdocumentation.”,“Url”:“SampleURL”}},“SchemaVersion”:“2018-10-08”,“GeneratorId”: “arn: aws: securityhub: : : ruleset/cis-aws-foundations-benchmark/v/1.2.0/rule/1.1”,“RecordState”: “ACTIVE”,“Title”: “1.1Avoidtheuseofthe\”root\”account”,“Workflow”: {“Status”: “NEW”},“Severity”: {“Normalized”: 30,“Label”: “LOW”,“Product”: 30,“Original”: “LOW”},“UpdatedAt”: “2021-06-17T10: 36: 39.712Z”,“WorkflowState”: “NEW”,“AwsAccountId”: “111122223333”,“Region”:“us-east-1”,“Id”: “arn: aws: securityhub: us-east-1:111122223333: subscription/cis-aws-foundations-benchmark/v/1.2.0/1.1/finding/4eccb91a-c940-4e1d-90de-7c046369b89f”,“Resources”: [{ “Partition”: “aws”,”Type”: “AwsAccount”,”Region”: “us-east-1”,”Id”: “AWS: : : : Account: 111122223333”}]}]}}
--
如果您希望停止接收来自该主题的通知,请单击或访问下面的链接取消订阅:
取消订阅


请勿直接回复此电子邮件。如果您对此电子邮件有任何疑问或意见,请联系我们:https://aws.amazon.com/support。

使用 Lambda 函数自定义提醒

创建 Lambda 函数,以便从 JSON 内容提取您想要的信息,并将它发布到 Amazon SNS。

1.    打开 Lambda 控制台

2.    在导航窗格中,选择 Functions(函数)。

3.    选择创建函数

4.    选择 Author from scratch(从头开始创建)。

5.    对于 Function name(函数名称),输入函数的名称。

6.    选择 Runtime(运行时),然后选择 Python 3.7

7.    展开 Change default execution role(更改默认的执行角色)。

8.    对于 Execution role(执行角色),选择Create a new role from AWS policy templates(从 AWS 策略模板创建新的角色)。

9.    对于 Role name(角色名称),输入您的角色。

10.   对于 Policy template(策略模板),选择 Amazon SNS publish policy(Amazon SNS 发布策略)。

11.    选择 Create function(创建函数)。

12.    创建函数后,在 Code source(代码源)部分粘贴以下代码:

import json
import boto3
sns = boto3.client('sns')
def lambda_handler(event, context):
    finding = event["detail"]["findings"][0] 
    findingTime = finding["FirstObservedAt"]
    findingType = finding["Types"][0]
    complianceStatus = finding["Compliance"]["Status"]    
    region = event["region"]
    accountId = finding["AwsAccountId"]    
    findingDescription = finding["Description"]
    severity = finding["Severity"]["Label"]    
    remediation = finding["Remediation"]["Recommendation"]["Text"]
    remediationUrl = finding["Remediation"]["Recommendation"]["Url"]
   
 message = "AWS SecurityHub alert in %s for account: %s\n\nFinding regarding: [%s] %s\n Severity: %s\nDescription: %s\nFirst observed at: %s\n%s: %s" % (region, accountId, complianceStatus, findingType, 
severity, findingDescription, findingTime, remediation, remediationUrl)
    response = sns.publish(
            TopicArn = "arn:aws:sns:REGION:ACCOUNT_ID:SendFindingsTopic",
            Message = message
            )
    return {
      'statusCode': 200,
      'body': json.dumps('Success!')
}

注意:上述代码会对提醒消息进行自定义和重新格式化。使用您的主题 ARN 替换 TopicArn ("arn:aws:sns:REGION:ACCOUNT_ID:SendFindingsTopic")。

13.    要保存函数代码,选择 Deploy(部署)。

添加 EventBridge 作为您的 Lambda 函数的触发器

1.    在 Function overview(函数概述)部分,选择 Add trigger(添加触发器)。

2.    对于 Trigger configuration(触发器配置),选择 EventBridge (CloudWatch Events)

3.    对于 Rule(规则),选择 Existing rules(现有规则)。

4.    对于 Existing rules(现有规则),选择您之前创建的 CloudWatch Events 规则。

5.    选择 Add(添加)。

编辑 CloudWatch Events 规则

1.    打开 CloudWatch 控制台

2.    在导航窗格的 Events(事件)部分,选择 Rules(规则)。

3.    在规则列表中,选择您之前创建的 CloudWatch Events 规则。

4.    选择 Actions(操作),然后选择 Edit(编辑)。

5.    在 Targets(目标)部分,从您的主题移除 SNS 目标。

6.    选择 Configure details(配置详细信息)。

7.    选择 Update rule(更新规则)。

在测试规则时,您会收到类似于以下内容的通知:

AWS SecurityHub alert in us-east-1 for account: 111122223333(在 us-east-1 中针对账户的 AWS SecurityHub 提醒:111122223333)
Finding regarding: [FAILED] Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark(发现结果关于:[失败] 软件和配置检查/行业和监管标准/CIS AWS 基金会基准)
Severity: LOW(严重性:低)
Description: The "root" account has unrestricted access to all resources in the AWS account.(“root” 账户可无限制访问 AWS 账户中的全部资源。)It is highly recommended that the use of this account be avoided.(我们强烈建议避免使用此账户。)
First observed at: 2020-10-22T10:18:10.991Z(首次观察到的时间:2020-10-22T10:18:10.991Z)
For directions on how to fix this issue, please consult the AWS Security Hub CIS documentation.: SampleURL(如需关于如何解决此问题的指导,请参阅 AWS Security Hub CIS 文档:SampleURL)
--
如果您希望停止接收来自该主题的通知,请单击或访问下面的链接取消订阅:
取消订阅


请勿直接回复此电子邮件。如果您对此电子邮件有任何疑问或意见,请联系我们:https://aws.amazon.com/support。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?