亚马逊AWS |如何让 CORS 允许从特定域访问?

Posted

技术标签:

【中文标题】亚马逊AWS |如何让 CORS 允许从特定域访问?【英文标题】:AWS | How to have CORS allow access from specific domain? 【发布时间】: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 调用以返回数据。实际:没有返回任何内容(呼叫挂起)

【问题讨论】:

【参考方案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 存储桶的服务器端点。

以上是关于亚马逊AWS |如何让 CORS 允许从特定域访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CORS 限制 AWS S3 访问?

从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误

如何在ASP NET Core中实现CORS跨域

在安全方面,允许特定域的 CORS 是不是有意义?

nginx、aws 和 cloudflare 的 cors 问题

使用Azure功能启用CORS通配符子域