S3策略 - 公开写入但仅经过身份验证的读取

时间:2017-01-13 15:36:10

标签: amazon-web-services amazon-s3

我要做的是让(匿名)用户将文件共享到指定的存储桶。但是,它们不应该可以读取已经存在的文件(对于所有我甚至不关心它们自己提交的文件)。应该能够从存储桶中列出/获取对象的唯一帐户应该是存储桶拥有者。

这是我到目前为止所得到的:

{
"Version": "2012-10-17",
"Id": "PutOnlyPolicy",
"Statement": [
    {
        "Sid": "Allow_PublicPut",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
        ],
        "Resource": "arn:aws:s3:::myputbucket/*"
    },
    {
        "Sid": "Deny_Read",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::myputbucket/*"
    },
    {
        "Sid": "Allow_BucketOwnerRead",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::myAWSAccountID:root"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::myputbucket/*"
    }
]
}

以上策略使我能够将文件写入存储桶(例如,通过Android应用程序S3anywhere),但是我无法获取对象,即使是经过身份验证的帐户也无法获取。

你对我如何做到这一点有任何暗示吗?谢谢!

3 个答案:

答案 0 :(得分:2)

默认情况下,匿名用户无法读取存储桶内容。所以你的政策应该只有这些行:

{
   "Version": "2012-10-17",
   "Id": "PutOnlyPolicy",
   "Statement": [
   {
      "Sid": "Allow_PublicPut",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::myputbucket/*"
   }    
]
}

答案 1 :(得分:0)

策略中的deny语句优先于其他所有语句。默认是拒绝所有不被特别允许的内容,因此您应该只需删除deny语句,所有内容都将以您希望的方式工作。

答案 2 :(得分:0)

政策看起来不错,我想这个问题进入 Principal ,您可以查看它如何用于文档http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-bucket-user-policy-specifying-principal-intro.html。您可能应该使用 AccountNumber-WithoutHyphens