amazon-web-services - 使用 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:...
解决方案
可以这么说,这里的问题是什么,但很简单。诀窍是在相同的 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/*"
}
]
}
这就像一个魅力!
推荐阅读
- python - 从 Python 2 中的地址获取地理坐标
- cmake - 使用 Ninja Generator 为 Windows (clang-cl) 构建 CMake
- r - 我得到错误的季度值
- c# - Azure Functions App C# .NET 2.0 - 共享代码
- java - ORA-02292: 违反完整性约束 (xxx) - 找到子记录
- android - Google Play:从 Beta 版到正式版
- php - 使用 crontab vs daemon 执行 slave.php 文件
- reactjs - 使用 React 路由器 v4 在 react-boilerplate 中加载异步减速器和 sagas
- c# - 获取类的所需属性
- python - 我可以在当前 shell 中从 python 脚本运行 shell 命令吗