将权限分配给单个 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 角色。
您可以编写经过身份验证的用户 IAM 策略,只允许他们访问他们创建的资源。例如:
- 使用您从 CognitoIdentity 获得的 ID 令牌实例化 AWS secretsmanager 客户端
- 将您的身份验证策略指定为如下所示:
{
"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" 值作为其会话凭据的一部分,因此他们将无法访问并非他们创建的机密。
我在 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 角色。
您可以编写经过身份验证的用户 IAM 策略,只允许他们访问他们创建的资源。例如:
- 使用您从 CognitoIdentity 获得的 ID 令牌实例化 AWS secretsmanager 客户端
- 将您的身份验证策略指定为如下所示:
{
"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" 值作为其会话凭据的一部分,因此他们将无法访问并非他们创建的机密。