Vault
Hashicorp

HashiCorp Vault の 機密情報 を PostgreSQL に保存する

はじめに

HashiCopr VaultのチュートリアルはstorageにConsuleを利用する手順になってましたが、クラウドサービスやデータベースも利用可能なようです。今回は機密情報をPostgreSQLに保存させてみました。

参考

公式サイトにはS3やMySQLなど様々なサービスやデータベースをstorageに設定する方法について解説があります。

Storage Backends - Configuration - Vault by HashiCorp

PostgreSQL

URL

DBを作成して、URLを確認する

postgres://<username>:<password>@<host>:<port>/<database>

TABLE / INDEX

Vaultで利用するTABLEとINDEXを作成する

CREATE TABLE vault_kv_store (
  parent_path TEXT COLLATE "C" NOT NULL,
  path        TEXT COLLATE "C",
  key         TEXT COLLATE "C",
  value       BYTEA,
  CONSTRAINT pkey PRIMARY KEY (path, key)
);
CREATE INDEX parent_path_idx ON vault_kv_store (parent_path);

補足:
TABLEの作成を忘れるとVault利用時エラーになる

$ vault init
Error initializing Vault: Error making API request.

URL: PUT http://127.0.0.1:8200/v1/sys/init
Code: 400. Errors:

* failed to check for initialization: pq: relation "vault_kv_store" does not exist

Vault

設定ファイル

設定ファイルでstorageにPostgreSQLを利用するように指定します。

posgre.hcl
storage "postgresql" {
  connection_url = "postgres://<username>:<password>@<host>:<port>/<database>"
}

listener "tcp" {
 address = "127.0.0.1:8200"
 tls_disable = 1
}

# mlockが利用できない環境ではコメントアウトを外す
# disable_mlock = 1

起動

PostgreSQLを利用するように指定した設定ファイルを利用してVaultを起動します。

$ vault server -config=posgre.hcl

実行

基本的な操作が行えることを確認します。

# 環境変数を設定
$ export VAULT_ADDR='http://127.0.0.1:8200'

# 初期化
$ vault init -key-shares=1 -key-threshold=1

# unseal
$ vault unseal <key>

# 認証
$ vault auth <token>

# 機密情報の書き込み
$ vault write secret/hello value=world

# 機密情報の読み込み
$ vault read secret/hello

補足

PostgreSQLのvault_kv_storeテーブルを確認すると暗号化されたデータが書き込まれてることがわかります。

select * from vault_kv_store;

parent_path | path          | key    | value
------------+---------------+--------+----------------
 /logical/  | /logical/.../ | hello  | \x0000000102...