【问题标题】:Assigning permission to single cognito user access to a secret created on AWS's Secret Manager为单个 cognito 用户分配对 AWS Secret Manager 上创建的密钥的访问权限
【发布时间】:2019-05-19 02:37:35
【问题描述】:

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

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-secrets-manager


    【解决方案1】:

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

    Role-Based Access Control

    【讨论】:

    • 我明白了。那么在这种情况下,有数百个组,每个组都有一个用户可以吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2020-12-07
      • 2021-11-26
      • 2021-06-29
      • 2020-12-22
      • 2020-09-27
      相关资源
      最近更新 更多