AWS S3存储桶策略源IP无法正常工作

时间:2014-02-26 04:47:57

标签: amazon-s3 policy bucket

我一直在尝试所有可能的选择,但没有结果。我的Bucket Policy适用于aws:Referer,但它根本不能用Source Ip作为条件。

我的服务器托管EC2,我使用此格式的公共IP xxx.xxx.xxx.xxx/32(Public_Ip / 32)作为源Ip参数。

谁能告诉我我做错了什么?

目前我的政策如下

{
   "Version": "2008-10-17",
   "Id": "S3PolicyId1",
   "Statement": [
                {
                 "Sid": "IPDeny",
                 "Effect": "Deny",
                 "Principal": {
                               "AWS": "*"
                               },
                 "Action": "s3:*",
                 "Resource": "arn:aws:s3:::my_bucket/*",
                 "Condition": {
                               "NotIpAddress": {
                                                "aws:SourceIp": "xx.xx.xxx.xxx/32"
                                                }
                               }
               }
               ]
}

我阅读了所有示例和案例研究,但它似乎不允许基于源IP进行访问...

非常感谢!!!

2 个答案:

答案 0 :(得分:2)

虽然我不会不同意政策在可能的情况下优于IP地址,但接受的答案实际上并没有实现原始问题的目标。我需要这样做(我需要从非EC2的机器访问,因此没有策略)。

这是一项仅允许某个(或多个IP)访问存储桶对象的策略。这假设没有其他策略允许访问存储桶(默认情况下,存储桶不授予公共访问权限。)

此政策也不允许列名。只有当你知道你需要的对象的完整url时。如果您需要更多权限,只需将它们添加到Action位。

{
  "Id": "Policy123456789",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::mybucket/*",
      "Condition" : {
        "IpAddress" : {
          "aws:SourceIp": [
            "xx.xx.xx.xx/32"
          ]
        }
      } 
    } 
  ]
}

答案 1 :(得分:1)

从对问题评论的讨论来看,您的情况可以改写如下:

  

如何为特定的EC2实例提供对S3存储桶的完全访问权限,并拒绝其他所有来源的访问?

通常,最好的方法是创建 IAM角色并启动与该IAM角色关联的EC2实例。正如我要解释的那样,使用IAM角色来定义访问策略通常比指定源IP地址要好得多。

IAM角色

IAM或身份和访问管理是一种服务,可用于创建用户,组和角色,管理与这三种实体关联的访问策略,管理凭据等。

创建IAM角色后,您就可以在该角色“内”启动EC2实例。简单来说,这意味着EC2实例将继承与该角色关联的访问策略。请注意,在启动实例后,无法更改与实例关联的IAM角色。但是,您可以随时修改与IAM角色关联的访问策略。

IAM服务是免费的,当您将EC2实例与IAM角色相关联时,您不需要支付任何额外费用。

在你的情况下

在您的情况下,您应该做的是创建一个IAM角色以在EC2中使用并附加一个策略,该策略将提供您需要的权限,即,将“允许”它将需要的所有“s3:xxx”操作在特定资源上执行“arn:aws:s3 ::: my_bucket /*”。

然后启动具有此角色的新实例(在当前AWS管理控制台上,在EC2启动实例向导上,您在选择实例类型后立即执行此操作)。

临时证书

当您将IAM角色与EC2实例关联时,该实例可以获取一组临时AWS凭证(让我们关注结果和好处,而不是关注此过程的工作原理) )。如果您使用的是AWS CLI或任何AWS软件开发工具包,那么您根本就不指定任何凭据,CLI或SDK会发现它必须在某处查找临时凭证实例。

这样,您就不必使用硬编码凭据,也不必以某种方式将凭据注入实例。实例和CLI或SDK将为您管理此操作。作为额外的好处,您可以获得更高的安全性:凭据是临时的并自动轮换。

在你的情况下

如果您使用的是AWS CLI,则只需运行命令而无需指定任何凭据。您将被允许运行您在IAM角色访问策略中指定的API。例如,您可以将文件上传到该存储桶:

aws s3 cp my_file.txt s3://my_bucket/

如果您使用的是SDK,比如Java SDK,您可以通过创建客户端对象而不指定任何凭据来与S3交互:

AmazonS3 s3 = new AmazonS3Client(); // no credentials on the constructor!
s3.putObject("my_bucket", ........);

我希望这可以帮助您解决问题。如果您有任何其他相关问题,请发表评论,我将尝试在此答案中解决这些问题。