基于身份的策略 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

基于身份的策略

将权限策略附加到 IAM 身份、用户、用户组和角色。在基于身份的策略中,您指定该身份可以访问哪些密钥以及该身份可以对密钥执行哪些操作。有关更多信息,请参阅添加和删除 IAM 身份权限

您可以向代表其他服务中的应用程序或用户的角色授予权限。例如,在 Amazon EC2 实例上运行的应用程序可能需要访问数据库。您可以创建附加到 EC2 实例配置文件的 IAM 角色,然后使用权限策略授予该角色对包含数据库凭证的密钥的访问权限。有关更多信息,请参阅使用 IAM 角色为 Amazon EC2 实例上运行的应用程序授予权限。您可以附加角色的其他服务包括 Amazon RedshiftAmazon LambdaAmazon ECS

您还可以通过除 IAM 以外的其他身份系统验证的用户授予权限。例如,您可以将 IAM 角色与使用 Amazon Cognito 登录的移动应用程序用户关联。角色向应用程序授予具有角色权限策略中权限的临时凭据。然后,您可以使用权限策略授予角色对密钥的访问权限。有关更多信息,请参阅身份提供者和联合身份验证

您必须使用基于身份的策略来:

  • 授予对多个密钥的身份访问权限。

  • 控制哪些人可以创建新密钥,哪些人可以访问尚未创建的密钥。

  • 授予 IAM 组对密钥的访问权限。

示例:检索单个秘密值的权限

要授予检索密钥值的权限,您可以将策略附加到密钥或身份上。要帮助确定使用的策略类型,请参阅基于身份的策略和基于资源的策略。有关如何附加策略的信息,请参阅 基于资源的策略基于身份的策略

当您希望授予对 IAM 组的访问权限时,此示例非常有用。要授予在批处理 API 调用中检索一组秘密的权限,请参阅 示例:批量检索一组密钥值的权限

例 读取使用客户自主管理型密钥加密的密钥

如果使用客户管理的密钥对密钥进行加密,则可以通过将以下策略附加到身份来授予读取该密钥的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "SecretARN" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "KMSKeyARN" } ] }

示例:读取和描述个人密钥的权限

例 读取和描述一个密钥

通过将以下策略附加到身份,您可以授予密钥的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], "Resource": "SecretARN" } ] }

示例:批量检索一组密钥值的权限

例 批量读取一组密钥

您可以通过将以下策略附加到身份来授予在批处理 API 调用中检索一组秘密的访问权限。该策略对调用方进行了限制,因此即使批量调用包含其他秘密,它们也只能检索 SecretARN1SecretARN2SecretARN3 指定的秘密。如果调用方还在批处理 API 调用中请求其他秘密,则 Secrets Manager 将不会返回它们。有关更多信息,请参阅 BatchGetSecretValue

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:BatchGetSecretValue", "secretsmanager:ListSecrets" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "SecretARN1", "SecretARN2", "SecretARN3" ] } ] }

示例:通配符

您可以使用通配符在策略元素中包含一组值。

例 访问路径中的所有密钥

以下策略授予以 TestEnv/ 开头的名称检索所有密钥的访问权限。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:Region:AccountId:secret:TestEnv/*" } }
例 访问所有密钥的元数据

以下策略授予 DescribeSecret 和权限开头为 ListListSecretsListSecretVersionIds

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:List*" ], "Resource": "*" } }
例 匹配密钥名称

以下策略按名称授予密钥的所有 Secrets Manager 权限。要使用该策略,请参阅 基于身份的策略

要匹配密钥名称,可以通过将区域、账户 ID、机密名称和通配符 (?) 放在一起来匹配单个随机字符,从而为密钥创建 ARN。Secrets Manager 会将六个随机字符附加到密钥名称作为 ARN 的一部分,因此您可以使用此通配符来匹配这些字符。如果使用 "another_secret_name-*" 语法,Secrets Manager 不仅匹配具有 6 个随机字符的预期密钥,而且还匹配 "another_secret_name-<anything-here>a1b2c3"

因为除了 6 个随机字符外,您可以预测密钥的所有 ARN 部分,所以使用通配符 '??????' 语法,您能够安全地将权限授予给尚不存在的密钥。但要注意,如果删除密钥并以相同名称重新创建,即使 6 个字符发生变化,用户也会自动获得新密钥的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:*", "Resource": [ "arn:aws:secretsmanager:Region:AccountId:secret:a_specific_secret_name-a1b2c3", "arn:aws:secretsmanager:Region:AccountId:secret:another_secret_name-??????" ] } ] }

示例:创建密钥的权限

要为用户授予权限创建密钥,我们建议您将权限策略附加到用户所属的 IAM 组。请参阅 IAM 用户组

例 创建密钥

以下策略授予创建密钥和查看密钥列表的权限。要使用该策略,请参阅 基于身份的策略

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:CreateSecret", "secretsmanager:ListSecrets" ], "Resource": "*" } ] }

示例:拒绝使用特定 Amazon KMS 密钥对密钥进行加密

重要

要拒绝客户自主管理型密钥,我们建议您使用密钥政策或密钥授予来限制访问权限。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的 Authentication and access control for Amazon KMS

例 拒绝 Amazon 托管密钥 aws/secretsmanager

以下策略说明了如何拒绝使用 Amazon 托管密钥 aws/secretsmanager 来创建或更新密钥。这意味着必须使用客户自主管理型密钥来对密钥进行加密。如果 aws/secretsmanager 密钥存在,则还必须包括其密钥 ID。您还包括空字符串,因为 Secrets Manager 将其解释为 Amazon 托管密钥 aws/secretsmanager。第二条语句拒绝创建不包含 KMS 密钥的密钥的请求,因为 Secrets Manager 将其解释为 Amazon 托管密钥 aws/secretsmanager

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireCustomerManagedKeysOnSecrets", "Effect": "Deny", "Action": [ "secretsmanager:CreateSecret", "secretsmanager:UpdateSecret" ], "Resource": "*", "Condition": { "ForAnyValue:StringLikeIfExists": { "secretsmanager:KmsKeyId": [ "*alias/aws/secretsmanager", "*<key_ID_of_the_AWS_managed_key>", "" ] } } }, { "Sid": "RequireKmsKeyIdParameterOnCreate", "Effect": "Deny", "Action": "secretsmanager:CreateSecret", "Resource": "*", "Condition": { "Null": { "secretsmanager:KmsKeyId": "true" } } } ] }