限制对特定对象的S3访问

时间:2016-01-05 19:57:10

标签: amazon-web-services amazon-s3 aws-sdk

在S3上限制对象访问的标准程序是什么?

该对象使用服务器端加密。

我只希望用户能够访问特定对象(而不是桶中的所有对象),并且只能在有限的时间内访问,比如5分钟。

我考虑创建一个IAM帐户,但似乎用户可以访问存储桶中的每个对象。

我考虑过生成预先签名的网址,但无法确定谁拥有该网址。

我发现了这个:

s3 = AWS::S3.new(
  :access_key_id => 1234,
  :secret_access_key => abcd
)
object = s3.buckets['bucket'].objects['path/to/object']
object.url_for(:get, { :expires => 20.minutes.from_now, :secure => true}).to_s

接近我正在寻找的东西,但无法在.NET中找到类似的解决方案。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您应该使用pre signed urls来实现此目的。 这是标准示例

static IAmazonS3 s3Client;
s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)

GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest()
{
     BucketName = bucketName,
     Key = objectKey,
     Expires = DateTime.Now.AddMinutes(5)
};

string url = s3Client.GetPreSignedURL(request1);

了解更多信息pre signed url

答案 1 :(得分:0)

我之前建议使用预先签名的网址。同样在您的代码示例中,您说它接近您正在寻找的内容但我了解 url_for 无论如何都会生成预先签名的URL。要与IAM用户实现类似的结果,您可以使用存储桶策略。

例如,在下面的示例中,我创建了2个IAM用户(PolicyTest1和PolicyTest2)。它们都具有对同一存储桶的列表访问权限。 PolicyTest1只能将对象放在Folder1下,而PolicyTest2只能放置Folder2下的对象。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::xyz:user/PolicyTest1",
                    "arn:aws:iam::xyz:user/PolicyTest2"
                ]
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket"
            ]
        },      
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::xyz:user/PolicyTest1"
                ]
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket/Folder1/*"
            ]
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::xyz:user/PolicyTest2"
                ]
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket/Folder2/*"
            ]
        }       
    ]
}

参考:Bucket Policy Examples

您还可以使用条件添加时间限制。我从下面提到的来源中举了一个例子:

"Condition" :  {
      "DateGreaterThan" : {
         "aws:CurrentTime" : "2013-08-16T12:00:00Z"
       },
      "DateLessThan": {
         "aws:CurrentTime" : "2013-08-16T15:00:00Z"
       }
}

参考:IAM Policy Elements Reference

因此,结合这些,您可以基于IAM用户限制对同一存储桶中特定对象的访问,并根据日期和时间进一步限制。

希望这有帮助。