限制对特定对象的 S3 访问
Limit S3 access to specific object
限制对 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 中找不到类似的解决方案。
感谢您的帮助。
为此,您应该使用 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
我会按照之前的建议使用 pre-signed URLs。同样在您的代码示例中,您说它接近您正在寻找的内容,但我知道 url_for 无论如何都会生成 pre-signed 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/*"
]
}
]
}
您还可以使用条件添加时间限制。我从下面提到的来源中举了一个例子:
"Condition" : {
"DateGreaterThan" : {
"aws:CurrentTime" : "2013-08-16T12:00:00Z"
},
"DateLessThan": {
"aws:CurrentTime" : "2013-08-16T15:00:00Z"
}
}
参考:IAM Policy Elements Reference
因此结合这些,您可以在 IAM-user 的基础上限制对同一存储桶中特定对象的访问,并根据日期和时间进一步限制。
希望对您有所帮助。
限制对 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 中找不到类似的解决方案。
感谢您的帮助。
为此,您应该使用 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
我会按照之前的建议使用 pre-signed URLs。同样在您的代码示例中,您说它接近您正在寻找的内容,但我知道 url_for 无论如何都会生成 pre-signed 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/*"
]
}
]
}
您还可以使用条件添加时间限制。我从下面提到的来源中举了一个例子:
"Condition" : {
"DateGreaterThan" : {
"aws:CurrentTime" : "2013-08-16T12:00:00Z"
},
"DateLessThan": {
"aws:CurrentTime" : "2013-08-16T15:00:00Z"
}
}
参考:IAM Policy Elements Reference
因此结合这些,您可以在 IAM-user 的基础上限制对同一存储桶中特定对象的访问,并根据日期和时间进一步限制。
希望对您有所帮助。