我在Amazon s3上使用CannedChannelList作为PublicRead上传了一些文件。请记住,只有此文件具有公共读取权限,而不是整个存储桶或文件夹。用户将能够使用给定的URL访问该文件。但是这里有一个安全问题,即用户可以操纵给定的URL来访问相同或不同文件夹中的其他文件。 在阅读该文件时,用户是否需要在点击该URL时发送一些身份验证密钥?如何让用户知道他们必须使用哪个身份验证密钥? 我已经阅读了有关IAM用户的内容,但这是用于上传文件等等。我只是想在使用URL读取数据时进行一些身份验证。
数据由单个管理员用户上传,但是,所有用户都将数据发送到我的服务器,我使用单个管理员用户上传S3上的所有数据。
这是我用于管理员用户的政策。
if(isBucketExist(bucketName)){
Statement allowPublicReadStatement = new Statement(Statement.Effect.Allow)
.withPrincipals(Principal.AllUsers)
.withActions(S3Actions.GetObject)
.withResources(new S3ObjectResource(bucketName, "*"));
Policy policy = new Policy()
.withStatements(allowPublicReadStatement
);
amazonS3.setBucketPolicy(bucketName, policy.toJson());
}
这是上传数据时的CannedChannelList
InitiateMultipartUploadRequest(bucketName, folderName).withCannedACL(CannedAccessControlList.PublicRead);
答案 0 :(得分:1)
您是否尝试在IAM策略上使用“s3:GetObject”操作,然后您可以指定资源arn,例如“arn:aws:s3 ::: examplebucket / *”或您希望用户拥有的任何特定前缀读访问权。
IAM政策的一个例子如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListingOfS3",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-name"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"folder/sub-folder/*"
]
}
}
},
{
"Sid": "AllowAllS3ActionsInFolder",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/folder/sub-folder/*"
]
}
]
}