首页 文章

限制对特定对象的S3访问

提问于
浏览
-1

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

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

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

我研究了创建一个IAM帐户,但似乎用户可以访问存储桶中的每个对象 .

我考虑生成一个预先签名的URL,但没有办法告诉谁有该URL .

我找到了这个:

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

    我'd use pre-signed URLs as suggested before. Also in your code sample you said it'接近你正在寻找的东西,但我知道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用户的基础上访问同一存储桶中的特定对象,并根据日期和时间进一步限制 .

    希望这可以帮助 .

  • 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

相关问题