Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 AWS S3存储桶策略源IP不工作_Amazon S3_Bucket - Fatal编程技术网

Amazon s3 AWS S3存储桶策略源IP不工作

Amazon s3 AWS S3存储桶策略源IP不工作,amazon-s3,bucket,Amazon S3,Bucket,我尝试了所有可能的选择,但没有结果。我的Bucket策略在aws:Referer上运行良好,但在以源Ip为条件的情况下根本不起作用 我的服务器由EC2托管,我使用这种格式的公共IP xxx.xxx.xxx/32(Public_IP/32)作为源IP参数 谁能告诉我我做错了什么 目前我的政策如下 { "Version": "2008-10-17", "Id": "S3PolicyId1", "Statement": [ {

我尝试了所有可能的选择,但没有结果。我的Bucket策略在aws:Referer上运行良好,但在以源Ip为条件的情况下根本不起作用

我的服务器由EC2托管,我使用这种格式的公共IP 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的访问


非常感谢

根据对该问题评论的讨论,您的情况可以重新表述如下:

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

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

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

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

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

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

然后使用此角色启动一个新实例(在当前AWS管理控制台上,在EC2启动实例向导中,您在选择实例类型后的第3步执行此操作)

临时证书 当您将IAM角色与EC2实例关联时,该实例能够获得一组临时AWS凭据(让我们关注结果和好处,而不是这个过程的工作方式)。如果您使用的是AWS CLI或任何AWS SDK,那么您根本不需要指定任何凭据,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", ........);

我希望这能帮助你解决你的问题。如果您有任何其他相关问题,请留下评论,我将尝试在这个答案上解决这些问题。

虽然我不反对政策比IP地址更好,但接受的答案实际上并没有达到原始问题的目标。我需要这样做(我需要从不是EC2的机器上访问,因此没有策略)

这里有一个只允许某个(或多个)IP访问bucket对象的策略。这假设没有其他策略允许访问bucket(默认情况下,bucket不允许公共访问)

此策略也不允许列出。只有当你知道你需要的对象的完整url。如果需要更多权限,只需将其添加到操作位

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

你想要达到的效果到底是什么?您是否希望特定EC2实例能够完全访问该bucket,而其他任何东西都无法访问该bucket?还是别的什么?ThanksHi@BrunoReis,是的,没错,我希望源Ip地址能够访问S3存储桶,而不是其他任何东西。让我更具体一点:您的要求听起来像“我希望这个特定的源Ip地址能够访问这个存储桶”,但如果我们将其重新表述为“我希望此特定EC2实例能够访问此存储桶”?请注意区别:您将源称为IP地址,我将源称为EC2实例。很抱歉这么坚持,但如果您的要求是“此EC2实例”而不是“此IP地址”,您可能会有一个更好、更安全的解决方案“.Yep,你是对的,是需要访问bucket的EC2实例。谢谢@bruno,这很有意义。我(新手)的错误是:)认为源IP地址是EC2实例的IP地址。在这种情况下,源Ip是客户机的Ip…如果使用我上面描述的方法(IAM角色),您甚至不需要指定Bucket策略。没有bucket策略的bucket是“私有”bucket,除非使用具有适当策略的凭据发出请求,否则所有访问都将被拒绝。在这种情况下,凭据将是IAM角色(临时)凭据,策略将是IAM角色策略。在这里不需要考虑IPs,只要你能避免考虑IPs,你就是在创建一个更“云友好”的架构:当你说“不允许列表”时。你的意思是它不支持使用CIDR集团的列表吗