发布于: Nov 30, 2022

【概要】借助 Amazon Security Hub,您可以更深入地了解 Amazon Web Services 环境的安全性与合规性状态。

由于能够与 CloudWatch Events 相集成,您可以使用 Security Hub 创建自定义操作,以将特定发现结果发送至票证、聊天系统、电子邮件或者自动修复程序中。此外,您也可以将这些自定义操作发送至自己的 Amazon Web Services 资源处,例如 Amazon Systems Manager OpsCenter、Amazon Lambda 或者 Amazon Kinesis,使您可以进行自己不久操作或者捕捉与特定发现相关的数据。

要深入了解这套架构,以及关于特定自定义操作的示例,请参阅如何将 Amazon Security Hub 自定义操作与 PagerDuty 相集成,以及如何在 Amazon Security hub 中启用自定义操作。

此外,Security Hub 还允许用户针对特定语言选择对应的 Amazon SDK 开发工具包,以便您可以自定义操作以编程方式解决发现的问题。下面,我们将演示如何使用 Amazon Lambda 以及适用于 Python 的 Amazon Web Services 开发工具包(Boto3)实现这一目标。在本示例中,我们将修复 Security Hub 在 CIS 检查 2.4 发现: “保证 CloudTrail 跟踪与 Amazon CloudWatch Logs 集成”。对于本演练,假设您具有必需的 Amazon IAM 权限才能与 Security Hub,CloudWatch Events,Lambda 和 Amazon CloudTrail 一起使用。

图一:使用自定义操作对数据流支持下的 Security Hub 发现结果进行修复

如图一所示:

  • 在 Security Hub 中生成针对 CIS 检查 2.4 的发现结果时,Security Hub 会根据我预先设计的自定义操作将结果发送至 CloudWatch Events。
  • CloudWatch Events 会将发现结果发送至目标的 Lambda 函数。
  • Lambda 函数使用 Python 脚本检查是否存在于 CIS check 2.4 生成的发现结果。如果有,则 Lambda 函数将识别受影响的 CloudTrail 路径,并通过 CloudWatch Logs 配置对该监视日志进行监控。

先决条件

  • 您必须为 Amazon CloudTrail 配置一个 IAM 角色,以确保其拥有必要权限将事件传递至 CloudWatch Logs 日志组。关于执行这项操作的更多详细信息,请参阅 Amazon CloudTrail 说明文档。在本示例中,我们将角色命名为 CloudTrail role。
  • 要部署 Lambda 函数,您必须配置 IAM 角色以承担 Lambda 函数。我将此角色称为 Lambda 执行角色。下面的示例策略包括您将为此示例分配的权限。请用在上一步中创建的 CloudTrail 角色替换。根据您的用例,您可以进一步限制此 IAM 策略以授予最小特权,这是建议的 IAM 最佳实践。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "cloudtrail:UpdateTrail",
                "iam:GetRole"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::012345678910:role/<CloudTrail_CloudWatchLogs_Role>"
        }
    ]
}     

解决方案部署

  • 在 Amazon Security Hub 中创建一项自定义操作,并将其与您为 Security Hub 发现结果配置的 CloudWatch Events 规则关联起来。请根据 Security Hub 用户指南中的相应说明,完成具体操作。
  • 创建一项 Lambda 函数,由其自动根据 CIS 2.4 结果自动修复:
    • 打开 Lambda Console,选择 Create function。
    • 在下一页面中,选择 Author from scratch。
    • 在 Basic information 部分,输入您的函数名称。在 Runtime 部分,选择 Python 3.7。

图二:更新基本信息以创建 Lambda 函数

    • 在 Permissions 之下,展开 Choose or create an execution role。
    • 在 Execution role 之下,选择下拉菜单并将设置变更为 Use an existing role。
    • 在 Existing role 之下,选择我们之前创建完成的 Lambda execution role,而后选择 Create function。

图三:更新基本信息与权限以创建 Lambda 函数

    • 删除默认函数代码并粘贴以下代码:
import json, boto3
        cloudtrail_client = boto3.client('cloudtrail')
        cloudwatchlogs_client = boto3.client('logs')
        iam_client = boto3.client('iam')
        
        role_details = iam_client.get_role(RoleName='<CloudTrail_CloudWatchLogs_Role>')
        
        def lambda_handler(event, context):
            # First off all, let us see if the JSON sent by CWE has any Security Hub findings.
            if 'detail' in event.keys() and 'findings' in event['detail'].keys() and len(event['detail']['findings']) > 0:
                print("There are some findings. Let's check them!")
                print("Number of findings: %i" % len(event['detail']['findings']))
        
                # Then we need to filter out the findings. In this code snippet, we'll handle only findings related to CloudTrail trails for integration with CloudWatch Logs.
                for finding in event['detail']['findings']:
                    if 'Title' in finding.keys():
                        if 'Ensure CloudTrail trails are integrated with CloudWatch Logs' in finding['Title']:
                            print("There's a CloudTrail-related finding. I can handle it!")
        
                            if 'Compliance' in finding.keys() and 'Status' in finding['Compliance'].keys():
                                print("Compliance Status: %s" % finding['Compliance']['Status'])
        
                                # We can skip compliant findings, and evaluate only the non-compliant ones.                        
                                if finding['Compliance']['Status'] == 'PASSED':
                                    continue
        
                                # For each non-compliant finding, we need to get specific pieces of information so as to create the correct log group and update the CloudTrail trail.                        
                                for resource in finding['Resources']:
                                    resource_id = resource['Id']
                                    cloudtrail_name = resource['Details']['Other']['name']
                                    loggroup_name = 'CloudTrail/' + cloudtrail_name
                                    print("ResourceId for the finding is %s" % resource_id)
                                    print("LogGroup name: %s" % loggroup_name)
        
                                    # At this point, we can create the log group using the name extracted from the finding.
                                    try:
                                        response_logs = cloudwatchlogs_client.create_log_group(logGroupName=loggroup_name)
                                    except Exception as e:
                                        print("Exception: %s" % str(e))
        
                                    # For updating the CloudTrail trail, we need to have the ARN of the log group. Let's retrieve it now.                            
                                    response_logsARN = cloudwatchlogs_client.describe_log_groups(logGroupNamePrefix = loggroup_name)
                                    print("LogGroup ARN: %s" % response_logsARN['logGroups'][0]['arn'])
                                    print("The role used by CloudTrail is: %s" % role_details['Role']['Arn'])
        
                                    # Finally, let's update the CloudTrail trail so that it sends logs to the new log group created.
                                    try:
                                        response_cloudtrail = cloudtrail_client.update_trail(
                                            Name=cloudtrail_name,
                                            CloudWatchLogsLogGroupArn = response_logsARN['logGroups'][0]['arn'],
                                            CloudWatchLogsRoleArn = role_details['Role']['Arn']
                                        )
                                    except Exception as e:
                                        print("Exception: %s" % str(e))
                        else:
                            print("Title: %s" % finding['Title'])
                            print("This type of finding cannot be handled by this function. Skipping it…")
                    else:
                        print("This finding doesn't have a title and so cannot be handled by this function. Skipping it…")
            else:
                print("There are no findings to remediate.")        
    • 在代码粘贴完成后,将<CloudTrail_CloudWatchLogs_Role>替换为您的 CloudTrail role,而后选择 Save 以保护您的 Lambda 函数。

图四:编辑 Lambda 代码,将对应部分替换为正确的 ClouTrail role

  • 前往 CloudWatch console,并在左侧的导航栏中选择 Rules。
    • 在 CloudWatch 规则列表中,选择您在步骤 1 中为本示例创建的规则。
    • 而后,在页面右上方选择 Actions,再选择 Edit。
    • 在 Step 1: Create rule 页面的 Targets 部分,选择 Lambda function 而后选择我们在步骤 2 中创建的 Lambda 函数。
    • 选择 Configure details。
    • 在 Step 2: Configure rule details 页面中,选择 Update rule。

图五:添加我们创建完成的 Lambda 函数,作为 CloudWatch 规则的目标

  • 现在配置正式完成,可以进行规则测试了。前往 Amazon Security Hub console,并在导航栏中选择 Compliance standards。
    • 接下来,选择 CIS Amazon Foundations。

图六:Security Hub 控制台中的合规性标准页面

    • 搜索规则 2.4 确保 CloudTrail trails are integrated with CloudWatch Logs 规则,并将其选中它。

图七:在 Security Hub 控制台中找到 CIS check 2.4

    • 如果您保留了默认的 Amazon Security Hub CIS checks(且与 Amazon Config 服务位于同一区域当中),且该区域中还没有配置 CloudTrail 跟踪以将事件传递至 CloudWatch Logs,则系统会提示低严重性发现且合规性状态显示为“Failed”。
    • 通过选择复选框并选择“Actions”按钮来选择失败的发现。
    • 最后,在下拉菜单中,选择您在步骤 1 中创建的自定义操作,将相关发现结果发送至 CloudWatch Events。CloudWatch Events 将发现结果发送至 Lambda 函数,您在步骤 3 中将其配置为该规则的目标。Lambda 函数将自动识别受影响的 CloudTrail 跟踪并为您配置 CloudWatch Logs 日志组。出于识别目的,日志组将与您的跟踪具有相同的名称。您可以修改代码以进一步满足您的需求。

注意:补救的资源的合规性状态可能会有所延迟。在启用 CIS Amazon Foundations Standard 之后,Security Hub 将在 2 小时之内运行检查。之后,检查每 12 个小时自动运行一次。

图八:在 Security Hub 控制台中针对 CIS check 2.4 生成的结果

 

安全中心“洞察力”是相关发现的集合,一个或多个安全中心过滤器已应用到这些相关结果。洞察力可以帮助您整理调查结果,并确定需要立即关注的安全风险。安全中心提供了几种托管(默认)的见解。您可以将它们用作获得新见解的模板,并根据您的用例进行修改。您可以将这些修改后的查询另存为新的自定义见解,以确保您的 Amazon Web Services 账户具有更大的可见性。请参阅文档,以获取有关如何创建自定义见解的分步说明。 

图九:创建 Security Hub 自定义洞见

 

Security Hub 为所有 Amazon Web Services 账户及区域提供为期 30 天的免费试用选项。您可以借此评估 Security Hub 的平均成本,评估能否适合利用此项服务监控环境中的威胁与合规性水平。您可以通过 Security Hub 控制台导航至 Settings(设置),染后选择 Usage(详见图十)。

图十:估算 Security Hub 使用成本

 

借助 Amazon Security Hub,您可以更深入地了解 Amazon Web Services 环境的安全性与合规性状态。使用此处各项 Security Hub 最佳实践,安全团队能够将更多精力投入到事件的修补与恢复当中,而不是化时间在事件检测与组织上。Security Hub 已经通过 HIPAA、ISO、PCI 以及 SOC 认证。

 

相关文章