Amazon web services 如何在仅允许特定角色访问的情况下拒绝对AWS API网关的公共访问?

Amazon web services 如何在仅允许特定角色访问的情况下拒绝对AWS API网关的公共访问?,amazon-web-services,aws-api-gateway,amazon-iam,Amazon Web Services,Aws Api Gateway,Amazon Iam,我想拒绝对AWS API网关的公共访问,并且仅在使用特定角色调用API时才允许访问。在我的测试中,有两个网关,一个调用另一个: Public Gateway -> Private Gateway 我希望能够在浏览器中访问公共网关端点并接收2XX响应,而直接访问私有网关时,我应该接收4XX响应。访问私有网关的唯一方法应该是通过公共网关(它通过每个端点代理私有网关) 我试过几种方法。所有这些都会导致公共网关错误日志显示以下内容: 用户:anonymous无权对资源执行:execute api

我想拒绝对AWS API网关的公共访问,并且仅在使用特定角色调用API时才允许访问。在我的测试中,有两个网关,一个调用另一个:

Public Gateway -> Private Gateway
我希望能够在浏览器中访问公共网关端点并接收2XX响应,而直接访问私有网关时,我应该接收4XX响应。访问私有网关的唯一方法应该是通过公共网关(它通过每个端点代理私有网关)

我试过几种方法。所有这些都会导致公共网关错误日志显示以下内容:

用户:anonymous无权对资源执行:execute api:Invoke:arn:aws:execute api:us-east-1:**********9012:abcd123456/dev/GET/products

该错误消息由公共网关接收,作为来自专用网关的响应

以下是我(分别)尝试过的策略:

我已经重新部署了每个资源策略更改,并在测试前等待了一分钟

该角色在公共网关的serverless.yml设置中分配:

service: test-gateway

provider:
  name: aws
  runtime: nodejs12.x
  apiGateway:
    shouldStartNameWithService: true
  role: arn:aws:iam::123456789012:role/test-apigateway-role
试试这个怎么样

根据,如果您没有指定明确的
拒绝
,然后提供一个特定的
允许
,它应该可以工作。如果没有,继续分享你的成果,我很感兴趣

更新:我删除了Deny
*
部分,这意味着对于
Allow
语句中未明确声明的请求,我们将得到隐式拒绝。这取决于会话策略(请参见文档链接)

更新2:检查此答案的评论,作者还提到-将
授权人:aws_iam
添加到serverless.yml

{
“版本”:“2012-10-17”,
“声明”:[
{
“效果”:“允许”,
“委托人”:{
“AWS”:[
“arn:aws:iam::123456789012:角色/测试网关角色”
]
},
“操作”:“执行api:Invoke”,
“资源”:[
“arn:aws:execute api:us-east-1:123456789012:abcd123456/*”
]
}
]
}

您是否尝试过将Allow语句中的
/*/*/*/*
替换为
/*
<代码>abcd123456/*/*/*是的。还是不行,谢谢!在插入此策略并重新部署时,我遇到了相同的错误:
User:anonymous无权执行:execute api:Invoke on resource:arn:aws:execute api:us-east-1:****************9012:abcd123456/dev/get/products,带有显式拒绝
如果省略拒绝部分会发生什么?它的行为类似于隐式拒绝(会话策略)。奇怪的是,在重新部署后,相同的错误仍然存在,只有允许。请参阅CloudTrail日志以检查谁调用了什么,如果您负担得起(安全方面),请将允许中的所有内容更改为
*
,重新部署,调用,检查CloudTrail,然后根据在CloudTrailGlad中工作的内容设置策略,我将在回答您的评论时添加一个参考
service: test-gateway

provider:
  name: aws
  runtime: nodejs12.x
  apiGateway:
    shouldStartNameWithService: true
  role: arn:aws:iam::123456789012:role/test-apigateway-role