

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

# 的身份验证和访问控制 Amazon Secrets Manager
<a name="auth-and-access"></a>

Secrets Manager 用[Amazon Identity and Access Management (IAM) ](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction.html)来保护密钥的访问权限。IAM 提供了身份验证和访问控制。*身份验证*确认个人请求的身份。Secrets Manager 使用密码、访问密钥登录过程和多重身份验证（MFA） 令牌来验证用户身份。请参阅[登录 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/console.html)。*访问控制*确保只有获得批准的个人才能对密钥等 Amazon 资源执行操作。Secrets Manager 使用策略来定义谁有权访问哪些资源，以及身份可以对这些资源执行哪些操作。参见 [IAM 中的策略和权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。

**Topics**
+ [

## 的权限参考 Amazon Secrets Manager
](#reference_iam-permissions)
+ [

## Secrets Manager 管理员权限
](#auth-and-access_admin)
+ [

## 访问密钥的权限
](#auth-and-access_secrets)
+ [

## Lambda 轮换函数的权限
](#auth-and-access_rotate)
+ [

## 加密密钥权限
](#auth-and-access_encrypt)
+ [

## 复制权限
](#auth-and-access_replication)
+ [

# 基于身份的策略
](auth-and-access_iam-policies.md)
+ [

# 基于资源的策略
](auth-and-access_resource-policies.md)
+ [

# 使用基于属性的访问权限控制（ABAC）控制对密钥的访问
](auth-and-access-abac.md)
+ [

# Amazon 的托管策略 Amazon Secrets Manager
](reference_available-policies.md)
+ [

# 确定谁有权访问你的 Amazon Secrets Manager 秘密
](determine-acccess_examine-iam-policies.md)
+ [

# 从其他账户访问 Amazon Secrets Manager 密钥
](auth-and-access_examples_cross.md)
+ [

# 从本地环境访问密钥
](auth-and-access-on-prem.md)

## 的权限参考 Amazon Secrets Manager
<a name="reference_iam-permissions"></a>

Secrets Manager 的权限参考可在*服务授权参考*中的 [Actions, resources, and condition keys for Amazon Secrets Manager](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awssecretsmanager.html) 中找到。

## Secrets Manager 管理员权限
<a name="auth-and-access_admin"></a>

如果要授予 Secrets Manager 管理员权限，请根据[添加和删除 IAM 身份权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)和下列策略进行操作：
+ [SecretsManagerReadWrite](reference_available-policies.md#security-iam-awsmanpol-SecretsManagerReadWrite)
+ [https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)

我们建议您不要向最终用户授予管理员权限。尽管这样用户可以创建和管理密钥，但启用轮换所需的权限 (IAMFullAccess) 会授予不适合最终用户的重要权限。

## 访问密钥的权限
<a name="auth-and-access_secrets"></a>

通过采用 IAM 权限策略，您可以控制哪些用户或服务有权访问您的密钥。*权限策略*描述了哪些人可以对哪些资源执行哪些操作。你可以：
+ [基于身份的策略](auth-and-access_iam-policies.md)
+ [基于资源的策略](auth-and-access_resource-policies.md)

## Lambda 轮换函数的权限
<a name="auth-and-access_rotate"></a>

Secrets Manager 使用 Amazon Lambda 函数来[轮换密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/rotating-secrets.html)。Lambda 函数必须具有对密钥以及密钥包含凭据的数据库或服务的访问权限。请参阅[轮换权限](rotating-secrets-required-permissions-function.md)。

## 加密密钥权限
<a name="auth-and-access_encrypt"></a>

Secrets Manager 使用 Amazon Key Management Service (Amazon KMS) 密钥[对密钥进行加密](https://docs.amazonaws.cn/secretsmanager/latest/userguide/security-encryption.html)。 Amazon 托管式密钥 `aws/secretsmanager`自动具有正确的权限。如果您使用不同的 KMS 密钥，Secrets Manager 需要对该密钥的权限。请参阅[KMS 密钥的权限](security-encryption.md#security-encryption-authz)。

## 复制权限
<a name="auth-and-access_replication"></a>

通过使用 IAM 权限策略，您可以控制哪些用户或服务可以将您的密钥复制到其他区域。请参阅[防止 Amazon Secrets Manager 复制](replicate-secrets-permissions.md)。

# 基于身份的策略
<a name="auth-and-access_iam-policies"></a>

将权限策略附加到 [IAM 身份、用户、用户组和角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id.html)。在基于身份的策略中，您指定该身份可以访问哪些密钥以及该身份可以对密钥执行哪些操作。有关更多信息，请参阅[添加和删除 IAM 身份权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

您可以向代表其他服务中的应用程序或用户的角色授予权限。例如，在 Amazon EC2 实例上运行的应用程序可能需要访问数据库。您可以创建附加到 EC2 实例配置文件的 IAM 角色，然后使用权限策略授予该角色对包含数据库凭证的密钥的访问权限。有关更多信息，请参阅[使用 IAM 角色为 Amazon EC2 实例上运行的应用程序授予权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)。您可以附加角色的其他服务包括 [Amazon Redshift](https://docs.amazonaws.cn/redshift/latest/dg/c-getting-started-using-spectrum.html)、[Amazon Lambda](https://docs.amazonaws.cn/lambda/latest/dg/lambda-permissions.html) 和 [Amazon ECS](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。

您还可以通过除 IAM 以外的其他身份系统验证的用户授予权限。例如，您可以将 IAM 角色与使用 Amazon Cognito 登录的移动应用程序用户关联。角色向应用程序授予具有角色权限策略中权限的临时凭据。然后，您可以使用权限策略授予角色对密钥的访问权限。有关更多信息，请参阅[身份提供者和联合身份验证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_providers.html)。

您必须使用基于身份的策略来：
+ 授予对多个密钥的身份访问权限。
+ 控制哪些人可以创建新密钥，哪些人可以访问尚未创建的密钥。
+ 授予 IAM 组对密钥的访问权限。

**Topics**
+ [

## 示例：检索单个秘密值的权限
](#auth-and-access_examples_identity_read)
+ [

## 示例：读取和描述个人密钥的权限
](#auth-and-access_examples-read-and-describe)
+ [

## 示例：批量检索一组密钥值的权限
](#auth-and-access_examples_batch)
+ [

## 示例：通配符
](#auth-and-access_examples_wildcard)
+ [

## 示例：创建密钥的权限
](#auth-and-access_examples_create)
+ [

## 示例：拒绝使用特定 Amazon KMS 密钥来加密机密
](#auth-and-access_examples_kmskey)

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

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

当您希望授予对 IAM 组的访问权限时，此示例非常有用。要授予在批处理 API 调用中检索一组秘密的权限，请参阅 [示例：批量检索一组密钥值的权限](#auth-and-access_examples_batch)。

**Example 读取使用客户自主管理型密钥加密的密钥**  
如果使用客户管理的密钥对密钥进行加密，则可以通过将以下策略附加到身份来授予读取该密钥的访问权限。    
****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
{
  "Effect": "Allow",
  "Action": "secretsmanager:GetSecretValue",
  "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
},
{
  "Effect": "Allow",
  "Action": "kms:Decrypt",
  "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id"
}
]
}
```

## 示例：读取和描述个人密钥的权限
<a name="auth-and-access_examples-read-and-describe"></a>

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

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
  {
    "Effect": "Allow",
    "Action": [
      "secretsmanager:GetSecretValue",
      "secretsmanager:DescribeSecret"
      ],
      "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    }
]
}
```

## 示例：批量检索一组密钥值的权限
<a name="auth-and-access_examples_batch"></a>

**Example 批量读取一组密钥**  
您可以通过将以下策略附加到身份来授予在批处理 API 调用中检索一组秘密的访问权限。该策略限制了调用方，因此即使批量调用包含其他密钥 *SecretARN1**SecretARN2*，他们也只能检索*SecretARN3*、和指定的密钥。如果调用方还在批处理 API 调用中请求其他秘密，则 Secrets Manager 将不会返回它们。有关更多信息，请参阅[`BatchGetSecretValue`。](https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_BatchGetSecretValue.html) 。    
****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
{
  "Effect": "Allow",
  "Action": [
    "secretsmanager:BatchGetSecretValue",
    "secretsmanager:ListSecrets"
  ],
  "Resource": "*"
},
{
  "Effect": "Allow",
  "Action": [
    "secretsmanager:GetSecretValue"
  ],
  "Resource": [
    "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName1-AbCdEf",
    "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName2-AbCdEf",
    "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName3-AbCdEf"
    ]
}
]
}
```

## 示例：通配符
<a name="auth-and-access_examples_wildcard"></a>

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

**Example 访问路径中的所有密钥**  
以下策略授予检索名称以 “*TestEnv/*” 开头的所有密钥的权限。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:TestEnv/*"
    }
}
```

**Example 访问所有密钥的元数据**  
以下策略授予 `DescribeSecret` 和权限开头为 `List`：`ListSecrets` 和 `ListSecretVersionIds`。    
****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": {
"Effect": "Allow",
"Action": [
  "secretsmanager:DescribeSecret",
  "secretsmanager:List*"
],
"Resource": "*"
}
}
```

**Example 匹配密钥名称**  
以下策略按名称授予密钥的所有 Secrets Manager 权限。要使用该策略，请参阅 [基于身份的策略](#auth-and-access_iam-policies)。  
要匹配密钥名称，可以通过将区域、账户 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:us-east-1:123456789012:secret:a_specific_secret_name-a1b2c3",
                "arn:aws:secretsmanager:us-east-1:123456789012:secret:another_secret_name-??????"
            ]
        }
    ]
}
```

## 示例：创建密钥的权限
<a name="auth-and-access_examples_create"></a>

要为用户授予权限创建密钥，我们建议您将权限策略附加到用户所属的 IAM 组。请参阅 [IAM 用户组](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)。

**Example 创建密钥**  
以下策略授予创建密钥和查看密钥列表的权限。要使用该策略，请参阅 [基于身份的策略](#auth-and-access_iam-policies)。    
****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
{
  "Effect": "Allow",
  "Action": [
    "secretsmanager:CreateSecret",
    "secretsmanager:ListSecrets"
  ],
  "Resource": "*"
}
]
}
```

## 示例：拒绝使用特定 Amazon KMS 密钥来加密机密
<a name="auth-and-access_examples_kmskey"></a>

**重要**  
要拒绝客户自主管理型密钥，我们建议您使用密钥策略或密钥授予来限制访问权限。有关更多信息，请参阅《*Amazon Key Management Service 开发人员指南*》中的 [Authentication and access control for Amazon KMS](https://docs.amazonaws.cn/kms/latest/developerguide/control-access.html)。

**Example 拒绝 Amazon 托管密钥 `aws/secretsmanager`**  
以下策略拒绝使用来创建或更新密钥。 Amazon 托管式密钥 `aws/secretsmanager`此策略要求使用客户自主管理型密钥来加密密钥。该策略包含两条语句：  

1. 第一条语句拒绝使用创建或更新密钥的请求 Amazon 托管式密钥 `aws/secretsmanager`。`Sid: "RequireCustomerManagedKeysOnSecrets"`

1. 第二条语句拒绝创建不包含 KMS 密钥的密钥的请求，因为 Secrets Manager 会默认使用 Amazon 托管式密钥 `aws/secretsmanager`。`Sid: "RequireKmsKeyIdParameterOnCreate"`  
****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
  {
      "Sid": "RequireCustomerManagedKeysOnSecrets",
      "Effect": "Deny",
      "Action": [
          "secretsmanager:CreateSecret",
          "secretsmanager:UpdateSecret"
      ],
      "Resource": "*",
      "Condition": {
          "StringLikeIfExists": {
              "secretsmanager:KmsKeyArn": "<key_ARN_of_the_AWS_managed_key>"
          }
      }
  },
  {
      "Sid": "RequireKmsKeyIdParameterOnCreate",
      "Effect": "Deny",
      "Action": "secretsmanager:CreateSecret",
      "Resource": "*",
      "Condition": {
          "Null": {
              "secretsmanager:KmsKeyArn": "true"
          }
      }
  }
]
}
```

# 基于资源的策略
<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"
    }
  }

}
]
}
```

# 使用基于属性的访问权限控制（ABAC）控制对密钥的访问
<a name="auth-and-access-abac"></a>

基于属性的访问权限控制（ABAC）是一种授权策略，它根据用户、数据或环境（例如部门、业务部门或可能影响授权结果的其他因素）的属性或特征来定义权限。在中 Amazon，这些属性称为*标签*。

使用标签控制权限在快速增长的环境中非常有用，并在策略管理变得繁琐的情况下可以提供帮助。ABAC 规则是在运行时动态评估的，这意味着用户对应用程序和数据的访问以及允许的操作类型会根据策略中的上下文因素自动改变。例如，如果用户更改部门，则访问权限会自动调整，而无需更新权限或请求新角色。有关更多信息，请参阅：[ABAC 有什么用 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)？ ，[根据标签定义访问密钥的权限。](https://docs.amazonaws.cn/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html) ，然后[使用带有 IAM 身份中心的 ABAC 来扩展 Secrets Manager 的授权需求](https://www.amazonaws.cn/blogs/security/scale-your-authorization-needs-for-secrets-manager-using-abac-with-iam-identity-center/)。

## 示例：允许身份访问具有特定标签的密钥
<a name="tag-secrets-abac"></a>

以下策略允许`DescribeSecret`访问带有密钥*ServerName*和值的标签的机密*ServerABC*。如果将此策略附加到某个身份，则该身份有权访问账户中带有该标签的任何密钥。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
  "Effect": "Allow",
  "Action": "secretsmanager:DescribeSecret",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "secretsmanager:ResourceTag/ServerName": "ServerABC"
      }
    }
  }
}
```

------

## 示例：仅允许访问标签与密钥的标签匹配的身份
<a name="auth-and-access_tags2"></a>

以下策略允许账户中的任何身份对账户中身份的 *`AccessProject`* 标签与密钥的 *`AccessProject`* 标签具有相同值的任何密钥具有 `GetSecretValue` 访问权限。

------
#### [ JSON ]

****  

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

------

# Amazon 的托管策略 Amazon Secrets Manager
<a name="reference_available-policies"></a>

 Amazon 托管策略是由创建和管理的独立策略 Amazon。 Amazon 托管策略旨在为许多常见用例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住， Amazon 托管策略可能不会为您的特定用例授予最低权限权限，因为它们可供所有 Amazon 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 Amazon 托管策略中定义的权限。如果 Amazon 更新 Amazon 托管策略中定义的权限，则更新会影响该策略所关联的所有委托人身份（用户、组和角色）。 Amazon 最有可能在启动新的 API 或现有服务可以使用新 Amazon Web Services 服务 的 API 操作时更新 Amazon 托管策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管式策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## Amazon 托管策略： SecretsManagerReadWrite
<a name="security-iam-awsmanpol-SecretsManagerReadWrite"></a>

本政策提供 read/write 访问权限 Amazon Secrets Manager，包括描述亚马逊 RDS、Amazon Redshift 和 Amazon DocumentDB 资源的权限，以及 Amazon KMS 用于加密和解密密密钥的权限。该策略还允许创建 Amazon CloudFormation 变更集、从由管理的 Amazon S3 存储桶获取轮换模板 Amazon、列出 Amazon Lambda 函数以及描述 Amazon EC2 VPCs。控制台需要这些权限才能使用现有的轮换函数设置轮换。

要创建新的轮换函数，您还必须拥有创建 Amazon CloudFormation 堆栈和 Amazon Lambda 执行角色的权限。您可以分配[IAMFull访问](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/IAMFullAccess.html)管理策略。请参阅[轮换权限](rotating-secrets-required-permissions-function.md)。

**权限详细信息**

该策略包含以下权限。




+ `secretsmanager` – 允许主体执行所有 Secrets Manager 操作。
+ `cloudformation`— 允许委托人创建 Amazon CloudFormation 堆栈。这是必需的，以便使用控制台开启轮换功能的委托人可以通过堆栈创建 Lambda 轮换函数 Amazon CloudFormation 。有关更多信息，请参阅 [Secrets Manager 的使用方式 Amazon CloudFormation](cloudformation.md#how-asm-uses-cfn)。
+ `ec2`— 允许委托人描述 Amazon EC2 VPCs。这是必需的条件，这样使用控制台的主体才能在与其存储在密钥中的凭证数据库相同的 VPC 中创建轮换函数。
+ `kms`— 允许委托人使用 Amazon KMS 密钥进行加密操作。这是必需的条件，这样 Secrets Manager 才能加密和解密密钥。有关更多信息，请参阅 [中的秘密加密和解密 Amazon Secrets Manager](security-encryption.md)。
+ `lambda` – 允许主体列出 Lambda 轮换函数。这是必需的条件，以便使用控制台的主体可以选择现有的轮换函数。
+ `rds` – 允许主体描述 Amazon RDS 中的集群和实例。这是必需的条件，以便使用控制台的主体可以选择 Amazon RDS 集群或实例。
+ `redshift` – 允许主体描述 Amazon Redshift 中的集群。这是必需的条件，以便使用控制台的主体可以选择 Amazon Redshift 集群。
+ `redshift-serverless` – 允许主体描述 Amazon Redshift Serverless 中的命名空间。这是必需的，以便使用控制台的主体可以选择 Amazon Redshift Serverless 命名空间。
+ `docdb-elastic` – 允许主体描述 Amazon DocumentDB 中的弹性集群。这是必需的条件，以便使用控制台的主体可以选择 Amazon DocumentDB 弹性集群。
+ `tag` – 允许主体获取账户中所有已标记的资源。
+ `serverlessrepo`— 允许委托人创建 Amazon CloudFormation 更改集。这是必需的条件，以便使用控制台的主体可以创建 Lambda 轮换函数。有关更多信息，请参阅 [Secrets Manager 的使用方式 Amazon CloudFormation](cloudformation.md#how-asm-uses-cfn)。
+ `s3`— 允许委托人从由 Amazon管理的 Amazon S3 存储桶中获取对象。此存储桶包含 Lambda [轮换函数模板](reference_available-rotation-templates.md)。此权限是必需的，这样使用控制台的主体才能根据存储桶中的模板创建 Lambda 轮换函数。有关更多信息，请参阅 [Secrets Manager 的使用方式 Amazon CloudFormation](cloudformation.md#how-asm-uses-cfn)。

要查看该政策，请参阅 [SecretsManagerReadWrite JSON 策略文档](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/SecretsManagerReadWrite.html#SecretsManagerReadWrite-json)。

## Amazon 托管策略： AWSSecretsManagerClientReadOnlyAccess
<a name="security-iam-awsmanpol-AWSSecretsManagerClientReadOnlyAccess"></a>

此策略为客户端应用程序提供对 Amazon Secrets Manager 密钥的只读访问权限。它允许委托人检索机密值和描述机密元数据，以及解密使用客户管理的密钥加密的机密所需的 Amazon KMS 权限。

**权限详细信息**

该策略包含以下权限。
+ `secretsmanager`— 允许委托人检索机密值并描述机密元数据。
+ `kms`— 允许委托人使用密钥解密机密。 Amazon KMS 此权限的范围仅限于 Secrets Manager 在特定服务条件下使用的密钥。

要查看有关策略（包括 JSON 策略文档的最新版本）的更多信息，请参阅《Amazon 托管式策略参考指南》**中的 [AWSSecretsManagerClientReadOnlyAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSSecretsManagerClientReadOnlyAccess.html)。

## Secrets Manager 对 Amazon 托管策略的更新
<a name="security-iam-awsmanpol-updates"></a>

查看有关 Secrets Manager Amazon 托管策略更新的详细信息。


| 更改 | 描述 | 日期 | 版本 | 
| --- | --- | --- | --- | 
|  [AWSSecretsManagerClientReadOnlyAccess](#security-iam-awsmanpol-AWSSecretsManagerClientReadOnlyAccess)：新托管策略  |  Secrets Manager 创建了一个新的托管策略，为客户端应用程序提供对密钥的只读访问权限。此策略允许检索机密值和描述机密元数据，并具有解密密钥所需的 Amazon KMS 权限。  | 2025 年 11 月 5 日 | v1 | 
|  [SecretsManagerReadWrite](#security-iam-awsmanpol-SecretsManagerReadWrite)：对现有策略的更新  |  此策略已更新，允许描述访问 Amazon Redshift Serverless 的权限，以便控制台用户可在创建 Amazon Redshift 密钥时选择 Amazon Redshift Serverless 命名空间。  | 2024 年 3 月 12 日 | v5 | 
|  [SecretsManagerReadWrite](#security-iam-awsmanpol-SecretsManagerReadWrite)：对现有策略的更新  |  此策略已更新，允许描述访问 Amazon DocumentDB 弹性集群的权限，以便控制台用户可在创建 Amazon DocumentDB 密钥时选择弹性集群。  | 2023 年 9 月 12 日 | v4 | 
|  [SecretsManagerReadWrite](#security-iam-awsmanpol-SecretsManagerReadWrite)：对现有策略的更新  |  此策略已更新，允许描述访问 Amazon Redshift 的权限，以便控制台用户可在创建 Amazon Redshift 密钥时选择 Amazon Redshift 集群。此更新还增加了新的权限，允许对存储 Lambda 轮换函数模板 Amazon 的 Amazon S3 存储桶进行读取访问。  | 2020 年 6 月 24 日 | v3 | 
|  [SecretsManagerReadWrite](#security-iam-awsmanpol-SecretsManagerReadWrite)：对现有策略的更新  |  此策略已更新，允许描述访问 Amazon RDS 集群的权限，以便控制台用户可在创建 Amazon RDS 密钥时选择集群。  | 2018 年 5 月 3 日 |  v2 | 
|  [SecretsManagerReadWrite](#security-iam-awsmanpol-SecretsManagerReadWrite)：新策略  |  Secrets Manager 创建了一个策略，用于授予使用控制台所需的权限，并授予对 Secrets Manager 的所有 read/write 访问权限。  | 2018 年 04 月 4 日 | v1 | 

# 确定谁有权访问你的 Amazon Secrets Manager 秘密
<a name="determine-acccess_examine-iam-policies"></a>

预设情况下，IAM 身份无权限访问密钥。授权访问密钥时，Secrets Manager 会评估密钥基于资源的策略以及发送请求的 IAM 用户或角色的所有身份策略。为此，Secrets Manager 使用与 *IAM 用户指南*中[确定请求是允许还是拒绝中描述过程类似的过程](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)。

多个策略应用于请求时，Secrets Manager 会使用层次结构控制权限：

1. 如果任何策略中具有显式表达式的语句与请求操作和资源 `deny` 匹配：

   显式表达式 `deny` 覆盖其他所有内容并阻止操作。

1. 如果没有显式表达式 `deny`，但带有显式表达式 `allow` 与请求操作和资源匹配：

   显式表达式 `allow` 授予请求中的操作访问语句中资源的权限。

   如果身份和密钥位于两个不同的账户中，则该密钥的资源策略和附加到身份的策略`allow`中都必须有，否则会 Amazon 拒绝请求。有关更多信息，请参阅 [跨账户访问](auth-and-access_examples_cross.md)。

1. 如果没有带显式表达式 `allow` 与请求操作和资源相匹配：

   Amazon 默认情况下拒绝请求，这称为*隐*式拒绝。

**查看密钥基于资源的策略**
+ 请执行以下操作之一：
  + 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.amazonaws.cn/secretsmanager/)。在您的密钥详细信息页面中，在**资源权限**部分，选择**编辑权限**。
  + 使用 to Amazon CLI call [https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/get-resource-policy.html](https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/get-resource-policy.html)或 Amazon SDK 进行通话[https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_GetResourcePolicy.html](https://docs.amazonaws.cn/secretsmanager/latest/apireference/API_GetResourcePolicy.html)。

**确定哪些人可以通过基于身份的策略进行访问**
+ 使用 IAM 策略模拟器。参见[用 IAM policy simulator 测试 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_testing-policies.html)

# 从其他账户访问 Amazon Secrets Manager 密钥
<a name="auth-and-access_examples_cross"></a>

一个账户中的用户可以访问另一个账户中的密钥（*跨账户访问*），您必须允许在资源策略和身份策略中进行访问。这与授予密钥所在账户中的身份访问权限不同。

跨账户权限仅对以下操作有效：
+ [CancelRotateSecret](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_CancelRotateSecret.html)
+ [DeleteResourcePolicy](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_DeleteResourcePolicy.html)
+ [DeleteSecret](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_DeleteSecret.html)
+ [DescribeSecret](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_DescribeSecret.html)
+ [GetRandomPassword](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_GetRandomPassword.html)
+ [GetResourcePolicy](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_GetResourcePolicy.html)
+ [GetSecretValue](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_GetSecretValue.html)
+ [ListSecretVersionIds](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_ListSecretVersionIds.html)
+ [PutResourcePolicy](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_PutResourcePolicy.html)
+ [PutSecretValue](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_PutSecretValue.html)
+ [RemoveRegionsFromReplication](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_RemoveRegionsFromReplication.html)
+ [ReplicateSecretToRegions](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_ReplicateSecretToRegions.html)
+ [RestoreSecret](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_RestoreSecret.html)
+ [RotateSecret](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_RotateSecret.html)
+ [StopReplicationToReplica](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_StopReplicationToReplica.html)
+ [TagResource](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_TagResource.html)
+ [UntagResource](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_UntagResource.html)
+ [UpdateSecret](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_UpdateSecret.html)
+ [UpdateSecretVersionStage](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_UpdateSecretVersionStage.html)
+ [ValidateResourcePolicy](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_ValidateResourcePolicy.html)

您可以将`BlockPublicPolicy`参数与[PutResourcePolicy](https://docs.amazonaws.cn//secretsmanager/latest/apireference/API_PutResourcePolicy.html)操作配合使用，防止通过直接附加到您的密钥的资源策略授予公共访问权限，从而帮助保护您的资源。您也可以使用 [IAM Access Analyzer](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#bp-preview-access) 验证跨账户访问权限。

您还必须允许身份使用密钥加密的 KMS 密钥。这是因为您不能使用 Amazon 托管式密钥 (`aws/secretsmanager`) 进行跨账户访问。相反，您必须使用您创建的 KMS 密钥加密密钥，然后随附密钥策略。创建 KMS 密钥需支付费用。要更改密钥的加密密钥，请参阅 [修改密 Amazon Secrets Manager 钥](manage_update-secret.md)。

**重要**  
授予 `secretsmanager:PutResourcePolicy` 权限的基于资源的策略使主体（即使是其他账户中的主体）能够修改基于资源的策略。此权限可让主体升级现有权限，例如获得对密钥的完全管理访问权限。我们建议您对策略应用[最低权限访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)的原则。有关更多信息，请参阅 [基于资源的策略](auth-and-access_resource-policies.md)。

下列示例策略假定您在 *Account1* 中有密钥和加密密钥，而在 *Account2* 的身份希望有访问密钥值的权限。

**步骤 1：将资源策略附加到 *Account1* 中的密钥**
+ 以下策略允许用户*Account2*访问*ApplicationRole*中的密钥*Account1*。要使用该策略，请参阅 [基于资源的策略](auth-and-access_resource-policies.md)。

------
#### [ JSON ]

****  

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

------

**步骤 2：将语句添加到 *Account1* 中 KMS 密钥的密钥策略中**
+ 以下密钥政策语句允许 *Account2* 中的 *ApplicationRole* 使用 *Account1* 中的 KMS 密钥来解密 *Account1* 中的密钥。要使用此语句，请将其添加到 KMS 密钥的密钥策略中。有关更多信息，请参阅[更改密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-modifying.html)。

  ```
  {
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::Account2:role/ApplicationRole"
    },
    "Action": [
      "kms:Decrypt",
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
  ```

**步骤 3：将身份策略附加到 *Account2* 中的身份**
+ 以下策略允许 *Account2* 中的 *ApplicationRole* 访问 *Account1* 中的密钥，并通过使用同样位于 *Account1* 中的加密密钥来解密密钥值。要使用该策略，请参阅 [基于身份的策略](auth-and-access_iam-policies.md)。您可以在 Secrets Manager 控制台的密钥详细信息页面的**密钥 ARN** 下方找到您的密钥 ARN。此外，您也可以调用 [https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/describe-secret.html](https://docs.amazonaws.cn//cli/latest/reference/secretsmanager/describe-secret.html)。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "secretsmanager:GetSecretValue",
              "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
          },
          {
              "Effect": "Allow",
              "Action": "kms:Decrypt",
              "Resource": "arn:aws:kms:us-east-1:123456789012:key/EncryptionKey"
          }
      ]
  }
  ```

------

# 从本地环境访问密钥
<a name="auth-and-access-on-prem"></a>

您可以使用 Ro Amazon Identity and Access Management les Anywhere 在 IAM 中为在外部运行的服务器、容器和应用程序等工作负载获取临时安全证书 Amazon。您的工作负载可以使用与 Amazon 应用程序相同的 IAM 策略和 IAM 角色来访问 Amazon 资源。借助 IAM Roles Anywhere，您可以使用 Secrets Manager 来存储和管理凭证，以便 Amazon 中和应用程序服务器等本地设备上的资源能够访问。有关更多信息，请参阅 [IAM Roles Anywhere 用户指南](https://docs.amazonaws.cn/rolesanywhere/latest/userguide/introduction.html)。