【问题标题】:Restricting S3 bucket access to a VPC限制对 VPC 的 S3 存储桶访问
【发布时间】:2014-10-21 17:46:39
【问题描述】:

我正在尝试应用以下策略来限制 my_bucket 对特定 VPC 的访问。

当我尝试将此作为存储桶策略应用时,我得到一个 Policy has an invalid condition key - ec2:Vpc

我该如何纠正这个问题?

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Deny",
         "Principal": {
            "AWS": "*"
         },
         "Action": "*",
         "Resource": "arn:aws:s3:::my_bucket/*",
         "Condition":{
            "StringNotEquals": {
               "ec2:Vpc": "arn:aws:ec2:region:account:vpc/vpc-ccccccc"
            }
         }
      }
   ]
}

【问题讨论】:

  • vpc 不会发出请求……你使用的是 nat 服务器吗?

标签: amazon-web-services amazon-s3 policy


【解决方案1】:

我刚刚开始工作。我必须做两件事。 1)在 S3 存储桶上创建存储桶策略,2)创建“VPC 端点”

我的 S3 存储桶策略如下所示(当然要放入您的存储桶名称和 VPC 标识符):

{
    "Version": "2012-10-17",
    "Id": "Policy1234567890123",
    "Statement": [
        {
            "Sid": "Stmt1234567890123",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-12345678"
                }
            }
        }
    ]
}

S3 存储桶还具有存储桶策略之外的一些权限,以允许从 AWS 控制台进行访问。执行上述操作并没有提供访问权限。要获得访问权限,我还必须转到 AWS 控制台 -> VPC -> 端点,然后创建一个端点。我将新创建的端点附加到该帐户目前拥有的唯一路由策略(所有子网都附加到它),并且我使用了默认策略

{
    "Statement": [
        {
            "Action": "*",
            "Effect": "Allow",
            "Resource": "*",
            "Principal": "*"
        }
    ]
}

创建终端节点后,我只需使用 wget 和正确的 URL,就可以从我的 VPC 中的任何 EC2 实例中读取 S3 存储桶。我仍然可以从 AWS 控制台访问存储桶。但是,如果我尝试从 VPC 外部访问 URL,则会收到 403 禁止。因此,对 S3 存储桶的访问仅限于单个 VPC,就像您正在寻找的一样。

这显然是一个新功能。请参阅此AWS blog entry 了解更多信息。

【讨论】:

  • 这是否也适用于公共子网中的实例?
  • @Eleni:公共子网是什么意思?只要您的实例属于列出的 VPC,就足够了。我已经跨 AWS 账户进行了这项工作。也就是说,一个账户中的 S3 存储桶列出了另一个账户中的 VPC,并且它可以工作。
  • 谢谢伙计!写的很好,正是我需要的。愿你的牛排永远做得完美。
  • 据我所知,VPC 终端节点的一个挑战是它们仅适用于您所在地区的服务。这意味着 EU-Central 中的 VPC 无法通过 VPC 终端节点访问 Us-East 中的 s3 存储桶。具有挑战性。
  • 谢谢。有用。 AWS 应该真正简化其 S3 配置方法,而不是制作花哨的“新 S3 控制台”等等。在 Route 53 中,您可以轻松创建私有托管区域并将其与 VPC 关联,但在 S3 中,您需要编写隐秘的 JSON 来限制对 VPC 的访问......
【解决方案2】:

有两点让我很生气,可能有助于添加到 Eddie 的好答案中:

首先,您将无法在 S3 AWS 控制台中查看您的存储桶(甚至无法在您设置上述策略后修改其策略),除非您还授予 AWS 用户操作存储桶的权限。 为此,请找到您的 AWS 帐号(显示在右上角 here),并将此语句添加到存储桶策略语句列表中:

    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::YOUR_AWS_ACCOUNT_NUMBER:root"
        },
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::my_bucket",
            "arn:aws:s3:::my_bucket/*"
        ]
    },

其次,如果您有多个 VPC,例如要访问的 VPC-XXXXXX 和 vpc-YYYYYY,则需要将 Eddie 答案中的语句调整为以下内容(注意“允许”“StringEquals”和sourceVpc 值列表:

... 
"Effect": "Allow",
...
"Condition": {
    "StringEquals": {
        "aws:sourceVpc": [
            "vpc-XXXXXXXX",
            "vpc-YYYYYYYY"
        ]
    }

【讨论】:

    【解决方案3】:

    不,你不能那样做。

    这是另一个人问同样的问题:https://forums.aws.amazon.com/thread.jspa?threadID=102387

    有些人在尝试通过网络解决问题时变得过于有创意:https://pete.wtf/2012/05/01/how-to-setup-aws-s3-access-from-specific-ips/

    我更喜欢更简单的路线,S3 允许您签署 url 来解决这个问题,但在您的 VPC 内部,您可能希望不必考虑签名 - 或者您无法签名,例如您可能正在使用 wget 等。所以我为此编写了这个小微服务:https://github.com/rmmeans/S3-Private-Downloader

    希望有帮助!

    更新:

    AWS 现在有一个 VPC 端点功能:https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/,您应该使用它,而不是我之前建议的。

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 2019-04-13
      • 2015-11-02
      • 1970-01-01
      • 2019-06-12
      相关资源
      最近更新 更多