

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

# AWS Secrets Manager 最佳实践
<a name="best-practices"></a>

Secrets Manager 提供了在您开发和实施自己的安全策略时需要考虑的大量安全功能。以下最佳实操是一般准则，并不代表完整的安全解决方案。这些最佳实操可能不适合您的环境或不满足您的环境要求，请将其视为有用的考虑因素而不是惯例。

**Topics**
+ [将凭证和其他敏感信息存储在 AWS Secrets Manager](#best-practices-store-secrets-safely)
+ [查找代码中不受保护的密钥](#w2aab9b9)
+ [为您的密钥选择一个加密密钥](#w2aab9c11)
+ [使用缓存来检索密钥](#w2aab9c13)
+ [轮换您的 密钥](#w2aab9c15)
+ [降低使用 CLI 的风险](#w2aab9c17)
+ [限制对密钥的访问](#w2aab9c19)
+ [复制密钥](#w2aab9c21)
+ [监控密钥](#w2aab9c23)
+ [在私有网络上运行基础设施](#w2aab9c25)

## 将凭证和其他敏感信息存储在 AWS Secrets Manager
<a name="best-practices-store-secrets-safely"></a>

Secrets Manager 可帮助您改善安全状况和合规性，并降低未经授权访问您的敏感信息的风险。Secrets Manager 使用您拥有并存储在 AWS Key Management Service (AWS KMS) 中的加密密钥对静态密钥进行加密。当您检索密钥时，Secrets Manager 会解密密钥并通过 TLS 将其安全地传输到您的本地环境。有关更多信息，请参阅 [创建密 AWS Secrets Manager 钥](create_secret.md)。

## 查找代码中不受保护的密钥
<a name="w2aab9b9"></a>

CodeGuru Reviewer 与 Secrets Manager 集成，使用秘密探测器在你的代码中查找未受保护的机密。密钥检测器会搜索硬编码密码、数据库连接字符串、用户名等。有关更多信息，请参阅 [使用 Amazon CodeGuru Reviewer 查找代码中未受保护的机密](integrating-codeguru.md)。

Amazon Q 可以扫描您的代码库以查找安全漏洞和代码质量问题，从而改善整个开发周期内应用程序的状况。有关更多信息，请参阅《*Amazon Q 开发者版用户指南*》中的 [Scanning your code with Amazon Q](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security-scans.html)。

## 为您的密钥选择一个加密密钥
<a name="w2aab9c11"></a>

在大多数情况下，我们建议使用`aws/secretsmanager` AWS 托管密钥来加密机密。使用它不产生任何费用。

为了能够从其他账户访问密钥或将密钥策略应用于加密密钥，请使用客户自主管理型密钥对密钥进行加密。
+ 在密钥策略中，将值 `secretsmanager.<region>.amazonaws.com` 分配给 [https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 条件键。这会将密钥的使用限制为仅限来自 Secrets Manager 的请求。
+ 为了进一步将密钥的使用限制为仅来自 Secrets Manager 且具有正确上下文的请求，请通过创建以下项将 [Secrets Manager 加密上下文](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html#security-encryption-encryption-context)中的键或值用作使用 KMS 密钥的条件：
  + IAM 策略或密钥策略中的[字符串条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)
  + 在授权中创建[授权约束](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)

有关更多信息，请参阅 [中的秘密加密和解密 AWS Secrets Manager](security-encryption.md)。

## 使用缓存来检索密钥
<a name="w2aab9c13"></a>

为了最有效地使用您的密钥，我们建议您使用以下受支持的 Secrets Manager 缓存组件之一来缓存您的密钥并仅在需要时更新它们：
+ [Java 与客户端缓存](retrieving-secrets_cache-java.md)
+ [Python 与客户端缓存](retrieving-secrets_cache-python.md)
+ [.NET 与客户端缓存](retrieving-secrets_cache-net.md)
+ [Go 与客户端缓存](retrieving-secrets_cache-go.md)
+ [Rust 与客户端缓存](retrieving-secrets_cache-rust.md)
+ [AWS 参数和密钥 Lambda 扩展](retrieving-secrets_lambda.md)
+ [在亚马逊 Elastic Kubernetes Service 中使用 AWS Secrets Manager 密钥](integrate_eks.md)
+ 用于[使用代 AWS Secrets Manager 理](secrets-manager-agent.md)在亚马逊弹性容器服务 AWS Lambda、亚马逊弹性容器服务、亚马逊弹性 Kubernetes Service 和亚马逊弹性计算云等环境中对 Secrets Manager 密钥的使用进行标准化。

## 轮换您的 密钥
<a name="w2aab9c15"></a>

如果您很长一段时间未更改密钥，密钥泄露的可能性就会增大。使用 Secrets Manager，您可以设置每四小时自动轮换一次。Secrets Manager 提供了两种轮换策略：[单用户](rotation-strategy.md#rotating-secrets-one-user-one-password) 和 [交替用户](rotation-strategy.md#rotating-secrets-two-users)。有关更多信息，请参阅 [轮换 AWS Secrets Manager 秘密](rotating-secrets.md)。

## 降低使用 CLI 的风险
<a name="w2aab9c17"></a>

使用调用 AWS 操作时，可以在命令 shell 中输入这些命令。 AWS CLI 大多数命令 shell 都提供了可能会泄露您的密钥的功能，例如日志记录和查看上次输入的命令的功能。在使用 AWS CLI 输入敏感信息之前，请务必 [降低使用存储 AWS Secrets Manager 密钥 AWS CLI 的风险](security_cli-exposure-risks.md)。

## 限制对密钥的访问
<a name="w2aab9c19"></a>

在控制对您的密钥的访问的 IAM 策略语句中，使用[最低权限访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)原则。您可以使用 [IAM 角色和策略](auth-and-access_iam-policies.md)、[资源策略](auth-and-access_resource-policies.md)和[基于属性的访问权限控制（ABAC）](auth-and-access-abac.md)。有关更多信息，请参阅 [的身份验证和访问控制 AWS Secrets Manager](auth-and-access.md)。

**Topics**
+ [阻止对密钥的广泛访问](#iam-contextkeys-blockpublicpolicy)
+ [谨慎使用策略中的 IP 地址条件](#iam-contextkeys-ipaddress)
+ [使用 VPC 端点条件限制请求](#iam-contextkeys-vpcendpoint)

### 阻止对密钥的广泛访问
<a name="iam-contextkeys-blockpublicpolicy"></a>

在允许操作 `PutResourcePolicy` 的身份策略中，我们建议您使用 `BlockPublicPolicy: true`。这种情况意味着只有在策略不允许广泛访问的情况下，用户才能将资源策略附加到密钥。

Secrets Manager 使用 Zelkova 自动推理来分析资源策略，以确定是否存在宽泛访问权限问题。有关 Zelkova 的更多信息，请参阅[安全博客上的 “如何 AWS 使用自动推理来帮助您实现大规模](https://aws.amazon.com/blogs/security/protect-sensitive-data-in-the-cloud-with-automated-reasoning-zelkova/) AWS 安全”。

以下示例显示了如何使用 `BlockPublicPolicy`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": "secretsmanager:PutResourcePolicy",
        "Resource": "arn:aws:secretsmanager:{{us-east-1}}:{{123456789012}}:secret:{{secretName-AbCdEf}}",
    "Condition": {
            "Bool": {
                "secretsmanager:BlockPublicPolicy": "true"
            }
        }
    }
}
```

------

### 谨慎使用策略中的 IP 地址条件
<a name="iam-contextkeys-ipaddress"></a>

在允许或拒绝访问 Secrets Manager 的策略语句中指定 [IP 地址条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_IPAddress)或 `aws:SourceIp` 条件键时，请务必小心。例如，如果您将限制对来自公司网络 IP 地址范围的请求 AWS 执行操作的策略附加到密钥，则您作为 IAM 用户从公司网络调用请求的请求将按预期工作。但是，如果您允许其他服务代表您访问密钥，例如使用 Lambda 函数启用轮换，则该函数会从 AWS内部地址空间调用 Secrets Manager 操作。受该策略影响并使用 IP 地址筛选器的请求将会失败。

此外，当请求来自 Amazon VPC 端点时，`aws:sourceIP` 条件键也不起作用。要限制对特定 VPC 端点的请求，请使用 [使用 VPC 端点条件限制请求](#iam-contextkeys-vpcendpoint)。

### 使用 VPC 端点条件限制请求
<a name="iam-contextkeys-vpcendpoint"></a>

要允许或拒绝对来自特定 VPC 或 VPC 端点的请求的访问，请使用 `aws:SourceVpc` 来限制对来自指定 VPC 的请求的访问，或 `aws:SourceVpce` 来限制对来自指定 VPC 端点的请求的访问。请参阅[示例：权限和 VPC](auth-and-access_resource-policies.md#auth-and-access_examples_vpc)。
+ `aws:SourceVpc` 将访问限制为来自指定 VPC 的请求。
+ `aws:SourceVpce` 将访问限制为来自指定 VPC 端点的请求。

如果在允许或拒绝访问 Secrets Manager 密钥的资源策略语句中使用这些条件键，可能会无意中拒绝访问代表您使用 Secrets Manager 访问密钥的服务。只有部分 AWS 服务可以在您的 VPC 内使用终端节点运行。如果将密钥的请求限制为 VPC 或 VPC 端点，则从未针对该服务配置的服务中调用 Secrets Manager 可能会失败。

请参阅[使用 AWS Secrets Manager VPC 终端节点](vpc-endpoint-overview.md)。

## 复制密钥
<a name="w2aab9c21"></a>

Secrets Manager 可以自动将您的密钥复制到多个 AWS 区域，以满足您的弹性或灾难恢复要求。有关更多信息，请参阅 [跨区域复制 AWS Secrets Manager 密钥](replicate-secrets.md)。

## 监控密钥
<a name="w2aab9c23"></a>

Secrets Manager 使您能够通过与 AWS 日志、监控和通知服务集成来审核和监控密钥。有关更多信息，请参阅:
+ [使用记录 AWS Secrets Manager 事件 AWS CloudTrail](monitoring-cloudtrail.md)
+ [AWS Secrets Manager 使用 Amazon 进行监控 CloudWatch](monitoring-cloudwatch.md)
+ [使用以下方法监控 AWS Secrets Manager 密钥的合规性 AWS Config](configuring-awsconfig-rules.md)
+ [监控 Secrets Manager 成本](monitor-secretsmanager-costs.md)
+ [使用 Amazon 检测威胁 GuardDuty](monitoring-guardduty.md)

## 在私有网络上运行基础设施
<a name="w2aab9c25"></a>

我们建议您在无法从私有网络访问的专用网络上运行尽可能多的基础设施。您可以通过创建*接口 VPC 端点*在 VPC 与 Secrets Manager 之间建立私有连接。有关更多信息，请参阅 [使用 AWS Secrets Manager VPC 终端节点](vpc-endpoint-overview.md)。