機能
Terraformのビルドで使用するシークレットをKeeperボルトから取得します
Terraformのビルドスクリプトにクレデンシャルを直接注入します
Keeperシークレットマネージャー機能の完全なリストについては、概要のページをご参照ください。
要件
本ページでは、シークレットマネージャーとTerraformとの連携について説明します。この連携を利用するための要件は以下のとおりです。
Keeperシークレットマネージャーへのアクセス (詳細は、クイックスタートガイドをご参照ください)
Keeperアカウントのシークレットマネージャーアドオンの有効化
シークレットマネージャー強制ポリシーが有効化されたロールを割り当てられたメンバーシップ
概説
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
mkdir -p ~/.terraform.d/plugins/github.com/keeper-security/secretsmanager && \
cd ~/.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_darwin_amd64.zip
mkdir -p ~/.terraform.d/plugins/github.com/keeper-security/secretsmanager && \
cd ~/.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_linux_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。
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_bank_account"
"secretsmanager_bank_card"
"secretsmanager_birth_certificate"
"secretsmanager_database_credentials"
"secretsmanager_drivers_license"
"secretsmanager_encrypted_notes"
"secretsmanager_health_insurance"
"secretsmanager_membership"
"secretsmanager_passport"
"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_uid
とtitle
、および各レコードフィールドの値が必要となります。
ログインリソースの例
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」フィールドを持つオブジェクトを受け取るなど、異なる場合があります。
各フィールドの値の形式については、リソースのドキュメントをご参照ください。
フィールドの設定を指定
各フィールドは、様々な設定で構成できます。
Trueの場合、このフィールドはKeeperボルトで必須と見なされます
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フォルダをご参照ください。