本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
基于资源的策略
在基于资源的策略中,您可以指定谁可以访问密钥,以及他们可以对密钥执行哪些操作。您可以使用基于资源的策略来:
-
为多个用户或角色授予单个密钥的访问权限。
-
授予其他 Amazon 帐户中的用户或角色的访问权限。
当您将基于资源的策略附加到控制台中的密钥时,Secrets Manager 使用自动推理引擎 ZelkovaValidateResourcePolicy
,防止您向各种 IAM 委托人授予对您的密钥的访问权限。您也可以调用带有来自 CLI 或 SDK BlockPublicPolicy
参数的 PutResourcePolicy
API。
重要
资源策略验证和 BlockPublicPolicy
参数通过阻止利用直接附加到您的密钥的资源策略授予公共访问权限,来帮助保护您的资源。除了使用这些功能之外,还要仔细检查以下策略,来确认它们不授予公有访问权限:
附加到关联 Amazon 主体(例如 IAM 角色)的基于身份的策略
附加到关联的 Amazon 资源[例如 Amazon Key Management Service(Amazon KMS)密钥]的基于资源的策略
要查看对您的密钥的权限,请参阅 确定谁有权限访问您的 密钥。
查看、更改或删除密钥的资源策略(控制台)
通过 https://console.aws.amazon.com/secretsmanager/
打开 Secrets Manager 控制台。 从密钥列表上,选择您的密钥。
-
进入密钥详细信息页面后,在概述选项卡的资源权限部分中,选择编辑权限。
-
在代码字段中,执行以下操作之一,然后选择保存:
-
要附加或修改资源策略,输入该策略。
-
要删除策略,清除代码字段。
-
Amazon CLI
例 检索资源策略
以下 get-resource-policy
示例将检索附加到密钥的基于资源的策略。
aws secretsmanager get-resource-policy \ --secret-id MyTestSecret
例 删除资源策略
以下 delete-resource-policy
示例将删除附加到密钥的基于资源的策略。
aws secretsmanager delete-resource-policy \ --secret-id MyTestSecret
例 添加资源策略
以下 put-resource-policy
示例将向密钥添加权限策略,首先检查该策略是否不提供对该密钥的广泛访问权限。该策略是从文件中读取的。有关更多信息,请参阅《Amazon CLI 用户指南》中的从文件加载 Amazon CLI 参数。
aws secretsmanager put-resource-policy \ --secret-id MyTestSecret \ --resource-policy file://mypolicy.json \ --block-public-policy
mypolicy.json
的内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/MyRole" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }
Amazon 软件开发工具包
要检索附加到密钥的策略,请使用 GetResourcePolicy
。
要删除附加到密钥的策略,请使用 DeleteResourcePolicy
。
要将策略附加到密钥,请使用 PutResourcePolicy
。如果已经附加了策略,命令会将其替换为新策略。策略必须格式化为 JSON 结构化文本。请参阅 JSON 策略文档结构。
有关更多信息,请参阅 Amazon SDKs。
示例
示例:检索单个秘密值的权限
要授予检索密钥值的权限,您可以将策略附加到密钥或身份上。要帮助确定使用的策略类型,请参阅基于身份的策略和基于资源的策略。有关如何附加策略的信息,请参阅 基于资源的策略 和 基于身份的策略。
当您希望向多个用户或角色授予单个密钥的访问权限时,此示例非常有用。要授予在批处理 API 调用中检索一组秘密的权限,请参阅 示例:批量检索一组密钥值的权限。
例 读取一个密钥
通过将以下策略附加到密钥,你可以授予密钥的访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountId
:role/EC2RoleToAccessSecrets
" }, "Action": "secretsmanager:GetSecretValue", "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
" } } } ] }
示例:服务主体
如果附加到密钥的资源策略包括 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
" } } } ] }