Terraform でRDS の認証情報を tfstate から除外できるか検証してみた
はじめに
クラウド事業本部、あきやまです。
Terraform で RDS インスタンスを構築する際、マスターユーザーのパスワードやユーザー名を指定しますが、これらの認証情報は通常 terraform.tfstate ファイルに平文で保存されてしまいます。要件によっては平文での保存を好ましくない場面もあると思いますので除外できるか検証してみました。
環境
今回の検証で使用した環境は以下の通りです。
| 項目 | バージョン/情報 |
|---|---|
| Terraform | 1.14.3 |
| AWS Provider | ~> 5.0 |
| RDS Engine | Postgresql |
| RDS Instance Class | db.t3.micro |
| リージョン | ap-northeast-1(東京) |
結論
色々調査して行ったところ、passwordについてはEphemeralリソースとWrite-only属性を利用してterraform.tfstateから除外できることを確認できました。
username についてはWrite-only属性が利用できずterraform.tfstateに残ってしまいました。もしいい方法をご存知の方がいらっしゃいましたら教えてください。
やってみた
以下はサンプルファイルになります。
すでにVPCは作成済みでそこにrdsだけを作成しました。
#サブネットグループを作成
resource "aws_db_subnet_group" "example" {
name = example-rds-subnet-group"
subnet_ids = var.private_subnet_ids
}
# ランダムなDB用パスワードを生成
ephemeral "random_password" "db_password" {
length = 16
override_special = "!#$%&*()-_=+[]{}<>:?"
}
# Secrets Managerを作成
resource "aws_secretsmanager_secret" "db_password" {
name = "db_password"
}
# 先ほど作成したDB用パスワードをSecrets Managerに保存
resource "aws_secretsmanager_secret_version" "db_password" {
secret_id = aws_secretsmanager_secret.db_password.id
secret_string_wo = ephemeral.random_password.db_password.result
secret_string_wo_version = 1
}
# Secrets ManagerからDB用パスワードを取得
ephemeral "aws_secretsmanager_secret_version" "db_password" {
secret_id = aws_secretsmanager_secret_version.db_password.secret_id
}
# RDSインスタンスを作成
resource "aws_db_instance" "example" {
instance_class = "db.t3.micro"
allocated_storage = "5"
engine = "postgres"
username = "example"
skip_final_snapshot = true
password_wo = ephemeral.aws_secretsmanager_secret_version.db_password.secret_string
password_wo_version = aws_secretsmanager_secret_version.db_password.secret_string_wo_version
db_subnet_group_name = aws_db_subnet_group.example.name
}
apply後、terraform.tfstateの結果を確認するとしっかりnullとなって除外されていることがわかります。
※usernameについては残っていることが分かります。
"username": "example",
~~~~~
"password": null,
"password_wo": null,
"password_wo_version": 1,
最後に
今回はTerraformのEphemeralリソースとWrite-only属性を利用して、RDSのマスターパスワードを terraform.tfstate から除外する方法を検証しました。
password については無事に除外できましたが、username についてはWrite-only属性が対応しておらず、引き続き terraform.tfstate に残ってしまう結果となりました。
セキュリティ要件が厳しい環境では、tfstateファイル自体をS3 + KMSで暗号化するなど、追加の対策も併せて検討することをおすすめします。







