首页 文章

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

提问于
浏览
2

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

我的服务器使用EC2托管,我使用此格式的公共IP xxx.xxx.xxx.xxx/32(Public_Ip / 32)作为Source 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 回答

  • 1

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

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

    通常,最好的方法是创建 IAM Role 并启动与该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凭证(让's focus on the results and benefits, and not exactly on how this process works). If you are using the AWS CLI or any of the AWS SDKs, then you simply don' t指定任何凭据,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", ........);
    

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

  • 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"
              ]
            }
          } 
        } 
      ]
    }
    

相关问题