

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

# 基于资源的策略
<a name="auth-and-access_resource-policies"></a>

在基于资源的策略中，您可以指定谁可以访问密钥，以及他们可以对密钥执行哪些操作。您可以使用基于资源的策略来：
+ 为多个用户或角色授予单个密钥的访问权限。
+ 向其他 Amazon 账户中的用户或角色授予访问权限。

当您将基于资源的策略附加到控制台中的密钥时，Secrets Manager 使用自动推理引擎 [Zelkova](https://www.amazonaws.cn/blogs/security/protect-sensitive-data-in-the-cloud-with-automated-reasoning-zelkova/) 和 API `ValidateResourcePolicy`，防止您向各种 IAM 委托人授予对您的密钥的访问权限。您也可以调用带有来自 CLI 或 SDK `BlockPublicPolicy` 参数的 `PutResourcePolicy` API。

**重要**  
资源策略验证和 `BlockPublicPolicy` 参数通过阻止利用直接附加到您的密钥的资源策略授予公共访问权限，来帮助保护您的资源。除了使用这些功能之外，还要仔细检查以下策略，来确认它们不授予公有访问权限：  
附加到关联 Amazon 委托人（例如，IAM 角色）的基于身份的策略 
附加到关联资源的基于 Amazon 资源的策略（例如， Amazon Key Management Service (Amazon KMS) 密钥） 
要查看对您的密钥的权限，请参阅 [确定谁有权限访问您的 密钥](determine-acccess_examine-iam-policies.md)。

**查看、更改或删除密钥的资源策略（控制台）**

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.amazonaws.cn/secretsmanager/)。

1. 从密钥列表上，选择您的密钥。

1. 进入密钥详细信息页面后，在**概述**选项卡的**资源权限**部分中，选择**编辑权限**。

1. 在代码字段中，执行以下操作之一，然后选择**保存**：
   + 要附加或修改资源策略，输入该策略。
   + 要删除策略，清除代码字段。

## Amazon CLI
<a name="auth-and-access_resource_cli"></a>

**Example 检索资源策略**  
以下 [https://docs.amazonaws.cn/cli/latest/reference/secretsmanager/get-resource-policy.html](https://docs.amazonaws.cn/cli/latest/reference/secretsmanager/get-resource-policy.html) 示例将检索附加到密钥的基于资源的策略。  

```
aws secretsmanager get-resource-policy \
    --secret-id MyTestSecret
```

**Example 删除资源策略**  
以下 [https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/delete-resource-policy.html](https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/delete-resource-policy.html) 示例将删除附加到密钥的基于资源的策略。  

```
aws secretsmanager delete-resource-policy \
    --secret-id MyTestSecret
```

**Example 添加资源策略**  
以下 [https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/put-resource-policy.html](https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/put-resource-policy.html) 示例将向密钥添加权限策略，首先检查该策略是否不提供对该密钥的广泛访问权限。该策略是从文件中读取的。有关更多信息，请参阅《 Amazon CLI 用户指南》中的[从文件加载 Amazon CLI 参数](https://docs.amazonaws.cn//cli/latest/userguide/cli-usage-parameters-file.html)。  

```
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 SDK
<a name="auth-and-access_resource_sdk"></a>

要检索附加到密钥的策略，请使用 [https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_GetResourcePolicy.html](https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_GetResourcePolicy.html)。

要删除附加到密钥的策略，请使用 [https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_DeleteResourcePolicy.html](https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_DeleteResourcePolicy.html)。

要将策略附加到密钥，请使用 [https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_PutResourcePolicy.html](https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_PutResourcePolicy.html)。如果已经附加了策略，命令会将其替换为新策略。策略必须格式化为 JSON 结构化文本。请参阅 [JSON 策略文档结构](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies-introduction)。

有关更多信息，请参阅 [Amazon SDKs](asm_access.md#asm-sdks)。

## 示例
<a name="auth-and-access_resource-policy-examples"></a>

**Topics**
+ [示例：检索单个秘密值的权限](#auth-and-access_examples_read)
+ [示例：权限和 VPCs](#auth-and-access_examples_vpc)
+ [示例：服务主体](#auth-and-access_service)

### 示例：检索单个秘密值的权限
<a name="auth-and-access_examples_read"></a>

要授予检索密钥值的权限，您可以将策略附加到密钥或身份上。要帮助确定使用的策略类型，请参阅[基于身份的策略和基于资源的策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。有关如何附加策略的信息，请参阅 [基于资源的策略](#auth-and-access_resource-policies) 和 [基于身份的策略](auth-and-access_iam-policies.md)。

当您希望向多个用户或角色授予单个密钥的访问权限时，此示例非常有用。要授予在批处理 API 调用中检索一组秘密的权限，请参阅 [示例：批量检索一组密钥值的权限](auth-and-access_iam-policies.md#auth-and-access_examples_batch)。

**Example 读取一个密钥**  
通过将以下策略附加到密钥，你可以授予密钥的访问权限。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/EC2RoleToAccessSecrets"
            },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "*"
        }
    ]
}
```

### 示例：权限和 VPCs
<a name="auth-and-access_examples_vpc"></a>

如果您需要在 VPC 内部访问 Secrets Manager，您可以通过在权限策略中包含条件来确保对 Secrets Manager 的请求来自 VPC。有关更多信息，请参阅[使用 VPC 端点条件限制请求](best-practices.md#iam-contextkeys-vpcendpoint)和[使用 Amazon Secrets Manager VPC 终端节点](vpc-endpoint-overview.md)。

请确保从其他 Amazon 服务访问密钥的请求也来自 VPC，否则此策略将拒绝他们访问。

**Example 要求请求通过 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-12345678"
    }
  }
}
]
}
```

**Example 要求请求来自 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"
    }
  }
}
]
}
```

### 示例：服务主体
<a name="auth-and-access_service"></a>

如果附加到您的密钥的资源策略包含[Amazon 服务委托人](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)，我们建议您使用 aws[: SourceArn 和 aw](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) s[: SourceAccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件密钥。仅当请求是从另一项 Amazon 服务发送到 Secrets Manager 时，ARN 和账户值才会包含在授权上下文中。这种条件的组合避免了潜在的[混淆代理情况](https://docs.amazonaws.cn/IAM/latest/UserGuide/confused-deputy.html)。

如果资源 ARN 包含资源策略中不允许使用的字符，则不能在 `aws:SourceArn` 条件键的值中使用该资源 ARN 。改为使用 `aws:SourceAccount` 条件键。有关更多信息，请参阅 [IAM 要求](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-names)。

在附加到机密的策略中，服务委托人通常不用作委托人，但有些 Amazon 服务需要它。有关服务要求您附加到密钥的资源策略的信息，请参阅该服务的文档。

**Example 允许服务使用服务主体访问密钥**    
****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
{
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "s3.amazonaws.com"
    ]
  },
  "Action": "secretsmanager:GetSecretValue",
  "Resource": "*",
  "Condition": {
    "ArnLike": {
      "aws:sourceArn": "arn:aws:s3::123456789012:*"
    },
    "StringEquals": {
      "aws:sourceAccount": "123456789012"
    }
  }

}
]
}
```