本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
的权限策略示例 AWS Secrets Manager
权限策略是 JSON 结构化文本。参见 JSON 策略文档结构。
附加到资源和身份上的权限策略非常相似。在访问密钥的策略中的一些元素包括:
-
Principal
:授予访问权限的用户。参见 IAM 用户指南中的指定委托人。您在身份上附加策略时,策略中不会包含Principal
元素。 -
Action
:他们可以做什么。请参阅 Secrets Manager 操作。 -
Resource
:他们可以访问哪些密钥。请参阅 Secrets Manager 资源。根据您附加的策略,通配符 (*) 具有不同的含义:
-
在附加到密钥的策略中,
*
表示该策略适用于此密钥。 -
在附加到身份的策略中,
*
表示该策略适用于账户中的所有资源(包括密钥)。
-
要将策略附加到密钥中,请参阅 将权限策略附加到 AWS Secrets Manager 密钥。
要将策略附加到密钥中,请参阅 将权限策略附加到身份。
主题
示例:检索单个秘密值的权限
要授予检索密钥值的权限,您可以将策略附加到密钥或身份上。要帮助确定使用的策略类型,请参阅基于身份的策略和基于资源的策略。有关如何附加策略的信息,请参阅 将权限策略附加到 AWS Secrets Manager 密钥 和 将权限策略附加到身份。
以下示例说明了授予对密钥访问权限的两种不同方式。第一个示例是您可以附加到密钥上的基于资源的策略。当您希望向多个用户或角色授予单个密钥的访问权限时,此示例非常有用。第二个示例是基于身份的策略,您可以将其附加到 IAM 中的用户或角色。当您希望授予对 IAM 组的访问权限时,此示例非常有用。要授予在批处理 API 调用中检索一组秘密的权限,请参阅 示例:批量检索一组机密值的权限。
例 读取一个密钥(附加到一个密钥)
通过将以下策略附加到密钥,你可以授予密钥的访问权限。要使用该策略,请参阅 将权限策略附加到 AWS Secrets Manager 密钥。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountId
:role/EC2RoleToAccessSecrets
" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }
例 读取使用客户自主管理型密钥加密的秘密(附加到身份)
如果使用客户管理的密钥对密钥进行加密,则可以通过将以下策略附加到身份来授予读取该密钥的访问权限。要使用该策略,请参阅 将权限策略附加到身份。
{ "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 调用中检索一组秘密的访问权限。该策略对调用方进行了限制,因此即使批量调用包含其他秘密,它们也只能检索 SecretARN1
、SecretARN2
和 SecretARN3
指定的秘密。如果调用方还在批处理 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
和权限开头为 List
:ListSecrets
和 ListSecretVersionIds
。要使用该策略,请参阅 将权限策略附加到身份。
{ "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": "*" } ] }
示例:拒绝使用特定 AWS KMS 密钥来加密机密
重要
要拒绝客户托管密钥,我们建议您使用密钥策略或密钥授予来限制访问权限。有关更多信息,请参阅《AWS Key Management Service 开发人员指南》 AWS KMS中的身份验证和访问控制。
例 拒绝 AWS 托管密钥aws/secretsmanager
(附加到身份)
以下策略说明如何拒绝使用 AWS 托管密钥aws/secretsmanager
来创建或更新密钥。这意味着必须使用客户管理的密钥对机密进行加密。如果aws/secretsmanager
密钥存在,则还必须包括其密钥 ID。您还需要添加空字符串,因为 Secrets Manager 将其解释为 AWS 托管密钥aws/secretsmanager
。第二条语句拒绝创建不包含 KMS 密钥的密钥的请求,因为 Secrets Manager 将其解释为 AWS 托管密钥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" } } } ] }
示例:权限和 VPC
如果您需要在 VPC 内部访问 Secrets Manager,您可以通过在权限策略中包含条件来确保对 Secrets Manager 的请求来自 VPC。有关更多信息,请参阅 VPC 终端节点条件 和 使用 AWS Secrets Manager VPC 终端节点。
请确保从其他 AWS 服务访问密钥的请求也来自 VPC,否则此策略将拒绝他们访问。
例 请求应通过 VPC 终端节点(连接到密钥)
以下策略仅允许用户在请求通过 VPC 终端节点时执行 Secrets Manager 操作
。要使用该策略,请参阅 将权限策略附加到 AWS Secrets Manager
密钥。vpce-1234a5678b9012c
{ "Id": "example-policy-1", "Version": "2012-10-17", "Statement": [ { "Sid": "
RestrictGetSecretValueoperation
", "Effect": "Deny", "Principal": "*", "Action": "secretsmanager:GetSecretValue", "Resource": "*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1234a5678b9012c
" } } } ] }
例 请求应来自 VPC(连接到密钥)
以下示例密钥策略仅允许来自
的命令创建和管理密钥。此外,只有在请求来自于 vpc-12345678
vpc-2b2b2b2b
时,该策略才允许使用访问密钥的加密值的操作。如果您在一个 VPC 中运行应用程序,但使用第二个隔离的 VPC 以提供管理功能,则可能会使用此类策略。要使用该策略,请参阅 将权限策略附加到 AWS Secrets Manager
密钥。
{ "Id": "example-policy-2", "Version": "2012-10-17", "Statement": [ { "Sid": "
AllowAdministrativeActionsfromONLYvpc-12345678
", "Effect": "Deny", "Principal": "*", "Action": [ "secretsmanager:Create*", "secretsmanager:Put*", "secretsmanager:Update*", "secretsmanager:Delete*", "secretsmanager:Restore*", "secretsmanager:RotateSecret", "secretsmanager:CancelRotate*", "secretsmanager:TagResource", "secretsmanager:UntagResource" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:sourceVpc": "vpc-12345678
" } } }, { "Sid": "AllowSecretValueAccessfromONLYvpc-2b2b2b2b
", "Effect": "Deny", "Principal": "*", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:sourceVpc": "vpc-2b2b2b2b
" } } } ] }
示例:使用标签控制对密钥的访问
您可以使用标签来控制对密钥的访问。使用标签控制权限在快速增长的环境中非常有用,并在策略管理变得繁琐的情况下可以提供帮助。一种策略是将标签附加到密钥上,然后在密钥具有特定标签时向身份授予权限。
例 允许访问带有特定标记的机密(附加到身份)
以下策略允许DescribeSecret
使用密钥为 “” ServerName
且值为 “ServerABC
” 的标签的机密。要使用该策略,请参阅 将权限策略附加到身份。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "secretsmanager:DescribeSecret", "Resource": "*", "Condition": { "StringEquals": { "secretsmanager:ResourceTag/
ServerName
": "ServerABC
" } } } }
示例:限制对标签与密钥标签匹配的标识的访问
一种策略是将标签附加到密钥和 IAM 身份上。然后,您可以创建权限策略,在身份的标签与密钥的标签匹配时允许操作。有关完整的教程,请参阅根据标签定义访问密钥的权限。
使用标签控制权限在快速增长的环境中非常有用,并在策略管理变得繁琐的情况下可以提供帮助。有关更多信息,请参阅什么是适用于 AWS的 ABAC?
例 允许访问与密钥具有相同标签的角色(附加到密钥)
仅当标签
对于密钥和角色具有相同的值时,以下策略才会向账户 AccessProject
授予 123456789012
GetSecretValue
权限。要使用该策略,请参阅 将权限策略附加到 AWS Secrets Manager
密钥。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "123456789012" }, "Condition": { "StringEquals": { "aws:ResourceTag/
AccessProject
": "${ aws:PrincipalTag/AccessProject
}" } }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } }
示例:服务主体
如果附加到您的密钥的资源策略包含AWS 服务委托人,我们建议您使用 aws: SourceArn 和 aw s: SourceAccount 全局条件密钥。仅当请求是从另一项 AWS 服务发送到 Secrets Manager 时,ARN 和账户值才会包含在授权上下文中。这种条件的组合避免了潜在的混淆代理情况。
如果资源 ARN 包含资源策略中不允许使用的字符,则不能在 aws:SourceArn
条件键的值中使用该资源 ARN 。改为使用 aws:SourceAccount
条件键。有关更多信息,请参阅 IAM 要求。
在附加到机密的策略中,服务委托人通常不用作委托人,但有些 AWS 服务需要它。有关服务要求您附加到密钥的资源策略的信息,请参阅该服务的文档。
例 允许服务使用服务主体访问密钥(附加到密钥)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "
service-name
.amazonaws.com" ] }, "Action": "secretsmanager:GetSecretValue", "Resource": "*", "Condition": { "ArnLike": { "aws:sourceArn": "arn:aws:service-name
::123456789012
:*" }, "StringEquals": { "aws:sourceAccount": "123456789012
" } } } ] }