機能
Terraformのビルドで使用するシークレットをKeeperボルトから取得します
Terraformのビルドスクリプトにクレデンシャルを直接注入します
Keeper Secrets Manager機能の完全なリストについては、概要をご参照ください。
前提条件
このページでは、Secrets ManagerとTerraformとの連携について説明します。 この連携を利用するための必要条件は以下のとおりです。
Keeper Secrets Managerへのアクセス (詳細は、クイックスタートガイドをご参照ください)
KeeperアカウントのSecrets Managerアドオンの有効化
Secrets Manager強制ポリシーが有効化されたロールを割り当てられたメンバーシップ
概説
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
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 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。
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_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 Secrets Manager Terraformプラグインを使用してKeeperのレコードを作成できます。
レコードを作成するには、使用したいレコードタイプに対応するリソースを使用します。
各レコードのリソースには、少なくともfolder_uid
とtitle
、および各レコードフィールドの値が必要です。
ログインリソースの例
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」フィールドを持つオブジェクトを利用します。
各フィールドの値の形式については、リソースのドキュメントをご参照ください。
フィールドの設定を指定
各フィールドは、様々な設定で構成できます。
フィールド | 有効な値 | 説明 |
---|
| | |
| | Trueの場合、このフィールドはKeeperボルトで必須と見なされます |
| | 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フォルダをご参照ください。