【问题标题】:My AS3 Bucket Policy only applies to some Objects我的 AS3 存储桶策略仅适用于某些对象
【发布时间】:2020-04-22 10:22:37
【问题描述】:

我很难设置我的存储桶策略,看起来我的存储桶策略只适用于我的存储桶中的某些对象。

我想要的非常简单:我将视频文件存储在存储桶中,并且我希望它们可以从我的网站专门下载。

我的做法是默认屏蔽一切,然后添加允许规则:

  • 向 root 和 Alice 用户授予完全权限。
  • 只允许特定引用者(我的网站)公开访问我存储桶中的文件。

注意: 我手动将所有对象设为“公共”,并且我的“阻止公共访问”设置都设置为“关闭”。

任何人都可以在我的存储桶策略中看到任何明显的错误吗? 我不明白为什么我的政策似乎只适用于某些文件。 非常感谢

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::MY_BUCKET/*",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "https://mywebsite1.com/*",
                        "https://mywebsite2.com/*"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::MY_BUCKET/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "https://mywebsite1.com/*",
                        "https://mywebsite2.com/*"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::426873019732:root",
                    "arn:aws:iam::426873019732:user/alice"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::MY_BUCKET",
                "arn:aws:s3:::MY_BUCKET/*"
            ]
        }
    ]
}

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-iam


    【解决方案1】:

    通过aws:Referer 控制访问并不安全。它可以很容易地克服。 simple web search 将提供许多可以实现此目的的工具。

    更安全的方法是:

    • 将您的 Amazon S3 存储桶中的所有对象保持私有(不要“公开”)
    • 不要使用存储桶策略
    • 用户应对您的应用程序进行身份验证
    • 当用户希望访问其中一个视频时,或者当您的应用程序创建引用/嵌入视频的 HTML 页面时,应用程序应确定用户是否有权访问该对象。
    • 如果用户有权访问该对象,应用程序会创建一个 Amazon S3 预签名 URL,它提供对私有对象的限时访问
    • 当用户的浏览器请求通过预签名 URL 检索对象时,Amazon S3 将验证 URL 的内容。如果 URL 有效且时间限制未过期,Amazon S3 将返回对象(例如视频)。如果时间已过,内容将提供。

    预签名 URL 可以在几行代码中创建,不需要 API 回调到 Amazon S3。

    使用预签名 URL 的好处是您的应用程序决定谁有权查看对象。例如,用户可以选择与其他用户分享视频。您的应用程序将允许其他用户查看此共享视频。它不需要对 IAM 或存储桶策略进行任何更改。

    见:Amazon S3 pre-signed URLs

    此外,如果您希望向特定 IAM 用户(即组织内的用户,而不是应用程序用户)授予对 Amazon S3 存储桶的访问权限,最好在IAM 用户,而不是通过 Amazon S3 存储桶。如果有很多用户,您可以创建一个包含多个 IAM 用户的 IAM 组,然后将策略放在 IAM 组上。存储桶策略通常应用于向“所有人”而非特定 IAM 用户授予访问权限。

    一般而言,建议避免使用Deny 策略,因为它们可能难以正确编写,并且可能会无意中拒绝您的管理员人员访问。最好限制允许的内容,而不是必须结合允许和拒绝。

    【讨论】:

    • 非常感谢您的深入解释。我查看了您建议的预签名 URL 系统,您说得对,这是一种更专业的做法。但是我觉得设置起来真的很困难。而使用“aws:Referer”可以快速实施,并且可以劝阻大多数人尝试访问内容。
    • 我刚刚意识到我只是在我的网站上的 href 中被 rel="noopener noreferrer" 欺骗? 很抱歉,但感谢您的全面回答。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多