将权限分配给单个 Cognito 用户访问在 AWS 的 Secret Manager 上创建的秘密

Assigning permission to single cognito user access to a secret created on AWS's Secret Manager

我在 AWS 的 Secrets Manager 上创建了一个密钥。我有一个带有 Cognito 身份验证的 python 服务,我想分配给特定用户权限以获取此秘密。我创建了以下策略以允许用户获取密钥的值。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Resource": "arn:aws:secretsmanager:*:*:secret:test_secret*"
        }
    ]
}

然后我将此策略分配给我的 Cognito 身份池的 Authenticated 角色。现在这个池中的每个用户都有权获得这个秘密的价值。但我需要将此权限分配给单个用户,而不是所有用户。有什么办法吗?

您可以将这个用户放在一个组中,让这个组承担一个 IAM 角色。 然后将权限附加到 IAM 角色。

Role-Based Access Control

您可以编写经过身份验证的用户 IAM 策略,只允许他们访问他们创建的资源。例如:

  1. 使用您从 CognitoIdentity 获得的 ID 令牌实例化 AWS secretsmanager 客户端
  2. 将您的身份验证策略指定为如下所示:
{
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:UpdateSecret",
                    "secretsmanager:PutSecretValue",
                    "secretsmanager:DescribeSecret",
                    "secretsmanager:DeleteSecret"
                ],
                "Resource": "*",
                "Condition": {
                    "ForAllValues:StringEquals": {
                        "aws:TagKeys": [
                            "Sub",
                            "Service"
                        ]
                    },
                    "StringEquals": {
                        "secretsmanager:ResourceTag/Service": "MYSERVICE",
                        "secretsmanager:ResourceTag/Sub": "${cognito-identity.amazonaws.com:sub}"
                    }
                }
            },
            {
                "Sid": "",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:TagResource",
                    "secretsmanager:CreateSecret"
                ],
                "Resource": "*",
                "Condition": {
                    "ForAllValues:StringEquals": {
                        "aws:TagKeys": [
                            "Sub",
                            "Service"
                        ]
                    },
                    "StringEquals": {
                        "aws:RequestTag/Service": "MYSERVICE",
                        "aws:RequestTag/Sub": "${cognito-identity.amazonaws.com:sub}"
                    }
                }
            }
        ]
    }
}

3) 创建密钥时,请务必在 CreateSecret 请求中应用映射到您的用户身份池 ID 和服务名称的标签。 (否则,您的请求将失败。)

您的用户现在将只能访问他们创建的机密。这是安全的,因为“${cognito-identity.amazonaws.com:sub}”值将根据 AWS SDK 会话凭证进行插值。 IE。您其他用户的客户端将嵌入不同的 "sub" 值作为其会话凭据的一部分,因此他们将无法访问并非他们创建的机密。