Terraformプラグイン

TerraformビルドでシークレットにアクセスするためのKeeper Secrets ManagerのTerraformプラグイン

機能

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

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

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

Keeper Secrets Manager機能の完全なリストについては、概要をご参照ください。

前提条件

このページでは、Secrets ManagerとTerraformとの連携について説明します。 この連携を利用するための必要条件は以下のとおりです。

概説

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

インストール

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

Keeper Secrets Managerプロバイダのページはこちらです

このプロバイダをインストールするには、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 Secrets Managerプロバイダを使用して、Keeper Secrets Managerでサポートされているリソースと連携します。プロバイダを使用できるようにするには、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に接続します

Secrets Mangerの設定の作成について詳しくは、設定のドキュメントをご参照ください。

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

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_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 Secrets Manager Terraformプラグインを使用してKeeperの記録を作成できます。

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

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

ログインリソースの例

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

フォルダUID

記録を作成するには、Keeper Secrets Managerが新しい記録を作成する場所を認識できるように、フォルダのUIDが必要です。

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

指定したフォルダには、Terraformプラグインで使用されているKeeper Secrets Managerアプリケーションがアクセスできる必要があります。 また、Keeper Secrets Managerによって使用される前に、フォルダに少なくとも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 Secrets Managerをプロビジョニングして、ログインタイプのデータソースを読み取り、データソースの各フィールドにアクセスします。

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フォルダをご参照ください。

最終更新