AWS技术问题:如何限制Cognito授权用户仅访问特定Lambda函数
我来帮你搞定这个权限控制的问题——你现在遇到的核心问题是Cognito授权器在API Gateway里只负责验证用户身份,不会自动应用用户组关联的IAM角色来限制Lambda调用权限。下面给你一步步拆解解决方法:
为什么当前设置不生效?
你现在的API Gateway用Cognito授权器只是做了身份校验:只要用户能提供有效的IdToken,就会通过授权,然后API Gateway会用自己的权限(而不是用户组的IAM角色)去调用Lambda。如果API Gateway本身被授予了调用所有Lambda的权限,那不管用户属于哪个组,都能触发所有函数。
正确的配置步骤
1. 调整API Gateway的集成方式,使用用户的Cognito角色调用Lambda
在API Gateway的每个路由集成请求里,需要开启**使用调用者的身份(Web Identity)**来调用Lambda,而不是用API Gateway默认的执行角色。具体操作:
- 进入API Gateway控制台,打开对应的API和路由
- 切换到「集成请求」标签
- 在「权限」部分,选择「使用调用者的身份」
- 填写「IAM角色ARN」为一个具备
sts:AssumeRoleWithWebIdentity权限的IAM角色(这个角色需要允许API Gateway服务主体来调用这个STS操作)
2. 配置API Gateway的IAM角色权限
创建或修改API Gateway的执行角色,添加以下策略,允许它扮演用户组的角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRoleWithWebIdentity", "Resource": [ "arn:aws:iam::xxxxxx:role/User", "arn:aws:iam::xxxxxx:role/Admin" ] } ] }
3. 移除API Gateway直接调用Lambda的权限
检查你的Lambda函数的资源策略,确保没有给apigateway.amazonaws.com服务主体直接的lambda:InvokeFunction权限。这样API Gateway就只能通过扮演用户组的角色来调用Lambda,从而受限于角色的权限策略。
4. 验证用户组角色的信任策略
确保User和Admin角色的信任策略允许Cognito用户池和API Gateway来扮演它们,比如User角色的信任策略应该包含:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com", "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "你的Cognito用户池ID" } } } ] }
测试验证
完成配置后,用User组的用户调用api-dev-getUsers路由,应该返回403 Forbidden;调用api-dev-getItems则正常返回结果。Admin组用户可以调用两个路由,这样就符合你的预期了。
内容的提问来源于stack exchange,提问作者Philipp

