0

我在 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 角色。现在此池中的每个用户都有权获取此密钥的值。但我需要将此权限分配给单个用户,而不是所有用户。有没有办法做到这一点?

4

2 回答 2

1

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

基于角色的访问控制

于 2018-12-18T18:27:36.050 回答
0

您可以编写经过身份验证的用户 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 开发工具包会话凭证进行插值。即您的其他用户的客户端将嵌入不同的“子”值作为其会话凭据的一部分,因此他们将无法访问他们没有创建的秘密。

于 2020-01-18T19:39:26.407 回答