繁体   English   中英

如何限制 AWS API 网关对特定 CloudFront 分布或 Route53 子域的访问

[英]How to limit AWS API Gateway access to specific CloudFront distribution or Route53 subdomain

我有一个 API 网关 api 设置,我想限制访问。 我在 AWS Route 53 中有一个子域设置,它指向我的应用程序所在的 CloudFront 分配。 此应用程序向 API 发出 POST 请求。

我已经考虑根据示例“AWS API 白名单”为我的 api 添加资源策略,但我似乎无法获得正确的语法,我经常出错。

我还尝试创建一个 IAM 用户并使用 AWS_IAM auth 锁定 API 但随后我需要创建一个签名请求,这似乎需要通过资源策略来轻松得多的工作?

这是我尝试附加到 API 的资源策略示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity {{CloudFrontID}}"
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*/*/*"
            ]
        }
    ]
}

这将返回以下错误: Invalid policy document. Please check the policy syntax and ensure that Principals are valid. Invalid policy document. Please check the policy syntax and ensure that Principals are valid.

“AWS”:“arn:aws:iam::cloudfront:user/CloudFront 源访问身份 {{CloudFrontID}}”

这个概念的问题在于这是一个公共的 HTTP 请求。 除非它是一个签名请求,否则 AWS 不会知道任何 IAM 或 ARN 资源,它只知道它有一个标准的 HTTP 请求。 如果您使用 curl -v 命令发出请求,您将看到请求参数如下所示:


    GET
    /test/mappedcokerheaders
    HTTP/2
    Host: APIID.execute-api.REGION.amazonaws.com
    User-Agent: curl/7.61.1
    Accept: */*

您可以过滤用户代理,因为我确实看到了此处定义的条件。

I would check all of the values that are coming in the request from cloudfront vs the request from your curl directly to the API by trapping the api gw request id in the response headers, and looking for those in your API Gateway Access Logs. 不过,您必须启用访问日志,并定义要记录的参数,您可以在此处查看如何操作。

问题是 OAI 不能在CustomOrigin中使用。 如果您没有将User-Agent转发到 API 网关 CustomOrigin,那么最简单的方法是在 API 网关中添加一个资源策略,该策略只允许aws:UserAgent: "Amazon CloudFront"

注意: User-Agent很容易被欺骗。 这种方法旨在仅防止“正常访问”,例如 web 上的随机机器人试图抓取您的网站。

User-Agent header 保证是Amazon CloudFront 请参阅Request and Response Behavior for Custom Origins中的引用。

如果您未将 CloudFront 配置为基于 Header 值进行缓存时的行为:CloudFront 将此 header 字段的值替换Amazon CloudFront 如果您希望 CloudFront 根据用户使用的设备缓存您的内容,请参阅根据设备类型配置缓存。

完整资源策略如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-west-2:123456789012:abcdefghij/*/*/*",
            "Condition": {
                "StringEquals": {
                    "aws:UserAgent": "Amazon CloudFront"
                }
            }
        }
    ]
}

以下是如何在serverless.yml中配置它:

provider:
  resourcePolicy:
    - Effect: Allow
      Principal: "*"
      Action: execute-api:Invoke
      Resource:
        - execute-api:/*/*/*
      Condition:
        StringEquals:
          aws:UserAgent: "Amazon CloudFront"

我在 AWS Route 53 中有一个子域设置,它指向我的应用程序所在的 CloudFront 分配。 此应用程序向 API 发出 POST 请求。

我的理解是您有一个可以从 web 浏览器调用的公共服务( https://your-service.com

您希望服务仅在客户端浏览器位于https://your-site.com时响应。 例如,当浏览器在https://another-site.com上时,服务将不会响应

如果是这种情况,您将需要阅读有关 CORS的更多信息

This will not prevent a random guy / web client to go to and call your service directly to https://your-service.com however. 为了保护服务免受这种影响,您需要适当的身份验证系统

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM