0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

その vault_generic_secret データソース、ephemeral リソースにできるかも?

0
Posted at

Terraform の state から機密情報を排除する方法として、以前下記の記事を書きました。

しかし HCP Vault Secret の廃止に伴い使用できなくなったため、現在利用可能な方法を紹介します。
vault provider が一部の ephemeral resource に対応したので、HCP Vault Dedicated や OSS 版 Vault であれば、state から機密情報を排除できるケースがあります。

検証すること

vault server -dev を実行して OSS 版の Vault を development mode で起動し、下記のように機密情報を設定しました。

image.png

この Vault に設定した test-string という文字列が state に保存されない構成を確認・検証します。

従来の構成: state に残ってしまうコード

Vault の値の参照に vault_generic_secret 等のデータソースを使用すると、state ファイルに値が記録されてしまいます。

さらに resource ブロックにその値を渡す際、resource ブロックの引数の値も state ファイルに記録されてしまいます。

main.tf
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 は下記です:

terraform.tfstate
{
  "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 に機密情報を保存しない構成が可能になります。

main.tf
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 は下記です:

terraform.tfstate
{
  "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 という文字列が含まれなくなりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?