0

我有属于不同客户端的服务器 S3 存储桶。我在我的应用程序中使用 AWS SDK for PHP 将照片上传到 S3 存储桶。确切地说,我正在使用适用于 Laravel 4 的 AWS 开发工具包,但我认为问题不在于这个特定的实现。

问题是除非我给 AWS 用户我的服务器正在使用 FullS3Access,否则它不会将照片上传到存储桶。它会说拒绝访问!我首先尝试只授予对相关存储桶的完全访问权限,然后我意识到我应该添加列出所有存储桶的功能,因为这可能是 SDK 尝试做的以确认凭据但仍然没有运气。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::clientbucket"
            ]
        }
    ]
}

这个应用程序可以访问所有 S3 存储桶来工作,这对我来说是一个很大的安全问题。

4

1 回答 1

0

Jeremy 是对的,就我在这里看到的而言,它与权限相关,而不是特定于 SDK。您当然应该能够将您的 IAM 策略范围缩小到您需要的范围——我们经常在不同程度上限制对存储桶的访问,这只是正确制定策略的问题。

您可能想尝试在您的账户中使用AWS 策略模拟器。(该链接将带您进行概述,模拟器本身就在这里。)策略生成器在很多时候也很有帮助。

至于上面的具体政策,我认为您可以删除第二条语句并与最后一条(范围为您的特定存储桶的那个)合并可能会受益于一些 * 语句,因为这可能是导致问题的原因:

"Action": [
    "s3:Delete*",
    "s3:Get*",
    "s3:List*",
    "s3:Put*"
]

这基本上赋予了这个帐户超能力,但仅限于一个桶。

如果您为此应用程序/客户端使用专用实例,我还建议您创建一个 IAM 服务器角色。这将使未来的事情变得更加容易。

于 2015-05-27T16:37:37.293 回答