【问题标题】:AWS | How to have CORS allow access from specific domain?亚马逊AWS |如何让 CORS 允许从特定域访问?
【发布时间】:2020-11-30 16:08:18
【问题描述】:

我正在尝试通过特定 IP 和域锁定对我的 Elastic Beanstalk / EC2 AWS 服务器的入站调用

示例 - 允许访问:

  • IP:123.456.789、234.567.890
  • 域:http://localhost:8080(来自本地 Angular Web 应用)

我正在使用安全组成功地将 IP 列入白名单。阅读 AWS 文档后,CORS 似乎是我允许域访问的解决方案,但我遇到了问题。该链接指示将 XML 写入 S3 存储桶中的 CORS 配置。我的看起来像这样:

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

这是我的预期/实际情况/结果:

  • 如果 IP 不在白名单安全组中但域在 CORS XML 中:'http://localhost:8080' - 预期:GET 调用以返回数据。实际:没有返回任何内容(呼叫挂起)

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-ec2 cors amazon-elastic-beanstalk


    【解决方案1】:

    如果您尝试将 S3 存储桶访问限制为特定 IP 地址,则需要创建一个包含 IP 地址条件的存储桶策略。如果您允许的 IP 地址属于 EC2,您应该创建一个 IAM 角色,将其附加到 EC2,并将存储桶限制为角色 ARN。这提供了更好的整体安全性,如果您没有关联的弹性 IP 并且服务器因任何原因出现故障,您的 EC2 IP 地址将会更改。

    基于特定 IP taken from the documentation 限制访问的存储桶策略示例如下:

    {
      "Version": "2012-10-17",
      "Id": "S3PolicyId1",
      "Statement": [
        {
          "Sid": "IPAllow",
          "Effect": "Deny",
          "Principal": "*",
          "Action": "s3:*",
          "Resource": [
             "arn:aws:s3:::awsexamplebucket1",
             "arn:aws:s3:::awsexamplebucket1/*"
          ],
          "Condition": {
             "NotIpAddress": {
                "aws:SourceIp": [
                    "123.456.789/32",
                    "234.567.890/32"
              ]
            }
          }
        }
      ]
    }
    

    这将拒绝对与给定 IP 列表不匹配的任何 IP 的所有访问,并允许这些特定 IP 对存储桶的所有访问(这不是一个好的做法)。

    如果您尝试限制 EC2 实例对存储桶的访问,您可能希望使用以下内容:

    {
      "Version": "2012-10-17",
      "Id": "S3PolicyId1",
      "Statement": [
        {
          "Sid": "RoleAllow",
          "Effect": "Deny",
          "Principal": "arn:aws:iam::*:role/service-role/role-name",
          "Action": "s3:*",
          "Resource": [
             "arn:aws:s3:::awsexamplebucket1",
             "arn:aws:s3:::awsexamplebucket1/*"
          ],
        }
      ]
    }
    

    您将使用角色的 ARN 修改 Principal 字段。您可以从控制台将角色附加到 EC2,方法是右键单击实例,转到 Instance Settings,然后单击 Attach/Replace IAM Role

    如果您尝试仅从您的计算机访问 S3 存储桶,请使用第一个存储桶并将您的 IP 地址替换为 IP 列表。

    编辑: 如 cmets 中所述,要限制 HTTP 引用者对 S3 的访问,您也可以使用存储桶策略来执行此操作。

    {
      "Version":"2012-10-17",
      "Id":"http referer policy example",
      "Statement":[
        {
          "Sid":"Allow get requests originating from www.example.com and example.com.",
          "Effect":"Allow",
          "Principal":"*",
          "Action":["s3:GetObject","s3:GetObjectVersion"],
          "Resource":"arn:aws:s3:::awsexamplebucket1/*",
          "Condition":{
            "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
          }
        }
      ]
    }
    

    这个例子是pulled directly from the documentation

    【讨论】:

    • 感谢@scrgrk 的帮助。这个解决方案会扩展到域还是仅扩展到 IP?我列入白名单的 IP 是开发人员机器,而域是托管站点。
    • 您可以在存储桶策略中使用 HTTP 引荐来源网址条件。我将使用该信息编辑帖子。
    • 将此标记为正确,因为它确实阻止/允许按域访问 S3 存储桶。将在新帖子中提出另一个问题,以阐明如何允许通过域访问访问不访问 S3 存储桶的服务器端点。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-12-21
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多