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

vda*_*bry 12 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/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助

Ste*_*pel 13

这是由各自引起评估逻辑的的访问策略语言与用于铲斗政策:

评估时的目标是决定是允许还是拒绝给定的请求.评估逻辑遵循几个基本规则:

  • 默认情况下,所有使用您资源的请求都会被拒绝

  • 允许覆盖任何默认拒绝

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

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

[强调我的]

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

所以你Deny "*"压倒了你的Allow "arn:aws:iam::6527...3775:root".如上面链接的流程图所示,您可以通过删除显式拒绝来支持默认拒绝(请注意一起使用ACL和存储桶策略时可能存在的细微差别,这似乎不适用于您用例虽然).

  • 尽管它有很多upvotes但它不起作用,因为单个对象具有公共读取的对象ACL,因此默认拒绝被对象ACL覆盖.似乎我们需要一种方法来明确拒绝通过存储桶策略访问除了应该具有访问权限的主体之外的任何人.遇到同样的问题,我还没有找到一种方法来设置存储桶策略来实现这一目标. (2认同)

Jef*_*ger 6

您使用的策略不起作用,因为拒绝优先于允许,因此拒绝所有用户访问.执行此操作的正确方法是使用NotPrincipalpolicy元素.它允许您将策略应用于除特定列表之外的所有原则.您的政策应该是:

{
    "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/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


vda*_*bry 2

好的,据我了解,如果我只设置允许我,那么默认情况下应该拒绝其他所有人。

我尝试设置该存储桶策略,但我的文件仍然可下载:只需从 URL 中删除访问密钥 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
Run Code Online (Sandbox Code Playgroud)

PS:关于信息,我尝试使用 Firefox S3 Organizer 或存储桶资源管理器更改所有文件 ACL,如果您有数十万个文件,它们都不起作用,它们只是冻结。

  • 我的需求非常简单:我的存储桶中的所有文件都必须是私有的,并且只能通过生成的访问 URL 进行访问。我没有设法通过政策获得这种行为,我没有在SO或亚马逊帮助论坛上找到答案,这是我发现实现这一目标的唯一方法。我知道这个解决方案不是最佳的,但我真的认为如果如此简单的事情实现起来如此复杂,那就有问题了...... (6认同)
  • 可悲的是,已经两年了,据我所知,问题仍然存在。我正在尝试使存储桶只能由我的应用程序访问(通过访问密钥),但我还没有找到方法。 (2认同)