Amazon Secrets Manager 的权限策略示例
权限策略是 JSON 结构化文本。参见 JSON 策略文档结构。
附加到资源和身份上的权限策略非常相似。在访问密钥的策略中的一些元素包括:
-
Principal
:授予访问权限的用户。参见 IAM 用户指南中的指定委托人。您在身份上附加策略时,策略中不会包含Principal
元素。 -
Action
:他们可以做什么。请参阅 Secrets Manager 操作。 -
Resource
:他们可以访问哪些密钥。请参阅Secrets Manager 资源。根据您附加的策略,通配符 (*) 具有不同的含义:
-
在附加到密钥的策略中,
*
表示该策略适用于此密钥。 -
在附加到身份的策略中,
*
表示该策略适用于账户中的所有资源(包括密钥)。
-
要将策略附加到密钥中,请参阅 将权限策略附加到 Amazon Secrets Manager 密钥。
要将策略附加到密钥中,请参阅 将权限策略附加到身份。
示例:检索密钥值的权限
要授予检索密钥值的权限,您可以将策略附加到密钥或身份上。要帮助确定使用的策略类型,请参阅基于身份的策略和基于资源的策略。有关如何附加策略的信息,请参阅 将权限策略附加到 Amazon Secrets Manager 密钥 和 将权限策略附加到身份。
以下示例说明了授予对密钥访问权限的两种不同方式。第一个示例是您可以附加到密钥上的基于资源的策略。当您希望向多个用户或角色授予单个密钥的访问权限时,此示例非常有用。第二个示例是基于身份的策略,您可以将其附加到 IAM 中的用户或角色。当您希望授予对 IAM 组的访问权限时,此示例非常有用。
例 读取一个密钥(附加到一个密钥)
通过将以下策略附加到密钥,你可以授予密钥的访问权限。要使用该策略,请参阅 将权限策略附加到 Amazon Secrets Manager 密钥。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountId
:role/EC2RoleToAccessSecrets
" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }
例 读取一个密钥(附加到一个身份)
通过将以下策略附加到身份,您可以授予密钥的访问权限。要使用该策略,请参阅 将权限策略附加到身份。如果将此策略附加到角色 EC2RoleToAccessSecrets
上,将授予与之前策略相同的权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "
SecretARN
" } ] }
例 示例:读取使用客户管理的密钥加密的密钥(附加到身份)
如果使用客户管理的密钥对密钥进行加密,则可以通过将以下策略附加到身份来授予读取该密钥的访问权限。要使用该策略,请参阅 将权限策略附加到身份。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "
SecretARN
" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "KMSKeyARN
" } ] }
示例:通配符
您可以使用通配符在策略元素中包含一组值。
例 访问路径中的所有密钥(附加到身份)
以下策略授予以 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": "*" } ] }
示例:权限和 VPC
如果您需要在 VPC 内部访问 Secrets Manager,您可以通过在权限策略中包含条件来确保对 Secrets Manager 的请求来自 VPC。有关更多信息,请参阅 VPC 终端节点条件 和 使用 Amazon Secrets Manager VPC 终端节点。
请确保请求访问来自其他 Amazon 服务也来自 VPC,否则此策略会拒绝它们的访问。
例 请求应通过 VPC 终端节点(连接到密钥)
以下策略仅允许用户在请求通过 VPC 终端节点时执行 Secrets Manager 操作
。要使用该策略,请参阅 将权限策略附加到 Amazon 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 以提供管理功能,则可能会使用此类策略。要使用该策略,请参阅 将权限策略附加到 Amazon 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 身份上。然后,您可以创建权限策略,在身份的标签与密钥的标签匹配时允许操作。有关完整的教程,请参阅根据标签定义访问密钥的权限。
使用标签控制权限在快速增长的环境中非常有用,并在策略管理变得繁琐的情况下可以提供帮助。有关更多信息,请参阅什么是适用于 Amazon 的 ABAC?
例 允许访问与密钥具有相同标签的角色(附加到密钥)
仅当标签
对于密钥和角色具有相同的值时,以下策略才会向账户 AccessProject
授予 123456789012
GetSecretValue
权限。要使用该策略,请参阅 将权限策略附加到 Amazon Secrets Manager 密钥。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "123456789012" }, "Condition": { "StringEquals": { "aws:ResourceTag/
AccessProject
": "${ aws:PrincipalTag/AccessProject
}" } }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } }
示例:服务主体
如果附加到密钥的资源策略包括 Amazon 服务主体,我们建议您使用 aws:SourceArn 和 aws:SourceAccount 全局条件键。仅当请求是从另一项 Amazon 服务发送到 Secrets Manager 时,ARN 和账户值才会包含在授权上下文中。这种条件的组合避免了潜在的混淆代理情况。
如果资源 ARN 包含资源策略中不允许使用的字符,则不能在 aws:SourceArn
条件键的值中使用该资源 ARN 。改为使用 aws:SourceAccount
条件键。有关更多信息,请参阅 IAM 要求。
服务主体通常不用作附加到密钥的策略中的主体,但某些 Amazon 服务需要此主体。有关服务要求您附加到密钥的资源策略的信息,请参阅该服务的文档。
例 允许服务使用服务主体访问密钥(附加到密钥)
{ "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
" } } } ] }