

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

# 限制对机密的访问
<a name="limiting-access"></a>

安全是重中之重 AWS。在 Wel AWS l-Architected Framework 中，安全[存储和使用机密](https://docs.aws.amazon.com/wellarchitected/latest/framework/sec_identities_secrets.html)最佳实践建议您限制对机密的访问权限、记录和审核对机密的访问权限，并建议您通过 API 而不是向个人授予访问权限。这与[使用生成随机密码](generate-random-passwords.md)有关 AWS Secrets Manager，本指南前面已经讨论过。

过去，用于对数据库、第三方 APIs、令牌和其他机密进行身份验证的凭据可能嵌入在源代码或环境文件中。在许多组织中，数据库管理员仍然可以访问所有数据库用户凭据。但是，如果他们不这样做，那就更安全了。我们建议您：
+ 通过附加到[AWS 服务角色或 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)的[用户的 AWS Identity and Access Management (IAM) 策略限制对 Secrets Manager 的](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)访问。
+ 仅通过对 Secrets Manager 的 API 调用来扩展对 Secrets Manager 中密钥的编程访问权限。
+ 避免使用硬编码的密钥。
+ 不要在变量中传递凭证值。
+ 确保密钥直接由应用程序或基础架构使用，而不是由人类用户使用。

以下代码示例显示了在创建数据库时可以用来保护敏感数据的方法。创建数据库时，可以要求用户输入作为密码，然后轮换密码，也可以从一开始就使用随机密码。从一开始就生成随机密码可以帮助您更安全地处理和管理凭证。

以下代码片段创建数据库资源，并从局部`password = local.passwddata`变量中获取密码。

```
resource "aws_db_instance" "default" {
  count                  = var.createdb == true ? 1 : 0
  allocated_storage      = 20
  identifier             = var.identifier
  db_name                = var.databasename
  engine                 = "mysql"
  engine_version         = "8.0.32"
  instance_class         = "db.t3.micro"
  username               = "admin"
  password               = local.passwddata 
  skip_final_snapshot    = true
  publicly_accessible    = false
  vpc_security_group_ids = [aws_security_group.db.id]
  db_subnet_group_name   = aws_db_subnet_group.db.0.name
}
```

以下代码片段创建随机密码或接受用户提供的密码。 Terraform将此密码存储为局部变量，以便稍后在代码中使用此密码变量。

```
locals {
  passwddata = var.passwddata != null ? var.passwddata : data.aws_secretsmanager_random_password.test.random_secrets
}
```