如何将亚马逊S3存储桶策略设置为私人除了管理员以外的所有人?

时间:2012-03-07 16:33:17

标签: amazon-s3

我有一个桶,我意外地将数千个带ACL的文件上传到:public_read 除了生成的访问URL之外,我希望所有文件都不可用。

我尝试创建一个存储桶策略,拒绝所有人,并允许所有人。

它不起作用,即使使用生成的访问URL,也禁止所有文件:

  

http://s3.amazonaws.com/myBucket/myFile.pdf?AWSAccessKeyId=AKIAIZB2XTOJ6KYB5SCA&Expires=1331137308&Signature=zRfPOj4XFBrXhyqDZ5DpwJqsWs0%3D

{
    "Version": "2008-10-17",
    "Id": "Policy1331136935471",
    "Statement": [
        {
            "Sid": "Stmt1331136294179",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::myBucket/*"
        },
        {
            "Sid": "Stmt1331136364169",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::6527...3775:root"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myBucket/*"
        }
    ]
}

更新:
我在文档中找到了对默认拒绝的引用,但AWS Policy Generator只有2个值“允许”和“拒绝”是否有人有默认拒绝的语法?

感谢您的帮助

4 个答案:

答案 0 :(得分:13)

这是由与Evaluation Logic一起使用的The Access Policy Language的相应Bucket Policies引起的:

  

评估时的目标是决定是否给定请求   应该被允许或拒绝。评估逻辑遵循几个   基本规则:

     
      
  • 默认情况下,所有使用您资源的请求都来自任何人   你被拒绝

  •   
  • 允许覆盖任何默认拒绝

  •   
  • 显式拒绝会覆盖任何允许

  •   
  • 评估政策的顺序并不重要

  •   
     

[强调我的]

该页面还提供了一个有用的流程图和讨论[其]更详细地描述了如何做出决定

因此,Deny "*"会覆盖您的Allow "arn:aws:iam::6527...3775:root"。如上面链接的流程图所示,您可以通过删除显式拒绝来支持默认拒绝(请注意Using ACLs and Bucket Policies Together时可能存在的微妙之处,这似乎不适用于您的使用虽然如此)。

答案 1 :(得分:5)

您使用的策略无效,因为the deny takes precedence over the allow,因此拒绝所有用户访问。正确的方法是使用NotPrincipal策略元素。它允许您将策略应用于除特定列表之外的所有原则。您的政策应该是:

{
    "Version": "2008-10-17",
    "Id": "Policy1331136935471",
    "Statement": [
        {
            "Sid": "Stmt1331136294179",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::6527...3775:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::myBucket/*"
        },
        {
            "Sid": "Stmt1331136364169",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::6527...3775:root"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myBucket/*"
        }
    ]
}

请注意,我不认为允许实际上是必需的,因为您的帐户应该有权访问这些文件,因为它是默认情况下被授予访问权限的存储桶/对象所有者。虽然这取决于对象的ACL。

答案 2 :(得分:2)

好的,据我所知,如果我只允许我,那么默认情况下应该拒绝给其他人。

我尝试设置该存储桶策略,但我的文件仍可下载:只需从网址中删除访问密钥ID,例如:http://s3.amazonaws.com/myBucket/myFile.pdf

我的文件ACL仍然设置为:public-Read所以看起来确实我在存储桶策略和单个文件ACL之间存在冲突。

我放弃了通过存储桶策略将所有文件设为私有,如果有人需要在S3存储桶中创建大量文件,这是我最后写的rake任务:

  desc "Make all objects in S3 private"
  task :make_private  => :environment do
    require 'aws/s3'

    bucket_name = 'yourBucket'
    marker = ""

    AWS::S3::Base.establish_connection!(
      :access_key_id => "yourKey",
      :secret_access_key => "yourSecret"
    )

    #create the read-only by me policy
    owner_grant = ACL::Grant.new
    grantee = ACL::Grantee.new
    owner_grant.grantee = grantee
    owner_grant.permission = 'READ'
    grantee.type = "CanonicalUser"
    grantee.id = 'yourID'
    grantee.display_name = "yourName"


    # Iterate over all files inside bucket and apply the policy to each files
    loop do
      objects = Bucket.objects(bucket_name, :marker=>marker, :max_keys=>1000)

      marker = objects.last.key
      puts "new marker is \"#{marker}\""

      objects.each do |obj|
          policy = S3Object.acl(obj.key, bucket_name)
          policy.grants = [owner_grant]
          S3Object.acl(obj.key, bucket_name, policy)
      end
    end
  end

P.S:有关信息,我试图使用Firefox S3 Organizer或bucket explorer更改所有文件ACL,如果你有数十万个文件,它们都无法工作,它们只是冻结。

答案 3 :(得分:0)

现在更容易。

只需将 删除通过公共ACL授予的公共访问权限 设置为 True

enter image description here