当前位置: 首页 > 知识库问答 >
问题:

我如何拒绝对AWS API网关的公共访问,同时只允许特定角色访问?

姜聪
2023-03-14

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

Public Gateway -> Private Gateway

我希望能够在浏览器中访问公共网关endpoint并收到2xx响应,而当直接访问私有网关时,我应该收到4xx响应。访问私有网关的唯一方式应该是通过公共网关(它通过每个endpoint代理私有网关)。

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/test-apigateway-role"
                }
            }
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::123456789012:role/test-apigateway-role",
                    "arn:aws:iam::123456789012:root"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*/*/*",
            "Condition": {
                "ArnNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/test-apigateway-role"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*/*/*"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/test-apigateway-role"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*/*/*"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/test-apigateway-role"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*/*/*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::123456789012:role/test-apigateway-role"
                }
            }
        }
    ]
}

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

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

service: test-gateway

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

共有1个答案

强承望
2023-03-14

试试这个怎么样?

根据文档,如果不指定显式的deny,然后提供特定的allow,它应该可以工作。如果没有,继续分享你的输出,我很感兴趣。

更新:我删除了Deny*部分,这意味着对于未在allow语句中特别声明的请求,我们将获得一个隐式Deny。这是根据会话策略(请参阅文档链接)

更新2:检查这个答案的注释,作者还提到了-添加authorizer:aws_iam到serverless.yml

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123456789012:role/test-apigateway-role"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:123456789012:abcd123456/*"
            ]
        }
    ]
}
 类似资料:
  • 我已创建IAM策略并分配给IAM用户。 请查找保险单 我未选中s3 bucket testingbucket00的“阻止新公共bucket策略”。 我尝试登录aws控制台使用IAM用户列出所有桶,但显示"访问为错误"。 我想给IAM用户分配一个桶,请帮忙。

  • 我已经启动了一个具有IAM角色“WebApp”的EC2实例。角色已附加,我可以使用 webapp角色具有S3的附加策略 我也需要更改bucket权限吗?或者我在Conf上做错了什么。EC2的?

  • 在应用程序中,我尝试使用保护页面,但成功登录后,应用程序总是响应错误。 KeyCloak是这样配置的: - 然后添加用户,并成功登录为该用户时KeyCloak要求的凭据,但然后得到页面。我已经建立了一个项目,所有的东西都可能是,只有一个命令。我将不胜感激任何关于如何KeyCloak应额外配置的提示。 我如何正确设置keydepeat,以便允许访问空的角色列表?

  • 我正在尝试访问 Spotify API 令牌,如下所示: 但服务返回以下错误: XMLHttpRequest无法加载https://accounts.spotify.com/api/token.请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“http://www.bancadigital.com.br”。 有人知道我如何能访问服务吗?

  • 此url位于AWS API网关中,方法为get,stage部署良好。我在aws文档之后启用了CORS。 -资源->操作->启用CORS->默认设置->启用CORS并替换CORS头。在CORS结果中没有错误日志。 我不是profesional web开发人员,我的浏览器是Safari。 以下是我查询“http://my.com”的代码 控制台打印错误:XMLHttpRequest不能加载“http:

  • 问题内容: 我们如何能够通过只允许火力地堡云功能将数据写入到特定位置的规则安全数据库,以前有以UID添加到管理客户机的选择和使用规则节UID,但现在我们通过初始化,所以我不确定如何添加其他参数。 编辑 是为此发起证书的好主意吗?即 上面有什么好处,实际上是从哪里获取数据,这不只是节点模块吗? 问题答案: 通常,在Cloud Functions代码的顶部,您具有: 作为节点模块的一部分,您可以访问,