如何找出 AWS IAM 策略中实际设置为“$ ... ”的内容?

Posted

技术标签:

【中文标题】如何找出 AWS IAM 策略中实际设置为“$ ... ”的内容?【英文标题】:How do I find out what is actually set to "$ ... " in AWS IAM policy?如何找出 AWS IAM 策略中实际设置为“$ ... ”的内容? 【发布时间】:2021-09-15 15:23:46 【问题描述】:

我正在尝试使用 Lambda IAM 角色策略基于 Cognito 用户池限制对 Dynamo 数据库表中项目的访问。

在此过程中,我很难在下面的 Lambda IAM 政策中找到实际设置为“$cognito-identity.amazonaws.com:aud”的内容。

 
            "Effect": "Allow",
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:DescribeTable"
            ],
            "Condition": 
                "ForAllValues:StringEquals": 
                    "dynamodb:LeadingKeys": "$cognito-identity.amazonaws.com:aud"
                
            ,
            "Resource": "arn:aws:dynamodb:ap-southeast-2:*:*"
        

我假设它是应用程序客户端 ID 或身份池 ID,例如“ap-southeast-2:xxxxxxxx-aaaa-bbbb-cccc-123456789012”,但有没有办法输出实际设置为“$ cognito-identity.amazonaws.com:aud”在运行时确认?

我对 AWS 比较陌生。

更新 - 附加信息

就在通过 API 网关调用 Lambda 之前,我可以看到类似“xxxxxxxxnv0ff03e9joqh3om3h”(我的应用程序客户端 ID)之类的内容:

const session = await Auth.currentSession();
alert(session.idToken.payload.aud); //something like "xxxxxxxxnv0ff03e9joqh3om3h"

但是,我在使用应用程序客户端 ID 的 Lambda DynamoDB 查询中遇到 AccessDeniedException。

ExpressionAttributeValues: 
  ":partitionkey": "xxxxxxxxnv0ff03e9joqh3om3h",
,

我可以通过将 IAM 政策更改为:

"Condition": 
                "ForAllValues:StringEquals": 
                    "dynamodb:LeadingKeys": "123abc"
                
            ,

我的 Lambda DynamoDB 查询:

ExpressionAttributeValues: 
  ":partitionkey": "123abc",
,

我也尝试过 Cognito 身份池 ID,但没有成功。

【问题讨论】:

docs.aws.amazon.com/cognito/latest/developerguide/… 似乎是身份池。 没有真正的方法来查看它的价值/输出 - 您首先希望/期望在哪里看到输出? 我正在尝试查看要调试的内容。 Lambda 中用于获取 DynamoDB 项目的查询必须与 IAM 策略匹配以避免权限错误。但是,我使用应用程序客户端 ID 或身份池 ID 都没有成功匹配。谢谢。 【参考方案1】:

audsub 的映射值是特定于提供商的,outlined in the documentation.

在 Cognito 用户池联合的情况下,它将设置为客户端 ID。

【讨论】:

谢谢,这是最相关的文档。但是,我无法让我的 DynamoDB 查询使用 App Client ID。 @Taka 啊,你只是 AWS 令人困惑的文档的最新受害者。他们无法区分用户池和身份池。为了在您的角色中使用字符串插值机制,您需要在您的 api 网关上使用身份池以及 IAM 授权方。 感谢@Andrew,如果可能的话,我将尝试使用自定义 Lambda 授权器根据登录的用户池动态创建策略。 @Taka 哦,那里也要小心。自定义授权方返回的策略仅用于 API Gateway 授权。您正在寻找的是严格意义上的身份池功能。 感谢@Andrew 的提醒,是的,在尝试自定义授权方后,我意识到了你的意思。我现在回到 IAM 身份验证并再次尝试了许多不同的组合。但是,我仍然不知道实际为 aud 或 sub 设置了什么。

以上是关于如何找出 AWS IAM 策略中实际设置为“$ ... ”的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 AWS 客户 IAM 策略?

多个存储桶的 AWS IAM 策略

从 AWS 组织导出所有 IAM 用户、角色和策略

创建 AWS IAM 策略,将正在运行的实例限制为特定安全组

如何使用 Terraform 创建没有代入角色策略的 AWS IAM 角色?

如何限制 AWS IAM 组访问 AWS Secret Manager?