tl; dr ,当在一个REST API中使用多个自定义授权者时,如何编写策略和/或构建资源?
我在API网关中有一个具有多种资源的REST API。对于其中的某些请求,只要它们具有带机密值的特殊标头(即没有用户身份验证),就应允许任何请求。对于其他请求,请求都需要特殊的标头和用户身份验证。
特殊标头的工作方式类似于API密钥,但是不能x-api-key
,因为我既不控制标头,也不控制其值。
/resource1
– X-HEADER
(允许任何用户)/resource2
– X-HEADER
(允许任何用户)/resource3
– X-HEADER
和Auth
(仅允许已登录的用户)/resource4
– X-HEADER
和Auth
(仅允许已登录的用户)为解决这个问题,我有两个自定义授权者。对于PublicAuthorizer
,我将标头X-HEADER
作为标识源;对于LoggedInAuthorizer
,我将标头X-HEADER
和Auth
用户用作标识源。 (授权者的类型为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/resource1
– X-HEADER
/public/resource2
– X-HEADER
/private/resource3
– X-HEADER
和Auth
/private/resource4
– X-HEADER
和Auth