首页 > 解决方案 > 使用 AWS API Gateway 上的资源策略允许 IP 地址的特定 API 路径

问题描述

情景

我有一个 EC2 服务器,他们点击了 ' n ' 号和一组用户,他们通过 Internet 的 API命中了 ' m ' 个 API。仅对于那些“ n ”个 API,我只需要此 EC2 服务器即可访问它,而无需其他用户。

问题

在设置资源策略时,为了将 EC2 列入白名单以访问“ n ”个 API,其他“ m ”个 API 路径也受到限制。

描述

API 结构

请注意,所有请求都是对 n 的 GET。

/
|--m
   |--square GET
   |--triangle POST
   L--circle GET, POST
|--n
   |--red GET
   |--green GET
      |--trees GET
      L--pear GET
   L--blue GET

已创建资源策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:xx-direction-1:123456789101:abcdefghij/alpha/GET/m/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "100.200.100.200/32"
                }
            }
        }
    ]
}

当我通过 ' m ' 路径访问时curl,我收到与用户相同的 json,当它击中 ' n ' API 时。即。

{"message":"用户:匿名无权执行:execute-api:Invoke on resource:arn:aws:execute-api:...

标签: amazon-web-servicesamazon-ec2api-gateway

解决方案


可以这么说,这里的问题是什么,但很简单。诀窍是在相同的 API 路径上允许和拒绝,解决方案提醒我电子产品的 NAND 门和 NOR 门类型中使用的逻辑。

解决方案

第 1 步:如果 IP 地址不是我们需要的地址,则拒绝路径

请注意,如何Condition调用NotIpAddress.

{
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:xx-direction-1:123456789101:abcdefghij/alpha/GET/m/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "100.200.100.200/32"
                }
            }
        }

第 2 步:如果 IP 地址是我们需要的地址,则允许路径

改变Condition这里,这是我错过的。

{
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:xx-direction-1:123456789101:abcdefghij/alpha/GET/m/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "100.200.100.200/32"
                }
            }
        }

第三步:允许公共/用户访问根路径

没有提到 IP 地址条件,因为“公共”!

{
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-south-1:480833364711:q9omcoj8ba/alpha/GET/*"
        }

完整的资源策略如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:xx-direction-1:123456789101:abcdefghij/alpha/GET/m/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "100.200.100.200/32"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:xx-direction-1:123456789101:abcdefghij/alpha/GET/m/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "100.200.100.200/32"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-south-1:480833364711:q9omcoj8ba/alpha/GET/*"
        }
    ]
}

这就像一个魅力!


推荐阅读