公共读取URL上的Amazon s3上的用户级权限

时间:2016-09-07 12:45:47

标签: amazon-web-services amazon-s3 permissions amazon bucket

我在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);

1 个答案:

答案 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/*"
        ]
    }
]
}