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

权限策略示例

权限策略是 JSON 结构化文本。参见 JSON 策略文档结构

附加到资源和身份上的权限策略非常相似。在访问密钥的策略中的一些元素包括:

  • Principal:授予访问权限的用户。参见 IAM 用户指南中的指定委托人。您在身份上附加策略时,策略中不会包含 Principal 元素。

    您可以授予应用程序从 Secrets Manager 检索密钥的权限。例如,在 Amazon EC2 实例上运行的应用程序可能需要访问数据库。您可以创建附加到 EC2 实例配置文件的 IAM 角色,然后使用权限策略授予该角色对密钥的访问权限。

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

    Amazon 服务主体通常不用作附加到密钥的策略中的主体,但某些 Amazon 服务需要此主体。当主体为服务主体时,我们建议您使用 aws:SourceArnaws:SourceAccount 全局条件键。请参阅 示例:服务主体

  • Action:他们可以做什么。请参阅 Secrets Manager 操作

  • Resource:他们可以访问哪些密钥。请参阅 Secrets Manager 资源

    根据您附加的策略,通配符 (*) 具有不同的含义:

    • 在附加到密钥的策略中,* 表示该策略适用于此密钥。

    • 在附加到身份的策略中,* 表示该策略适用于账户中的所有资源(包括密钥)。

要将策略附加到密钥中,请参阅 将权限策略附加到密钥

要将策略附加到密钥中,请参阅 将权限策略附加到身份

示例:检索密钥值的权限

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

以下示例说明了授予对密钥访问权限的两种不同方式。第一个示例是您可以附加到密钥上的基于资源的策略。当您希望向多个用户或角色授予单个密钥的访问权限时,此示例非常有用。第二个示例是基于身份的策略,您可以将其附加到 IAM 中的用户或角色。当您希望授予对 IAM 组的访问权限时,此示例非常有用。

例 读取一个密钥(附加到一个密钥)

通过将以下策略附加到密钥,你可以授予密钥的访问权限。要使用该策略,请参阅 将权限策略附加到密钥

{ "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" } ] }

示例:通配符

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

例 访问路径中的所有密钥(附加到身份)

以下策略授予以 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": "*" } ] }

示例:权限和 VPC

如果您需要在 VPC 内部访问 Secrets Manager,您可以通过在权限策略中包含条件来确保对 Secrets Manager 的请求来自 VPC。有关更多信息,请参阅 VPC 终端节点条件使用 Amazon Secrets Manager VPC 终端节点

请确保请求访问来自其他 Amazon 服务也来自 VPC,否则此策略会拒绝它们的访问。

例 请求应通过 VPC 终端节点(连接到密钥)

以下策略仅允许用户在请求通过 VPC 终端节点时执行 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 以提供管理功能,则可能会使用此类策略。要使用该策略,请参阅 将权限策略附加到密钥

{ "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 权限。要使用该策略,请参阅 将权限策略附加到密钥

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "123456789012" }, "Condition": { "StringEquals": { "aws:ResourceTag/AccessProject": "${ aws:PrincipalTag/AccessProject }" } }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } }

示例:服务主体

如果附加到密钥的资源策略包括 Amazon 服务主体,我们建议您使用 aws:SourceArnaws:SourceAccount 全局条件键。仅当请求是从另一项 Amazon 服务发送到 Secrets Manager 时,ARN 和账户值才会包含在授权上下文中。这种条件的组合避免了潜在的混淆代理情况

服务主体通常不用作附加到密钥的策略中的主体,但某些 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" } } } ] }