在 terraform rds 配置中存储 master_username 和 master_password 的更好方法是什么?

问题描述 投票:0回答:3

我需要帮助,了解在 https://www.terraform.io/docs/providers/aws/r/rds_cluster.html 中存储 master_password 的更好方法。目前我在提交到 github 之前用 XXX 进行了屏蔽。您能建议一种更好的存储方法吗?谢谢

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-mysql"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  database_name           = "mydb"
  master_username         = "foo"
  master_password         = "bar"
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
}
amazon-rds terraform
3个回答
0
投票

这是我的解决方案。

(无论如何,你不能隐藏*.tfstate文件的密码,你应该将tfstate文件加密保存在s3中)

terraform plan --var-file master_username=xxxx --var-file master_password=xxxx 

因此您的 tf 文件可以将它们定义为变量。

variable "master_username" {}
variable "master_password" {}

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-mysql"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  database_name           = "mydb"
  master_username         = "${var.master_username}"
  master_password         = "${var.master_password}"
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
}

当使用 CI/CD 管道运行

terraform plan/apply
时,我曾经将密码放入 s3(加密)或 SSM(现在您可以放入 aws Secrets Manager)。因此,编写一个包装器脚本来首先获取这些键/值并提供给 terraform 命令。


0
投票

您最好使用 AWS Secrets Manager,并且根本不在状态文件中存储任何敏感数据(即使您的状态文件可能已加密,但最好避免此类实施)。

在这里,我创建了一个 secrets.tf ,它负责生成随机密码并将其存储在 AWS Secrets Manager 中。

resource "random_password" "master"{
  length           = 16
  special          = true
  override_special = "_!%^"
}

resource "aws_secretsmanager_secret" "password" {
  name = "${var.environment}-${var.service_name}-primary-cluster-password"
}

resource "aws_secretsmanager_secret_version" "password" {
  secret_id = aws_secretsmanager_secret.password.id
  secret_string = random_password.master.result
}

现在,为了在 tf 应用期间获取数据,我使用数据提供程序(这会在应用期间动态从 AWS 获取数据):

data "aws_secretsmanager_secret" "password" {
  name = "${var.environment}-${var.service_name}-primary-cluster-password"

}

data "aws_secretsmanager_secret_version" "password" {
  secret_id = data.aws_secretsmanager_secret.password.id
}
 

然后我在 Aurora 集群中引用它们,如下所示:

resource "aws_rds_global_cluster" "main" {
  global_cluster_identifier = "${var.environment}-${var.service_name}-global-cluster"
  engine                    = "aurora"
  engine_version            = "5.6.mysql_aurora.1.22.2"
  database_name             = "${var.environment}-${var.service_name}-global-cluster"
}

resource "aws_rds_cluster" "primary" {
  provider                  = aws
  engine                    = aws_rds_global_cluster.main.engine
  engine_version            = aws_rds_global_cluster.main.engine_version
  cluster_identifier        = "${var.environment}-${var.service_name}-primary-cluster"
  master_username           = "dbadmin"
  master_password           = data.aws_secretsmanager_secret_version.password
  database_name             = "example_db"
  global_cluster_identifier = aws_rds_global_cluster.main.id
  db_subnet_group_name      = "default"
}

希望这有帮助。


0
投票

自 AWS Provider 版本 5.8.0 起,有一个名为

manage_master_user_password
的新属性,可用作
secret
的替代属性。我改用了较新的方法,因为我发现在配置基础设施后,根密码与 Secrets Manager 中存储的秘密不一致,即使它在提供程序的 4.0.0 版本中工作得很好(我升级了提供者)。使用新方法,我确认在创建资源并访问 RDS 控制台后,选中了“在 AWS Secrets Manager 中管理主凭证”选项,并在 Secrets Manager 中自动创建了相应的密钥,甚至无需预置密钥管理器资源直接。还有一个
master_user_secret
块来指定秘密选项。

© www.soinside.com 2019 - 2024. All rights reserved.