Terraform の state から機密情報を排除する方法として、以前下記の記事を書きました。
しかし HCP Vault Secret の廃止に伴い使用できなくなったため、現在利用可能な方法を紹介します。
vault provider が一部の ephemeral resource に対応したので、HCP Vault Dedicated や OSS 版 Vault であれば、state から機密情報を排除できるケースがあります。
検証すること
vault server -dev を実行して OSS 版の Vault を development mode で起動し、下記のように機密情報を設定しました。
この Vault に設定した test-string という文字列が state に保存されない構成を確認・検証します。
従来の構成: state に残ってしまうコード
Vault の値の参照に vault_generic_secret 等のデータソースを使用すると、state ファイルに値が記録されてしまいます。
さらに resource ブロックにその値を渡す際、resource ブロックの引数の値も state ファイルに記録されてしまいます。
provider "vault" {}
provider "aws" {
region = "ap-northeast-1"
}
# Vault の参照
data "vault_generic_secret" "sample" {
path = "secret/sample_kv"
}
# 機密情報の利用
resource "aws_ssm_parameter" "secret_value" {
name = "sample_secret"
type = "SecureString"
value = data.vault_generic_secret.sample.data["sample_key"]
}
作成される state は下記です:
{
"version": 4,
"terraform_version": "1.11.1",
"serial": 1,
"lineage": "xx",
"outputs": {},
"resources": [
{
"mode": "data",
"type": "vault_generic_secret",
"name": "sample",
"provider": "provider[\"registry.terraform.io/hashicorp/vault\"]",
"instances": [
{
~略~
"attributes": {
"data": {
"sample_key": "test-string"
},
"data_json": "{\"sample_key\":\"test-string\"}",
"id": "secret/sample_kv",
~略~
}
}
]
},
{
"mode": "managed",
"type": "aws_ssm_parameter",
"name": "secret_value",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
~略~
"value": "test-string",
~略~
vault_generic_secret データソースの情報にも、aws_ssm_parameter リソースの情報にも、test-string という文字列が含まれてしまいました。
ephemeral リソースを利用し、state に保存しないコード
vault provider v5.0.0 から、ephemeral リソース vault_kv_secret_v2 が利用できるようになりました。
このため、kv secrets engine の v2 を使用している場合は、下記のように構成を変更することで、state に機密情報を保存しない構成が可能になります。
provider "vault" {}
provider "aws" {
region = "ap-northeast-1"
}
# ephemeral リソースを使用した Vault の参照
ephemeral "vault_kv_secret_v2" "sample" {
mount = "secret"
name = "sample_kv"
}
# Write-only attributes を用いた書き込み
resource "aws_ssm_parameter" "secret_value" {
name = "sample_secret"
type = "SecureString"
value_wo = ephemeral.vault_kv_secret_v2.sample.data["sample_key"]
value_wo_version = 1
}
作成される state は下記です:
{
"version": 4,
"terraform_version": "1.11.1",
"serial": 3,
"lineage": "xx",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "aws_ssm_parameter",
"name": "secret_value",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"allowed_pattern": "",
"arn": "arn:aws:ssm:ap-northeast-1:xx:parameter/sample_secret",
"data_type": "text",
"description": "",
"has_value_wo": true,
"id": "sample_secret",
"insecure_value": null,
"key_id": "alias/aws/ssm",
"name": "sample_secret",
"overwrite": null,
"region": "ap-northeast-1",
"tags": {},
"tags_all": {},
"tier": "Standard",
"type": "SecureString",
"value": "",
"value_wo": null,
"value_wo_version": 1,
"version": 2
},
~略~
ephemeral リソースの情報は state に一切記録されず、aws_ssm_parameter リソースの情報にも test-string という文字列が含まれなくなりました。
