了解 S3 阻止公共访问

作者:安德鲁·加切克 | 2023 年 4 月

更新(2023 年 4 月 27 日): 亚马逊 S3 现在会自动启用 S3 封禁公共访问权限,并禁用所有 亚马逊云科技 区域中所有新 S3 存储桶的 S3 访问控制列表 (ACL)。


安全地存储数据是每个企业的关键原则。各公司在这一点和需要的时间和地点共享数据的需求之间取得了平衡。人类安全审查是帮助确保仅授予预期访问权限的强大工具。此外,如果加上自动护栏,它会更强大。大多数用例不需要特定类型的访问权限,即 “公共访问”,以至于大多数公司都希望自动检测并阻止它。

Amazon S3 封锁公共访问 可以帮助您确保您的 亚马逊简单存储服务 (Amazon S3) 存储桶不允许公共访问。默认情况下,新的存储桶、接入点和对象不允许公共访问。但是,用户可以修改存储桶策略、接入点策略或对象权限以允许公共访问。S3 封锁公共访问设置会覆盖这些策略和权限,因此您可以限制对这些资源的公共访问。

这可能让你想知道:“公开” 到底是什么意思?S3 封锁公共访问是如何运作的?在这篇文章中,我回答了这些问题,希望能阐明 S3 区块公共访问是如何帮助您保护您的 S3 存储桶免受公共访问的。

注意: 本月 早些时候 ,S3 Block Public Access 开始作为所有新存储分区的默认安全设置推出

什么是 “公开”,我们如何检查它?

2018 年,我们 推出了 S3 区块公共访问——一项新的单击安全功能,可防止公众访问您的 S3 存储桶。在构建 S3 区块公共访问时,我们必须弄清楚 “公开” 对 S3 存储桶策略意味着什么。为此,我们颠覆了这个概念,思考了什么使政策不公开。答案是 信任 。如果我们可以帮助您将政策限制为仅限于您可以信任的实体,那么该政策将是非公开的。

为了让 S3 一键封锁公共访问,我们会从您的 S3 存储桶策略中推断出您信任谁,而不是明确询问您。然后,我们会分析您的政策,看看它是否允许任何不信任的人访问。这听起来像是围成一圈,但关键在于,并不是你在政策中写的所有内容都可以单独信任。例如,你可以说你信任账户 111122223333。这是某人拥有和控制的东西。但是你真的不能说你信任所有名字叫 “安德鲁” 的人。世界上有太多的安德鲁斯无法做到这一点,没有人拥有或控制这个名字 “安德鲁”。信任他们所有人就是公共访问权限。你可以说你信任账户 111122223333 中的每个 “安德鲁”。但是,在那里,你的信任限度是基于账户,而不是名字。孤立地说,“名字” 根本不是一个值得信赖的概念。通过限制 我们认为可信的 内容 ,我们可以检测可能导致公众访问的政策。

以下是我们如何检查您的公共访问政策的摘要:

  1. 我们会检查您的政策,以找出您信任谁。
  2. 我们会检查您的政策,看看它是否允许除此之外的任何访问。

a. 如果是,那么我们说你的政策是公开的。如果您开启了 S3 阻止公共访问权限,那么我们会阻止整个策略更新。

b. 如果没有,那么一切都会照常运行。您不会注意到 S3 区块公共访问正在后台运行,从而保护您的存储桶免受公众访问。

将其付诸实践

现在,让我们通过一些示例来看看 S3 封锁公共访问是如何工作的。假设您有一个名为 DOC-EXAMPLE-BUCKET 的 S3 存储桶 已启 用 S3 封锁公共访问权限,并且想要附加新的存储桶策略。假设你写了以下政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalOrgID": "o-12345678"
        }
      }
    }
  ]
}

该政策向组织中的所有人授予访问权限 o-123 45678。这可能是成千上万的用户和角色分布在成千上万的账户中。这是否意味着它是公开的?不是。这不是计算潜在访问权限的人数的问题。这是关于推断信任并确保仅向这些实体授予访问权限。在这种情况下,我们推断您信任该组织 o-12345678 ,并检查是否允许在该组织之外进行任何访问。在这种情况下,没有额外的访问权限,因此该政策不公开。您可以安全地将此策略附加到您的存储桶。

接下来,假设你尝试将这个更复杂的策略附加到存储桶:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringEquals": {
          "aws:username": "Alice",
          "aws:PrincipalTag/department": "finance"
        },
        "StringLike": {
          "aws:PrincipalOrgID": "*"
        },
        "Bool": {
          "aws:MultiFactorAuthPresent": true,
          "aws:SecureTransport": true
        },
        "IpAddress": {
          "aws:VpcSourceIp": "10.20.30.40"
        }
      }
    }
  ]
}

这项政策有一大堆限制。来电者必须:

  • 一个名叫 爱丽丝 的用户 ,
  • 标有 depar tementequ al 等于财务,
  • 亚马逊云科技 组织 的一部分 ,
  • 使用双因素身份验证,
  • 使用安全 (https) 连接,以及
  • 来自他们呼叫的 VPC 中的 10.20.30.40 地址。

这是公共政策吗?是的。有很多限制,但没有一个是值得信赖的。考虑这个问题的一种方法是想象一个任意的人 John Q Public 想要访问这个存储桶。他可以在自己的账户 中创建名为 Alice 的用户,为该用户附加相应的 部门 标签,为其账户创建 亚马逊云科技 组织,启用双因素身份验证,并使用安全连接。最后,他可以创建自己的 VPC,将 IP 地址 10.20.30.40 分配给他的一个实例,然后从该实例发出请求。这项政策有许多限制,但是 John 可以控制所有限制。由于此存储桶已启用 S3 阻止公共访问,因此您无法将此策略附加到该存储桶。您必须缩小策略范围以删除公共访问权限,然后才能将其附加。

如果您想知道可以使用哪些条件密钥(例如 aws: SourceVPC 和 a ws: principalOrgid )来避免公共访问 ,请参阅 S3 封锁公共访问文档。 这些密钥代表可信实体,例如特定的网络、亚马逊云科技 Organizations、账户、角色或用户。我们不会根据过于宽泛的概念来推断信任,比如 “世界上所有的用户都叫 爱丽丝 ” 或 “任何有 部门 标签的人都等于 财务 ”。

最后,让我们看一下同时使用允许和拒绝语句的策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "* ",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotLike": {
          "aws:PrincipalOrgID": "o-12345678"
        }
      }
    }
  ]
}

该政策不公开。它最初可能看起来是公开的,因为它有一个允许所有人的访问权限。但是有一条拒绝声明剥夺了组织之外的任何访问权限 o-12345678。在这种情况下,我们推断您信任组织 o-12345678,我们会检查是否允许任何其他访问权限。此检查需要准确地弄清楚策略中所有允许语句和拒绝语句是如何相互作用的。为此,我们使用了自动推理,您可以在这篇 亚马逊云科技 Security博客文章 中详细了解自动推理 。基本思想是,我们通过使用变量而不是特定值来执行 所有 可能的请求。

结论

希望你现在能直观地了解公共访问的含义以及我们如何检查它。您知道,启用 S3 区块公共访问后,亚马逊云科技 将从您的策略中推断出您信任的人,然后检查是否只有那些可信的身份才有访问权限。

如果您想超出公开/非公开的范围,则可以使用 IAM Access Analyzer 来查看您的哪些存储桶(和其他资源)可以在账户或组织之外访问。如果您想详细了解S3区块公共访问算法的工作原理,那么我们有一篇 经过同行评审的研究论文 。提醒一下,S3 Block Public Access 在本月早些时候开始作为所有新存储分区的默认安全设置推出。如果你还没有,那么我强烈建议你也 为现有存储桶启用 S3 区块公共访问权限 。而且,如果它适用于你的用例,那么你可以为整个账户启用它。

Andrew Gacek

安德鲁·加切克

安德鲁·加塞克是 亚马逊云科技 身份领域的首席应用科学家。他帮助开发并启动了 S3 BPA 和 IAM 访问分析器。在 亚马逊云科技 工作五年之前,Andrew 曾在航空航天行业从事飞行控制系统的正式验证工作。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。