コンテンツにスキップ

Terraform の ephemeral resource と write-only 属性で

tfstate に平文を残さない

こんなことできるんだ。— @pospome

問題: tfstate に秘密情報が平文で保存される

# 従来: random_password の値が tfstate に平文で残る
resource "random_password" "db" {
  length = 32
}

resource "aws_db_instance" "main" {
  password = random_password.db.result  # tfstate に平文保存される!
}

tfstate を S3 に保存していても、アクセスできる人全員がパスワードを見られる状態になる。

解決策 1: ephemeral resource(Terraform 1.10+)

特性 内容
存在タイミング プラン・適用時のみ(メモリ上に存在)
tfstate 残らない
用途 一時的なシークレット・トークンの取得
ephemeral "aws_secretsmanager_secret_version" "db_pass" {
  secret_id = aws_secretsmanager_secret.db.id
}

resource "aws_db_instance" "main" {
  password = ephemeral.aws_secretsmanager_secret_version.db_pass.secret_string
  # ephemeral なので tfstate に保存されない
}

解決策 2: write-only attribute(Terraform 1.11+)

特性 内容
動作 プロバイダが対応した属性は state に書き込まれない
表記 属性名に _wo サフィックス(プロバイダ実装による)
resource "aws_secretsmanager_secret_version" "db" {
  secret_id     = aws_secretsmanager_secret.db.id
  secret_string_wo         = var.db_password  # _wo = write-only
  secret_string_wo_version = 1                # バージョン管理
}
# secret_string_wo の値は tfstate に保存されない

組み合わせによる完全なシークレット管理

(図: SVG)