Terraformプラグイン

Terraformビルドでシークレットにアクセス

機能

  • Terraformのビルドで使用するシークレットをKeeperボルトから取得します

  • Terraformのビルドスクリプトにクレデンシャルを直接注入します

  • Keeperボルトからファイルを取得します

Keeperシークレットマネージャー機能の完全なリストについては、概要のページをご参照ください。

要件

本ページでは、シークレットマネージャーとTerraformとの連携について説明します。この連携を利用するための要件は以下のとおりです。

概説

Keeper Terraformプラグインは、Keeperシークレットマネージャーを利用して、Keeperボルトに保存されたシークレットのクレデンシャルへのアクセスを提供します。 Keeper Terraformプラグインは、Keeperのゼロ知識インフラストラクチャを使用して、Terraformのビルドにシークレットを安全に直接注入できます。

インストール

レジストリのインストール

Keeperシークレットマネージャープロバイダのページはこちらです

このプロバイダをインストールするには、Terraformの設定に以下のコードを追加して、terraform initを実行します。

terraform {
  required_providers {
    secretsmanager = {
      source = "keeper-security/secretsmanager"
      version = ">= 1.0.0"
    }
  }
}

provider "secretsmanager" {
  # Configuration options
}

手動インストール

GitHubリリースページからご利用のプラットフォーム用の最新バージョンのTerraformプロバイダをダウンロードし、そのアーカイブを対応するTerraformプラグインフォルダにコピーします (パスに不足しているフォルダがあれば作成します)。完全なプロバイダURLでソースを初期化します ( "github.com/keeper-security/secretsmanager")。

SETLOCAL EnableExtensions && ^
mkdir %APPDATA%\.terraform.d\plugins\github.com\keeper-security\secretsmanager && ^
cd %APPDATA%\.terraform.d\plugins\github.com\keeper-security\secretsmanager && ^
curl -SfLOJ https://github.com/keeper-security/terraform-provider-secretsmanager/releases/download/v1.0.0/terraform-provider-secretsmanager_1.0.0_windows_amd64.zip

Terraformプロバイダを手動でインストールする方法については、Terraformの公式ドキュメントをご参照ください。

使用方法

プロバイダを設定

Keeperシークレットマネージャープロバイダを使用して、Keeperシークレットマネージャーでサポートされているリソースと連携します。プロバイダを使用できるようにするには、Keeperのクレデンシャルを使用してプロバイダを設定する必要があります。

terraform {
  required_providers {
    secretsmanager = {
      source  = "keeper-security/secretsmanager"
      version = ">= 1.0.0"
    }
 }
}

provider "secretsmanager" {
  # 設定内容を文字列で指定するか、ファイルから読み込みます
  # credential = "<CONFIG FILE CONTENTS BASE64>"
  credential = file("/path/to/config.json")
}

構成ファイルの内容

  • app_key - (必須) アプリケーションキー。

  • client_id - (必須) クライアントID。

  • private_key - (必須) 秘密鍵。

  • hostname - (オプション) デフォルトでは、プラグインはkeepersecurity.comに接続します

シークレットマネージャーの構成の作成について、詳しくはこちらのページのをご参照ください。

データソースを使用してシークレットを取得

Keeperの標準レコードタイプごとにデータソースが用意されているため、シークレットのクレデンシャルを簡単に取得できます。

データソースには、以下の形式を使用してアクセスします。

data "<data_source_name>" "<record_type_reference>" {
    path = "<record_uid>"
}

たとえば、ログインタイプのレコードを使用する場合は、以下のようになります。

data "secretsmanager_login" "my_login_record" {
    path = "<RECORD_UID>"
}

ユーザーが定義したレコードタイプの追加のカスタムフィールドまたは標準フィールドにアクセスするには、secretsmanager_fieldデータソースを使用します。

サポートされているレコードタイプの一覧

レコードタイプ
データソース名

"secretsmanager_address"

"secretsmanager_bank_account"

"secretsmanager_bank_card"

"secretsmanager_birth_certificate"

"secretsmanager_contact"

"secretsmanager_database_credentials"

"secretsmanager_drivers_license"

"secretsmanager_encrypted_notes"

"secretsmanager_field"

"secretsmanager_file"

"secretsmanager_health_insurance"

"secretsmanager_login"

"secretsmanager_membership"

"secretsmanager_passport"

"secretsmanager_photo"

"secretsmanager_record"

"secretsmanager_server_credentials"

"secretsmanager_software_license"

"secretsmanager_ssh_keys"

"secretsmanager_ssn_card"

各データソースで使用可能なフィールドについては、レコードタイプのデータソースリファレンスをご参照ください。

レコードタイプの詳細は、レコードタイプのドキュメントをご参照ください

レコードフィールドにアクセス

レコードのフィールドに保存されたシークレットのクレデンシャルにアクセスするには、データソースの一部としてフィールドにアクセスします。

タイプ指定されたレコードのデータソースのフィールドにアクセス

以下の形式を使用して、タイプ指定されたデータリソースのフィールドにアクセスします。

${ data.<data_source_name>.<record_type_reference>.<field> }

以下は、ログインタイプのデータソースのパスワードへのアクセスとなります。

${ data.secretsmanager_login.my_login_secret.password }

フィールドデータソースを使用し、Keeper表記法でレコード内の任意のフィールドを照会

"secretsmanager_field"データソースタイプを使用してデータソースを作成し、pathプロパティでフィールドクエリを指定します。

data "secretsmanager_field" "my_field" {
  path = "<record UID>/field/login"
}

フィールドクエリでは、"<UID>/field/<field type>"という形式が使用されます。

リソースを使用したレコードの作成

Keeperでは、上記の主要なKeeperレコードタイプ用のTerraformリソースがご利用になれます。 これらのリソースを利用し、KeeperシークレットマネージャーのTerraformプラグインを使用してKeeperのレコードを作成できます。

レコードを作成するには、使用したいレコードタイプに対応するリソースを使用します。

各レコードのリソースには、少なくともfolder_uidtitle、および各レコードフィールドの値が必要となります。

ログインリソースの例

resource "secretsmanager_login" "login" {
    folder_uid:"4PbDLf8UF4od87wJt-fdyQ"
    tile:"My Login Record"
    [...]
}

フォルダUID

レコードを作成するには、Keeperシークレットマネージャーが新しいレコードを作成する場所を認識できるように、フォルダのUIDが必要となります。

フォルダUIDは、KeeperボルトまたはKeeperコマンダーを使用して確認できます。

指定したフォルダには、Terraformプラグインで使用されているKeeperシークレットマネージャーアプリケーションがアクセスできる必要があります。また、Keeperシークレットマネージャーによって使用される前に、フォルダに少なくとも1つのレコードが格納されている必要があります。

タイトル

レコードタイトル。

レコードフィールド

レコードの各フィールドの値と設定は、リソースで設定できます。 レコードタイプごとの利用可能なフィールドについては、リソース定義をご参照ください。

各フィールドは、リソース内ではオブジェクトとして表記されます。

ログインフィールドの例

resource "secretsmanager_login" "login" {
    [...]
    login {
        value = "MyUsername"
        label = "Username"
	required = true
    }
}

フィールド値を設定

各フィールドの値を設定するには、valueフィールドを使用してください。フィールドの形式については、loginフィールドタイプは文字列を受け取りますが、nameフィールドは「first」「middle」「last」フィールドを持つオブジェクトを受け取るなど、異なる場合があります。

各フィールドの値の形式については、リソースのドキュメントをご参照ください。

フィールドの設定を指定

各フィールドは、様々な設定で構成できます。

フィールド
有効な値
説明

label

string

フィールドラベル

required

boolean

Trueの場合、このフィールドはKeeperボルトで必須と見なされます

privacy_screen

boolean

Trueの場合、このフィールドはKeeperボルトで非表示になります

パスワードフィールド

パスワードフィールドにはいくつかの特別な機能があります。

パスワード生成

Terraformプラグインを使用して作成されたレコードには、パスワードが自動的に生成されます。 プラグインでパスワードを生成するには、パスワードにvalueフィールドを指定せず、代わりにgenerate = "True"を使用します

パスワード生成は、complexityフィールドを使用して、指定した長さのパスワードを生成するように設定できます。

complexity {
    length:16
}

また、パスワードフィールドには、enforce_generationという設定があります。これがtrueの場合、パスワードの生成のみを可能にし、ユーザーによるパスワード設定はできないようにKeeperボルトに強制適用します。

Terraformにパスワードを再生成させるには、generateフィールドの相違を認識させる必要があります。 相違を認識できるように、generateフィールドは「true」と「yes」の両方の値を受け入れます。 一方から他方への変更が再生成のトリガーになります。

クレデンシャルの読み取り

この例では、Keeperシークレットマネージャーをプロビジョニングして、ログインタイプのデータソースを読み取り、データソースの各フィールドにアクセスします。

terraform {
  required_providers {
    secretsmanager = {
      source  = "keeper-security/secretsmanager"
      version = ">= 1.0.0"
    }
    local = {
      source = "hashicorp/local"
      version = "2.1.0"
    }
  }
}

provider "local" { }
provider "secretsmanager" {
  # 設定内容を文字列で指定するか、ファイルから読み込みます
  # credential = "<CONFIG FILE CONTENTS BASE64>"
  credential = file("~/.keeper/ksm-config.json")
}

data "secretsmanager_login" "db_server" {
  path        = "<record UID>"
}

resource "local_file" "out" {
    filename        = "${path.module}/out.txt"
    file_permission = "0644"
    content         = <<EOT
UID:   ${ data.secretsmanager_login.db_server.path }
Type:  ${ data.secretsmanager_login.db_server.type }
Title: ${ data.secretsmanager_login.db_server.title }
Notes:  ${ data.secretsmanager_login.db_server.notes }
======
Login:   ${ data.secretsmanager_login.db_server.login }
Password:${ data.secretsmanager_login.db_server.password }
URL:     ${ data.secretsmanager_login.db_server.url }
TOTP:
-----
%{ for t in data.secretsmanager_login.db_server.totp ~}
URL:   ${ t.url }
Token: ${ t.token }
TTL:    ${ t.ttl }
%{ endfor ~}
FileRefs:
---------
%{ for fr in data.secretsmanager_login.db_server.file_ref ~}
UID:     ${ fr.uid }
Title:   ${ fr.title }
Name:    ${ fr.name }
Type:    ${ fr.type }
Size:    ${ fr.size }
Last Modified: ${ fr.last_modified }
Content/Base64: ${ fr.content_base64 }
%{ endfor ~}
EOT
}

output "db_secret_login" {
  value = data.secretsmanager_login.db_server.login
}

Keeperのレコードを作成

terraform {
  required_version = ">= 1.0.0"
  required_providers {
    secretsmanager = {
      source  = "keeper-security/secretsmanager"
      version = ">= 1.1.0"
    }
    local = {
      source = "hashicorp/local"
      version = "2.1.0"
    }
  }
}

provider "local" { }
provider "secretsmanager" {
  # 設定内容を文字列で指定するか、ファイルから読み込みます
  # credential = "<CONFIG FILE CONTENTS BASE64>"
  credential = file("~/.keeper/ksm-config.json")
}

resource "secretsmanager_membership" "membership" {
	folder_uid = "<FOLDER UID>"
	title = "test_membership_resource"
	notes = "test_membership_resource"
	account_number {
		label = "MyAccountNumber"
		required = true
		privacy_screen = true
		value = "AccountNumber#1234"
	}
	name {
		label = "Jane"
		required = true
		privacy_screen = true
		value {
			first = "Jane"
			middle = "D"
			last = "Doe"
		}
	}
	password {
		label = "MyPass"
		required = true
		privacy_screen = true
		enforce_generation = true
		generate = "true"
		complexity {
			length = 16
		}
		#value = "to_be_generated"
	}
}

resource "local_file" "out" {
    filename        = "${path.module}/out.txt"
    file_permission = "0644"
    content         = <<EOT
FUID:  ${ secretsmanager_membership.membership.folder_uid }
UID:   ${ secretsmanager_membership.membership.uid }
Type:  ${ secretsmanager_membership.membership.type }
Title: ${ secretsmanager_membership.membership.title }
Notes:  ${ secretsmanager_membership.membership.notes }
======

Account Number:
---------------
%{ for n in secretsmanager_membership.membership.account_number ~}
Type:  ${ n.type }
Label:  ${ n.label }
Required:  ${ n.required }
Privacy Screen:  ${ n.privacy_screen }
Value:   ${ n.value }
%{ endfor }

Name:
-----
%{ for n in secretsmanager_membership.membership.name ~}
Type:	${ n.type }
Label:	${ n.label }
Required:	${ n.required }
Privacy Screen:  ${ n.privacy_screen }
First Name:		${ n.value.0.first }
Middle Name:	${ n.value.0.middle }
Last Name:		${ n.value.0.last }
%{ endfor }

Password:
---------
%{ for n in secretsmanager_membership.membership.password ~}
Type:  ${ n.type }
Label:	${ n.label }
Required:  ${ n.required }
Privacy Screen:		${ n.privacy_screen }
Enforce Generation:	${ n.enforce_generation }
Generate:	%{ if n.generate != null }${n.generate}%{ endif }
Complexity:	Length = ${ n.complexity.0.length }
Value:   ${ n.value }
%{ endfor }

EOT
}

output "record_uid" {
  value = secretsmanager_membership.membership.uid
}
output "record_title" {
  value = secretsmanager_membership.membership.title
}

その他の例については、ソースコードのexamplesフォルダをご参照ください。

最終更新