服务
关于
CloudProse博客
安全和IAM

AWS S3权限以保护您的S3存储桶和对象

乔什·冯·绍姆堡精选
乔什·冯·绍姆堡 | 2017年11月24日

2017年11月24日星期五

考虑到过去一年中发生的许多S3违规事件,以及我在各个新闻媒体中看到的有关S3默认安全性的一些不准确信息,我认为揭露S3权限的某些复杂性将是有益的。在本文中,我将回顾用户可以访问S3中的S3对象(或整个对象桶)的所有各种方式,并概述复杂的S3权限模型。

了解S3权限

关于S3权限要记住的第一个关键点是 默认情况下,公众无法访问对象。不管你读什么 S3存储桶在默认情况下是受保护的,并且由于故意的人为错误或恶意行为而发生的任何S3数据泄露.

也就是说,在描述用户如何在S3中获得对对象的访问权时,有三个核心原则:

  1. 通过旧式对象或存储桶访问控制列表(ACL)
    或者,通过IAM服务,可以将其细分为两个子类别
  2. 通过用户权限(基于用户的IAM策略)
  3. 通过存储桶策略(基于资源的IAM策略)

首先,我将细分ACL。但是在此之前,需要澄清的另一个重要点是“访问存储桶”涉及许多不同类型的操作。对于ACL和IAM,都有针对存储桶本身的操作(CreateBucket,DeleteBucket,ListBucket,GetBucketPolicy等),以及针对对象的操作 表示存储区(ListObjects,GetObject,DeleteObject,GetObjectAcl等)。通过正确配置ACL或在IAM策略中指定适当的API动作,始终了解访问的目的是很重要的。最后,请记住 对API操作的最终授权是授予的所有权限的最小特权联合。这意味着,如果未附加任何权限,则授权决策始终默认为DENY,并且显式DENY始终会覆盖显式ALLOW。

使用ACL访问S3

2006年3月,AWS发布了首个公共服务,即简单存储服务或S3 — Internet存储,以每月低廉的成本提供了高度可靠的低延迟存储。当然,2006年没有IAM服务。没有IAM实体(例如用户或角色)的概念。没有可附加到存储桶的基于资源的策略(请参阅“使用基于资源的IAM策略访问S3”中的说明)。实际上,根本没有任何政策!开发人员仅将其根访问密钥用于身份验证,现在您应该在创建AWS账户时将其删除。以及为什么在可以使用时在应用程序中完全使用访问密钥 服务角色?相反,S3与ACL一起发布,以控制对每个存储桶和对象的访问。在下图中,您可以控制对存储桶ACL的访问。如果四个权限中的任何一个都是公共的,则存储桶将标记为公共:

您还可以看到可以针对我自己的帐户以及其他AWS帐户调整这些ACL,然后还需要使用基于用户的策略为其IAM实体提供权限。单击存储桶中的对象时,您将看到相同的选项来控制每个对象的ACL(与通过存储桶ACL应用于存储桶中的所有对象相比)。注意 当对象ACL是公共的时,UI不会提供任何通知。仅当整个存储桶公开时才会显示此通知。也就是说,我们已经建立了对象ACL扫描解决方案,并已为许多客户实施了该解决方案。

最后,请记住,S3 ACL是旧系统。它们对于控制对单个对象的访问很有用,但是对于大多数所有用例,只有使用存储桶/ IAM策略才是正确的方法。

使用基于用户的IAM策略访问S3

大多数AWS用户都非常熟悉这种访问类型。使用自定义JSON策略将IAM用户权限授予S3存储桶,如下所示:

{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowBucketAccess" "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my_first_corporate_bucket/*", "arn:aws:s3:::my_second_corporate_bucket/*" ] }]}

或者,将托管的IAM策略附加到用户,例如AmazonS3FullAccess或AdministratorAccess。或者,可以将相同的策略附加到任何类型的IAM角色(例如,跨帐户角色或服务角色),以赋予对S3存储桶中的对象的特定资源访问权限。然后,该用户可以以编程方式(使用访问密钥)或通过Web GUI访问已定义的存储区或对象API。您会注意到,即使具有适当的权限,IAM用户也将无法导航到S3对象URL,因为单击该URL不会应用IAM用户的权限。用户当然可以通过GUI或访问密钥和API下载对象。为了使S3 URL提供对用户的访问权限,必须使用CLI(或SDK)生成一个预签名的URL,或者必须将该对象公开。

使用基于资源的IAM策略(或“ Bucket策略”)访问S3

在深入研究之前,重要的是要了解基于用户的IAM策略和基于资源的IAM策略之间的区别(不要与 资源级政策!)。基于用户的策略是您将应用于IAM实体(用户,角色,组)的标准策略类型;执行动作(或承担某个角色,然后执行动作)的IAM用户隐式是主体。一种 资源-based policy is very similar, except instead of identifying what a 预先defined IAM entity (or principal) can do, you actually identify the principal 内 the policy itself, and the 资源 (e.g., the S3 bucket, SQS queue, SNS topic, etc.) is 预先defined. That’s a mouthful; let’s look at an example:

<pre><code>{“版本”:“ 2012-10-17”,“声明”:[{“ Sid”:“允许”,“效果”:“允许”,“委托人”:{“ AWS”:[“ arn:aws: iam :: 111122223333:root“,” arn:aws:iam :: 444455556666:root“,” arn:aws:iam :: 777788889999:user / alice“]},” Action“:” s3:GetObject“,”资源“:” arn:aws:s3 ::: sharedbucket / *“}]}</code></pre>

如您所见,此处已添加一个新的IAM元素(主要)作为JSON密钥。在这种情况下,我为S3提供了对两个不同的AWS账户的访问权限(例如,它们可以是我拥有的账户,也可以是合作伙伴组织)。我还可以在帐户中定义特定用户。资源当然是“ sharedbucket”,这是基于资源的策略适用的存储桶。

对于基于用户的策略,主体已经被假定为该策略所附加的用户,因此没有必要包括(请参阅先前策略中缺少主体)。对于基于资源的策略,委托人可以是整个AWS账户(表示该AWS账户需要使用基于用户的策略向其IAM用户授予存储桶权限),也可以是另一个AWS账户中的单个用户。主体也可以是通配符(*),如下所示,它是 公开存储桶及其所有对象的另一种方法:

{ "Version":"2012-10-17", "Statement":[ { "Sid":"AddPerm", "Effect":"Allow", "Principal": "*", "Action":"s3:GetObject", "Resource":"arn:aws:s3:::examplebucket/*" } ]}

总之,有三种方法可以使对象公开:

  1. 通过对象ACL
  2. 通过存储桶ACL(然后将其应用到所有对象,其中DENY总是优先于ALLOW)
  3. 通过存储桶策略(然后将其应用到所有对象,其中拒绝始终总是优先于允许)

现在,我介绍了授予用户访问S3对象的不同方法,包括如何使它们完全公开。这是必须采取的非常刻意的行动,与您在新闻中可能听到的任何不存在的“ S3漏洞”绝对无关。寻找我们将来的帖子,它将确定保护S3存储桶的最佳方法。

如果您有任何疑问或意见,或希望Trek10对您的S3铲斗进行审核,请随时通过以下方式与我们联系 [email protected].

作者
乔什·冯·绍姆堡精选
乔什·冯·绍姆堡