如何在一个API Gateway REST API中为多个自定义授权者编写策略?

时间:2018-08-27 09:12:31

标签: amazon-web-services aws-lambda aws-api-gateway

tl; dr ,当在一个REST API中使用多个自定义授权者时,如何编写策略和/或构建资源?

我在API网关中有一个具有多种资源的REST API。对于其中的某些请求,只要它们具有带机密值的特殊标头(即没有用户身份验证),就应允许任何请求。对于其他请求,请求都需要特殊的标头和用户身份验证。

特殊标头的工作方式类似于API密钥,但是不能x-api-key,因为我既不控制标头,也不控制其值。

  • /resource1X-HEADER(允许任何用户)
  • /resource2X-HEADER(允许任何用户)
  • /resource3X-HEADERAuth(仅允许已登录的用户)
  • /resource4X-HEADERAuth(仅允许已登录的用户)

为解决这个问题,我有两个自定义授权者。对于PublicAuthorizer,我将标头X-HEADER作为标识源;对于LoggedInAuthorizer,我将标头X-HEADERAuth用户用作标识源。 (授权者的类型为REQUEST。)

到目前为止,一切都很好。问题是如何编写策略。这是LoggedInAuthorizer的当前回复:

{
  "principalId": "[the user id]",
  "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [{
      "Resource": "arn:aws:execute-api:[region]:[account id]:[rest api id]/[stage]*",
      "Action": "execute-api:Invoke",
      "Effect": "Allow"
    }]
  }
}

这是PublicAuthorizer的当前响应(始终使用相同的principalId):

{
  "principalId": "anonymous user",
  "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [{
      "Resource": "arn:aws:execute-api:[region]:[account id]:[rest api id]/[stage]*",
      "Action": "execute-api:Invoke",
      "Effect": "Allow"
    }]
  }
}

这可行,但是我担心两个策略都使用相同的Resource

是否存在攻击者可以先请求/resource1然后再请求/resource3并重用第一个策略来调用获得访问权限而无需用户身份验证的风险? (我已经尝试过但没有成功)

我已启用授权缓存,所以不能将event.methodArn用作Resource。这样做可以防止用户在缓存期间调用任何其他资源。

我是否必须更改资源的结构,以便策略使用路径前缀覆盖资源的一部分?例如"arn:aws:execute-api:[region]:[account id]:[rest api id]/[stage]/*/public/*"就是这个结构:

  • /public/resource1X-HEADER
  • /public/resource2X-HEADER
  • /private/resource3X-HEADERAuth
  • /private/resource4X-HEADERAuth

0 个答案:

没有答案