繁体   English   中英

限制S3存储桶对VPC的访问

[英]Restricting S3 bucket access to a VPC

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

  1. 当我尝试将此应用为存储桶策略时,我得到的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"
            }
         }
      }
   ]
}

我刚刚开始工作了。 我不得不做两件事。 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": "*"
        }
    ]
}

一旦我创建了端点,我就可以使用带有正确URL的wget从我的VPC中的任何EC2实例读取S3存储桶。 我仍然可以从AWS控制台访问存储桶。 但是如果我尝试从VPC外部访问URL,我会被禁止403。 因此,对S3存储桶的访问仅限于单个VPC,就像您要查找的那样。

这显然是一个新功能。 有关更多信息,请参阅此AWS博客条目

咬我的两件事可能有助于添加到Eddie的好答案:

首先, 除非您还授予AWS用户操作存储桶的权限,否则您将无法在S3 AWS控制台中查看存储桶(甚至在设置上述策略后修改其策略)。 要做到这一点,找到你的AWS帐号(显示在右上角点击这里 ),并添加此语句桶政策声明列表:

    {
        "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的答案中的语句需要调整为类似下面的内容(注意“Allow”“StringEquals”和sourceVpc列表值:

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

不,你做不到。

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

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

我更喜欢一个更简单的路线,S3允许你签署网址来解决这个问题,但是在你的VPC中你可能不希望考虑签名 - 或者你只是无法签名,例如你可能正在使用wget所以我写这个小微服务就是出于这个原因: https//github.com/rmmeans/S3-Private-Downloader

希望有所帮助!

更新:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM