与AWS组织扩展安全服务

巴勃罗·维达尔Bouza2020年12月3日

Segment的云基础设施主要基于AWS。我们使用数十个帐户生产,舞台,开发,甚至采访工程师!我们相信,安全云计算的未来将是在AWS账户中隔离服务和工作流,但这也给我们的安全团队带来了一些挑战。今年早些时候,我们解决了使用多个AWS账户管理CloudTrail或GuardDuty等AWS服务的问题。当我们开始这个项目时,我们很难回答一些基本的问题,比如:

  • 我们在这个帐户上启用了CloudTrail吗?

  • 这个账户和这个地区的守卫值守在运行吗?

当我们仔细查看我们现有的CloudTrail和GuardDuty配置时,我们发现了以下问题:

  • 为DataPlane事件制作一个重复的CloudTrail Trail需要花费1万美元/月。

  • 有些CloudTrail trail是使用AWS控制台手动创建的,所以我们甚至不知道它们的存在。

  • 在新的AWS帐户上,默认情况下未启用GuardDuty,因此我们的事件响应团队在AWS组织中存在盲点。

考虑到这一点,我们开始思考我们可以做些什么来解决,并在一年后防止这些问题。在这篇文章中,我们将讨论我们以前的AWS安全服务配置,并解释我们现在如何使用AWS组织来减少维护工作,增加覆盖率,并在晚上睡得更好。

我们还将介绍Segment如何使用基础设施作为代码来配置和维护这些服务,并讨论一些我们必须处理的问题。

什么是作为代码的基础设施?

分部使用基础设施作为代码的方法来配置和维护我们的AWS基础设施。如果您不熟悉“基础架构即代码”的概念,那么它是一种允许您使用基于文本的配置文件管理基础架构的方法。这意味着你可以在Github这样的中央存储库中管理你的基础架构代码。

这种方法使基础设施部署易于重复,同时通过消除输入错误减少人为错误。因为配置位于版本控制的存储库中,所以如果出现错误,也可以很容易地回滚到以前的配置。它还可以帮助您通过自动化加速部署——您可以使用保存的配置文件在几秒钟内启动整个堆栈。

IaC是一个很好的基础方法,但它只能帮到你这么多。您仍然需要良好的组织、监视和警报,以确保您的基础设施是安全的。

背景:AWS组织和服务控制策略

AWS于2017年2月宣布AWS组织。这样做的目的是通过使用一个AWS账户来支付所有其他账户,从而使计费更加容易。

最初,Segment只使用组织的计费部分,但当我们将AWS账户作为代码导入到基础设施时,我们发现了AWS组织的一些额外好处。

组织单位:组织单元的概念非常简单,它只是对帐户进行分组的一种方式。您可以创建一个名为“生产”的组织单元,其中包含所有生产AWS帐户。组织单位最多可以嵌套5层。

服务控制策略:组织单位本身并没有带来任何实际的好处,除了“组织事物”。我们得到的真正好处是启用了服务控制策略。这些策略与IAM策略非常相似,但有一些额外的限制,我们将不在本文中介绍。服务控制策略或scp应用于组织单元,并应用于该组织单元中包含的AWS帐户。假设我们有一个这样的SCP:

data "aws_iam_policy_document" "scp" {statement {sid = "DenyS3BucketCreate" effect = "Deny" actions = [" s3:CreateBucket",] resources = ["*"]}}

如果该策略应用于某个OU,则将拒绝该OU内的任何AWS帐户创建S3桶的能力,而不管该帐户的IAM Role中的权限。即使是该帐户中的管理员也不能创建S3桶。

考虑到这一点,我们开始计划跨账户限制哪些AWS api,优先考虑那些在AWS账户被泄露后会让Segment面临风险的api。

我们采用了一些推荐的方法scp AWS提供,但我们也开发了适用于Segment特定基础设施配置的特定政策。

分部使用Terraform管理AWS账户、ou和scp。下面的示例显示了一个具有SCP的OU,其中我们(在其他操作中)拒绝访问AWS帐户Root用户,并阻止AWS帐户离开组织。

resource "aws_organizations_organizational_unit" "segment_engineering" {name = "Segment Engineering" parent_id = var.parent_id} resource "aws_organizations_policy_attachment" "engineering_scp" {policy_id = aws_organizations_policy.engineering_scp. engineering_unit " {policy_id = aws_organizations_policy.engineering_scp. engineering_unit " {name = "Segment Engineering" parent_id = var.parent_id}Id target_id = aws_organizations_organizational_unit.segment_engineering。“aws_organizations_policy”“engineering_scp”{id}资源名称=“engineering_scp”内容= < < EOF{“版本”:“2012-10-17”,“声明”:[{“Sid”:“DenyRootUser”,“效果”:“否认”、“行动”:“*”,“资源”:“*”,“条件”:{" StringLike ":{“aws: PrincipalArn”:“在攻击:aws:我::*:根 " } } }, { " 效应”:“否认”、“行动”:"organizations:LeaveOrganization", "Resource": "*"}]}

当我们添加一个新的AWS帐户时,我们使用一个terraform模块来指定新帐户所属的组织单位,如本例所示。

模块"segment_platform" {source = "。/accounts" account_name = "PlatformTeam" account_email = "email@email.com" parent_id = module.ou_production. account "Id标签= {type: "production" data_classification: "sensitive"}}

就是这样。由于所有帐户、组织单元和服务控制策略都在同一个Github存储库中,因此理解组织结构要容易得多。自服务控制策略是通过遗传父组织单位,我们有一组不同的服务为我们的生产控制策略,限制阶段,Dev账户,和所有人分享一个共同从他们的父母或者SCP,的工程或者一组否认适用于所有AWS帐户。

这种结构化方法有助于将新的AWS帐户添加到正确的OU,并根据其用例应用缺省限制。

过去的AWS CloudTrail

AWS CloudTrail是一个AWS服务,它可以记录您的AWS帐户中的所有管理和数据面操作。

使用Terraform来部署CloudTrail是个好主意,因为它对安全性至关重要。,我们希望确保所有帐户都有适当的CloudTrail覆盖,并且自动提供新的AWS帐户。

在CloudTrail for Organizations成为一个“东西”之前,我们会使用CloudTrail terrform模块,我们必须应用到每个新帐户:

resource "aws_cloudtrail" " managentevents " {name = "cloudtrail_example" s3_bucket_name = "-----------" enable_logging = true is_multi_region_trail = true}

新帐户登录到同一个S3桶,并且有自己的前缀,但是由于我们增加了AWS帐户的数量,很难确认所有的跟踪是否如预期的那样工作。我们还发现有时候会出现重复的路径,因为其中一条是在terraform模块之前手动创建的,然后被遗忘了。

过去的AWS守卫职责

AWS GuardDuty是一种AWS服务,基于CloudTrail、Flow Logs和DNS查询生成警报。

如果您有多个AWS帐户,您通常希望有一个主AWS帐户,该帐户接收来自组织中其他帐户的GuardDuty警报。但随着时间的推移,帐户数量的增加,这可能会很困难。

以下是我们必须通过的步骤,让多个账户向一个主要的GuardDuty部署报告:

首先,我们在main account上这样做:

  • 在每个区域创建一个守卫任务探测器。

  • 向其他帐户上的每个GuardDuty探测器发送邀请。因此,如果您有5个AWS帐户,则发送的邀请数为=

    地区数量*(帐号数量-主帐号)。16 * 4 = 64个邀请。

然后,关于次要帐户:

  • 在每个区域上创建一个检测器。

  • 接受每个邀请,开始向主帐户发送警报。

这个过程是一个手动的噩梦,而且不可扩展。我们的一名工程师使用Terraform自动化了创建守卫任务探测器的过程,并从主帐户向每个探测器发送邀请。每次添加一个帐号时,我们仍然需要运行Terraform模块,我们也仍然需要登录每个帐号接受每个邀请。即使基础设施是代码,这也不是一个很好的体验。

由于这种配置是静态的,检测器不太可能随着时间的推移而改变,这使您想知道使用Terraform进行所有设置的好处。这些类型的服务只需要设置一次,然后您就可以忘记它们。重要的是要知道服务没有被修改,并且仍然是启用的。如果我们可以设置服务,然后应用服务控制策略来拒绝对这些资源的写访问,我们就可以确保这些服务一直在运行。

AWS GuardDuty现在

2020年4月,AWS推出了组织卫士任务(GuardDuty for Organizations),简化了对所有AWS账户的威胁检测。

当您启用此AWS组织特性时,每当在您的组织中提供一个新帐户时,AWS会自动为该帐户创建一个GuardDuty检测器。

资源“aws_guardduty_detector”“us-east-1”{provider = aws. exe”。sec-us-east-1 enable = true finding_publishing_frequency = "FIFTEEN_MINUTES"} resource "aws_guardduty_detector" "us- us-east-2" {provider = aws。sec-us-east-2 enable = true finding_publishing_frequency = "FIFTEEN_MINUTES"}

通过这个更改,我们可以简化配置。现在,我们在Terraform保存的唯一的探测器是我们委托的守卫任务管理员帐户上使用的。我们在所有区域创建探测器并开启自动启用,这样我们AWS组织中的任何新AWS账户都会自动到达并设置和工作的GuardDuty。

所有AWS帐户都有由主帐户管理的GuardDuty检测器,因此不可能挂起它们。因此要确保这些资源不会被帐户管理员或最终攻击者修改。

变焦和保证金

在此基础上,我们使用服务控制策略来限制GuardDuty上允许的写操作。

AWS CloudTrail现在

AWS于2019年11月发布了面向组织的CloudTrail。

与GuardDuty组织类似,有了CloudTrail组织,您不再需要管理子帐户的单个实例。

在主帐户上启用CloudTrail for Organizations后,您可以创建一个CloudTrail Trail设置为Organization Trail:

资源”aws_cloudtrail”“org-trail”{depends_on =(“aws_s3_bucket_policy.org_cloudtrail_policy”)name = " org-trail " s3_bucket_name = " $ {aws_s3_bucket.org_cloudtrail_logs.id} " include_global_service_events = true is_multi_region_trail = true enable_logging = true enable_log_file_validation = true is_organization_trail = true}

要覆盖整个组织中数据存储上的数据平面事件,您可以创建一个Trail来覆盖它们:

资源”aws_cloudtrail”“org-data-plain-trail”{depends_on =(“aws_s3_bucket_policy.org_cloudtrail_data_plane_policy”)name = " org-data-plane-trail " s3_bucket_name = " $ {aws_s3_bucket.org_cloudtrail_data_plane_logs.id} " include_global_service_events = false is_multi_region_trail = false enable_logging = true enable_log_file_validation = trueis_organization_trail = true event_selector {read_write_type = "All" include_management_events = false data_resource {type = "AWS::S3::Object" #如果你想监视桶中的所有对象,请确保在ARN中添加一个尾随/。Values = ["arn:aws:s3:::super secret-s3-bucket",]}}

有了这个配置,我们不再需要担心管理单独的路径或者在新帐户上配置路径。所有新帐户都自动启用CloudTrail,并配置为与您的组织路径相同的值。

与GuardDuty类似,CloudTrail在孩子账户上的踪迹不能被修改,从而确保覆盖整个组织。

结论

我们建议您使用AWS组织并启用这些功能。这种方法改善了您的安全状况,并节省了工程时间,因为您不再需要在AWS GuardDuty、AWS CloudTrail上做维护工作,也不再需要使用服务控制策略来进一步限制您帐户内的服务。

对于分部的我们来说,我们将继续在服务控制政策上进行迭代,以确保我们对新的AWS帐户实施“最少特权”的方法,并专注于限制每个AWS帐户可用的AWS服务的数量。

到2030年,你的技术堆栈会是什么样子?

在我们的新报告中,我们调查了超过4000名客户数据决策者,以衡量客户数据行业当前和未万博官方购彩来的预测。

成为一名数据专家。

获取所有有关数据、产品和增长的最新文章,直接发送到您的收件箱。