亚马逊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 允许从特定域访问?的主要内容,如果未能解决你的问题,请参考以下文章
从其他域(jquery ajax)访问托管在 aws ec2 上的 rest 服务但出现 CORS 错误