【问题标题】:No Access to files in S3 from Centos7 website on EC2无法从 EC2 上的 Centos7 网站访问 S3 中的文件
【发布时间】:2020-12-11 10:32:24
【问题描述】:

第一次在这里使用 AWS S3。我整个星期都在试图解决这个问题,但我无法让我的 Django + NGINX 网站同时显示我的 CSS 和从 S3 上传的图像。我可能错过了一些东西,但我只是不知道。我已经查看了 thisthisthis,但仍然无法运行。

我的存储桶中有一个Bucket Policy和一个CORS Config,也许你可以看看。到目前为止我所拥有的:

  1. 我的网站只有在没有任何 CSS 或其他静态文件(如图片)的情况下才能正常工作
  2. CSS 和图像文件 URL 正确。它们都指向我的 S3 存储桶。
  3. 图片上传保存到S3没有问题
  4. 为了测试,从浏览器手动访问每个 CSS/图像会返回来自 S3 的标准 AccessDenied 页面
  5. 我的 IAM 角色将 AmazonS3FullAccess 策略应用于我的 EC2 实例
  6. 我的存储桶中阻止了所有公共访问

我的存储桶政策

出于测试目的,我创建了一个带有AmazonS3FullAccess 的用户以及角色。不确定是否有必要...

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<NUMBERS>:role/<MYEC2ROLE>",
                    "arn:aws:iam::<NUMBERS>:role/<MYUSER>",
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<MYBUCKET>",
                "arn:aws:s3:::<MYBUCKET>/*"
            ]
        }
    ]
}

我的 CORS 配置

我的直觉告诉我这是不需要的。或者我只是饿了……

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

还有什么我应该做的吗?我会继续阅读这方面的内容,也许会弄明白。

【问题讨论】:

    标签: django amazon-web-services amazon-s3 amazon-ec2


    【解决方案1】:

    如果您尝试在浏览器中访问提供的资源,则 IAM 角色不再适用,因为委托人是浏览器中的用户,而不是运行该站点的 EC2 主机。

    如果您不介意公众能够访问这些资源,那么您可以简单地扩展您的存储桶策略以授予 public s3:GetObject,如下所示。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": [
                        "arn:aws:iam::<NUMBERS>:role/<MYEC2ROLE>",
                        "arn:aws:iam::<NUMBERS>:role/<MYUSER>",
                    ]
                },
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::<MYBUCKET>",
                    "arn:aws:s3:::<MYBUCKET>/*"
                ]
            },
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": [
                    "arn:aws:s3:::<MYBUCKET>",
                    "arn:aws:s3:::<MYBUCKET>/*"
                ]
            }
        ]
    }
    

    但是,如果您想进一步锁定它,您可以采取多种选择。

    第一个是如果您想限制这些资产只能加载到您的网站上,而不是在任何安全墙后面(没有私人信息)。

    在这种情况下,您可以在 S3 存储桶前面使用 CloudFront distribution,并附加一个 AWS WAF。当 referer 标头不是您的域时,此 WAF 将简单地拒绝任何请求。

    如果有私人信息,你有两种方法:

    【讨论】:

    • 当我尝试编辑原始策略并将主体更改为 "*" 时,我收到拒绝访问错误。那是对的吗?我已经是帐户所有者了。
    • 您可能有导致此问题的 Block all public access 设置。如果您暂时禁用此功能,请进行更改,然后重新启用除“通过任何公共存储桶或访问点策略阻止对存储桶和对象的公共和跨账户访问”之外的所有设置:)
    • 克里斯,真的必须是"Principal": "*", 才能工作吗?您的解决方案有效(现在正在使用),但我只是对安全隐患感到好奇。
    • 所以这很好,对象应该可以访问(在我的示例中,我通过第二个语句限制了GetObject 操作)。如果这些对象不应该是公开可读的,那么我提出了一些建议:)
    猜你喜欢
    • 2015-08-13
    • 2021-02-02
    • 2023-04-04
    • 2018-05-05
    • 1970-01-01
    • 2017-10-03
    • 2020-07-31
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多