亚马逊AWS官方博客

九项 AWS Security Hub 最佳实践

Original URL: https://aws.amazon.com/cn/blogs/security/nine-aws-security-hub-best-practices/

 

2020721: 更新了在您授权的各区域内启用Security Hub的相关建议。

AWS Security Hub 是一项安全与合规性服务,于2019年6月25日正式推出通用版本。Security Hub在各个区域的统一仪表板中为用户提供涵盖多个AWS账户的安全性与合规性状态的直观支持。通过此项服务,您可以监控各关键设置,保证AWS账户始终安全可靠,同时确保能够时刻关注环境中出现的各类变化、并有针对性地做出快速反应。

AWS Security Hub汇总,组织并按优先级排列受支持的AWS服务(在发布本文时为Amazon GuardDutyAmazon InspectorAmazon Macie)以及来自各种AWS合作伙伴安全解决方案的安全性结果。AWS Security Hub还使用服务链接的AWS Config规则以及其他分析技术,基于自动化,资源级和账户级配置以及合规性检查,生成自己的发现。这些检查有助于您使AWS账户符合行业标准和最佳实践,例如Internet安全中心(CIS)AWS Foundations标准

在本文中,我们将分享九项最佳实践,帮助您更高效地使用AWS Security Hub。

1.    使用AWS Labs脚本在各区域内的所有AWS账户中启用Security Hub,并为现有Amazon GuardDuty建立主/成员层次结构

最佳做法是,即使是在不经常使用的区域中,您也应持续监控所有AWS账户的所处区域是否存在未授权行为或配置错误。AWS已经建议用户使用监控服务(例如AWS Config与AWS CloudTrail)时执行此操作。我们建议您在已授权的每个区域中启用Security Hub,并使用服务控制策略(SCP)以保证无活动的其他区域中不存在任何操作,因此您无需在这些区域中启动Security Hub。

此外,您还可以邀请其他AWS账户启用Security Hub,并与您AWS账户共享发现结果。如果您发送的邀请被其他账户所有者的接受,则您的Security Hub账户将成为主账户,其他任何与之关联的Security Hub账户都将作为成员账户。接下来,来自主账户的用户将能够通过成员账户查看其Security Hub发现结果。

为了简化配置流程,您可以使用GitHub上提供的现成 AWS Labs脚本。此脚本将自动执行整个设置流程。在脚本的支持下,您可以在相关联的AWS账户列表中同时为所有账户启用及禁用AWS Security Hub,并将其批量添加为Security Hub成员。主账户负责发送邀请,其他所有成员账户都将自动接受邀请。要运行此脚本,您需要拥有各AWS账户ID,以及您希望指定为Security Hub成员的各AWS账户根邮件地址。(请注意,请仅与您信任的AWS账户共享根邮件地址与账户ID。)

在默认情况下,Security Hub主/成员关联将独立于您在Amazon GuardDuty或Amazon Macie当中建立的账户关联关系。如果GuardDuty或Macie中已经存在主/成员层次结构,您可以将其账户列表以CSV文件的格式导出,然后配合Security Hub脚本一起使用。例如,在GuardDuty当中,使用ListMembers API以导出AWS账户ID与全部成员账户的电子邮件,具体代码如下:

aws guardduty list-members –detector-id <Detector ID> –query “Members[].[AccountId, Email]” –output text | awk ‘{print $1 “,” $2}’

以上命令的输出结果,为您的GuardDuty成员账户ID及其相应的根邮件地址,每行一条并以逗号分隔,具体如下所示:

12345678910,abc@example.com
98765432101,xyz@example.com

2. 在所有AWS账户及区域中启用AWS Config,并保持启用AWS CIS Foundations安全基线标准检查功能

在任意区域内启用Security Hub时,默认情况下都会启用AWS CIS安全基线标准检查。我们建议您保持启用状态,它们是适用于所有AWS账户的重要安全措施。。

对于运行安全基线检查,Security Hub需要使用与服务链接的AWS Config规则实现。因此,请确保在部署Security Hub的所有账户及区域中都已启用AWS Config,并记录所有受支持资源,包括全局资源。这些服务链接的规则不会在AWS Config当中产生额外费用,所有使用成本皆通过Security Hub的费率标准体现。

3. 对不同类型的Security Hub用户,使用特定的托管IAM策略

您可以选择允许大规模用户访问Security Hub执行List与Read操作,这将允许他们及时获取安全发现结果。但请注意,您应该仅允许一小部分用户访问Security Hub执行Write操作,这样,将仅允许授权用户归档、处理或修复这些调查结果。

您可以使用AWS托管策略为您的员工授予他们所必需的权限。这些策略已经在您的账户中,并由AWS负责维护与更新。如果需要对Security Hub用户进行更细粒度授权,则建议您创建自己的客户托管策略。比较简单方式是导入现有AWS托管策略,在保证策略本身正确无误的前提下,针对当前环境进行自定义。

AWS根据各项操作的作用,将每种服务操作归为五个访问级别:List、Read、Write、Permissions management以及Tagging。要确定您分配给用户的IAM策略所应包含的访问级别,如果您可以通过从IAM Console中导航至Policies,而后选择任意AWS托管或客户托管策略。接下来,在Summary页面的Permissions选项卡下,选择Policy summary(详见图一)。关于访问级别分类的更多详细信息及示例,请参阅通过策略摘要了解访问级别

图一:AWSSecurityHubReadOnlyAccess AWS托管策略摘要

4. 使用标签实现访问控制与成本分配

SecurityHub::Hub 资源代表的是AWS账户中各区域所对应的AWS Security Hub服务实现。Security Hub允许您以标签的形式将元数据分配给SecurityHub::Hub资源。每个标签都以字符串形式存在,由用户定义的键与可选的键值组成,您可以更轻松识别并管理环境中的AWS资源。

您可以在SecurityHub::Hub资源上使用标签以控制访问权限。例如,您可以允许一组开发者IAM实体管理和更新只有相关标签的SecurityHub::Hub资源。通过这种方式,您既能够限制对生产SecurityHub::Hub资源的访问,同时允许开发人员在其开发环境中继续测试。

关于与Security Hub APIs一起使用基于标签条件的更多详细信息,请参阅在AWS Security Hub中使用条件键。请注意,当您使用基于标签的条件进行访问控制时,需要首先定义谁有权修改这些标签。

为了使分类和跟踪AWS成本变得更加容易,您还可以启用成本分配标签,这样可以对SecurityHub::Hub资源成本进行管理。AWS能够以CSV文件的形式生成成本分配报告,其中根据您活动标签对您的使用情况和成本进行分组。您也可以用标签表示业务分类(例如成本中心、应用程序名称或者项目环境等),来管理您的成本构成。

关于常用标签类别以及有效执行标记策略的更多详细信息,请参阅AWS标记策略

5. 集成并启用您的现有安全产品(目前支持34个集成,一会更多)

大量工具可以帮助您了解AWS账户的安全性和合规性,但这些工具通常会以不同格式生成自己的发现结果集。Security Hub将发现结果标准化。

借助Security Hub,可以使用标准的发现格式提取从集成提供商(第三方服务和AWS服务)生成的发现,从而无需安全团队转换数据。目前可以集成34种发现提供程序提供的结果,可通过Security Hub导入与导出结果。另外,PagerDuty、Splunk以及Slack等合作伙伴产品虽然无法生成结果,但可以从Security Hub接收发现结果。

如果需要将第三方合作伙伴产品添加至您的AWS环境,则可以通过Security Hub控制台的Integrations页面中选择Purchase链接,然后导航至AWS Marketplace。在购买完成之后,选择Configure链接以导航至分步操作说明,以安装产品并完成与Security Hub的集成配置。最后,选择Enable integration在您的账户中为该第三方提供程序创建产品订阅(详见图二)。

在启用订阅之后,资源策略将自动附加到该策略。资源策略定义了Security Hub接受和处理产品的发现所需的权限。您还可以通过API和CloudFormation启用订阅。

图二:将合作伙伴的调查结合与Security Hub相集成

6. 使用Amazon CloudWatch Events、AWS Systems Manager Automation文档以及AWS Step Functions建立自定义补救措施,以自动处理发现结果

Security Hub将自动将所有发现结果发送至Amazon CloudWatch Events。

通过允许您使用AWS Systems Manager Automation文档、OpsItems以及AWS Step Functions采取特定操作,这套集成方案将帮助您自动完成对各类威胁事件的响应。使用这些工具,您可以创建自己的事件处理计划,保证安全团队得以专注于增强AWS环境的整体安全性,而不是对当前的发现进行补救。

图三:创建一项CloudWatch Events规则,用于将符合匹配条件的Security Hub结果发送至特定目标

7. 创建自定义操作,将Security Hub的发现副本发送至AWS账户的内部或外部资源,从而为该发现启用其他可见性与修复选项

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

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

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

先决条件

  • 您必须为AWS CloudTrail配置一个IAM角色,以确保其拥有必要权限将事件传递至CloudWatch Logs日志组。关于执行这项操作的更多详细信息,请参阅AWS CloudTrail说明文档。在本示例中,我们将角色命名为CloudTrail role。
  • 要部署Lambda函数,您必须配置IAM角色以承担Lambda函数。我将此角色称为Lambda执行角色。下面的示例策略包括您将为此示例分配的权限。请用在上一步中创建的CloudTrail角色替换<CloudTrail_CloudWatchLogs_Role>。根据您的用例,您可以进一步限制此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>"
        }
    ]
}     

解决方案部署

  • 在AWS 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规则的目标

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

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

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

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

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

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

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

8. 使用默认“managed insights”作为模板自定义洞见,并使用它们对资源和发现进行优先排序以采取行动

安全中心“洞察力”是相关发现的集合,一个或多个安全中心过滤器已应用到这些相关结果。洞察力可以帮助您整理调查结果,并确定需要立即关注的安全风险。

安全中心提供了几种托管(默认)的见解。您可以将它们用作获得新见解的模板,并根据您的用例进行修改。您可以将这些修改后的查询另存为新的自定义见解,以确保您的AWS账户具有更大的可见性。请参阅文档,以获取有关如何创建自定义见解的分步说明。

图十二:创建Security Hub自定义洞见

9. 使用免费试用评估您的实际成本

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

图十三:估算Security Hub使用成本

总结

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

如果大家对本文有任何建议或反馈,请在下方评论区中与我们交流。如果您对本文有任何疑问,请在AWS Security Hub论坛上启动新线程,或与AWS支持团队联系。

希望获得关于AWS Security的更多新闻?请在 Twitter上关注我们。

 

本篇作者

David A. Smith

大卫·史密斯(David A. Smith )是加利福尼亚州卡尔斯巴德的赛默飞世尔(Thermo Fisher)科学公司的数据科学家。他与跨组织团队合作,设计、构建和部署自动化模型,以驱动客户智能并创造业务价值。他的兴趣包括 NLP、无服务器 ML 和区块链技术。工作之多,大卫喜欢攀岩,打网球,或游泳。

Ketan Srivastava

Ketan是AWS公司的云支持工程师。他热衷于在AWS平台之上为客户打造更卓越的解决方案,并努力在此期间学习更多专业知识。在工作之余,他热爱MOBA类游戏,也喜欢与妻子一同探访新环境。他拥有罗切斯特理工学院理学硕士学位。