この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
Vault ServerはストレージとしてPostgreSQLが使えます。今回はAmazon Aurora PostgreSQLをストレージとして使ってみます。
やってみた
Amazon Aurora PostgreSQLの準備
以下のようにAmazon Aurora PostgreSQLを構築しました。またセキュリティグループの設定で、Vault ServerとなるEC2から接続を許可しておきます。
サーバ側の作業
Vault Server起動時に指定するConfigファイルを作成します。storage項目でPostgreSQLを指定します。また前回同様にオレオレ証明書でTLSを有効にしています。
storage "postgresql" {
connection_url = "postgres://ADMIN:PASSWORD@aurora-postgresql.XXXXX.ap-northeast-1.rds.amazonaws.com:5432/vault"
}
listener "tcp" {
address = "EC2のプライベートIPアドレス:8200"
tls_cert_file = "/home/ec2-user/vault-server.crt"
tls_key_file = "/home/ec2-user/vault-server.key"
}
PostgreSQLを使う場合のパラメータは以下の通りです。
- connection_url ... PostgreSQLに接続するための情報。ユーザー名とパスワードもここに含めます。
- table ... Vaultが使うテーブル名。デフォルト値はvault_kv_store。存在しない場合に作ってくれるわけではないので、事前に作っておく必要があります。
- max_parallel ... 最大同時並行接続数。デフォルト値は128。
Vault Serverを起動します。Storageがpostgresqlになっています。
$ sudo ./bin/vault server -config=config.hcl
==> Vault server configuration:
Cgo: disabled
Listener 1: tcp (addr: "EC2のプライベートIPアドレス:8200", cluster address: "EC2のプライベートIPアドレス:8201", tls: "enabled")
Log Level: info
Mlock: supported: true, enabled: true
Storage: postgresql
Version: Vault v0.9.3
Version Sha: 7d73ac4c967b3b8726c71e00c017129e1d36ad3c
==> Vault server started! Log data will stream in below:
この時点ではテーブルが存在しません。
$ psql -h aurora-postgresql.XXXXX.ap-northeast-1.rds.amazonaws.com -U ADMIN -d vault
ユーザ ADMIN のパスワード:
psql (9.2.24, サーバー 9.6.3)
注意: psql バージョン 9.2, サーバーバージョン 9.6.
psql の機能の中で、動作しないものがあるかもしれません。
SSL 接続 (暗号化方式: DHE-RSA-AES256-GCM-SHA384, ビット長: 256)
"help" でヘルプを表示します.
vault=> \dt;
リレーションがありません。
vault=>
上述の通り、Vaultはテーブルを自動作成してくれないので、このままクライアント側でinitializeしようとしてもエラーになります。
$ vault operator init -tls-skip-verify
Error initializing: Error making API request.
URL: PUT https://EC2のグローバルIPアドレス:8200/v1/sys/init
Code: 400. Errors:
* failed to check for initialization: pq: relation "vault_kv_store" does not exist
なのでテーブルを作っておきます。
vault=> CREATE TABLE vault_kv_store (
vault(> parent_path TEXT COLLATE "C" NOT NULL,
vault(> path TEXT COLLATE "C",
vault(> key TEXT COLLATE "C",
vault(> value BYTEA,
vault(> CONSTRAINT pkey PRIMARY KEY (path, key)
vault(> );
CREATE TABLE
vault=> CREATE INDEX parent_path_idx ON vault_kv_store (parent_path);
CREATE INDEX
vault=> \dt;
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+----------------+----------+--------------
public | vault_kv_store | テーブル | smokeymonkey
テーブル構造はこんな感じ。
vault=> \d vault_kv_store;
テーブル "public.vault_kv_store"
列 | 型 | 修飾語
-------------+-------+---------------------
parent_path | text | 照合順序 C not null
path | text | 照合順序 C not null
key | text | 照合順序 C not null
value | bytea |
インデックス:
"pkey" PRIMARY KEY, btree (path, key)
"parent_path_idx" btree (parent_path)
クライアント側の作業
Vault Serverのアドレスを環境変数に設定します。
$ export VAULT_ADDR='https://EC2のパブリックIPアドレス:8200'
initializeします。
$ vault operator init -tls-skip-verify
するとテーブルに16件のレコードが作成されます。これはVault Serverの設定などが格納されています。
vault=> select key from vault_kv_store;
key
------------------------------------------
keyring
master
seal-config
info
jwtkey
mounts
local-mounts
default
response-wrapping
auth
local-auth
audit
local-audit
salt
7ab23650c6b59ddabc660f54b24299ae5d450cc0
7c67e962f48afd4b0e4893ca2cf11df669996527
(16 行)
Unsealして使えるようにします。
$ vault operator unseal -tls-skip-verify
$ vault operator unseal -tls-skip-verify
$ vault operator unseal -tls-skip-verify
loginします。
$ vault login -tls-skip-verify 6bcc76e3-98d8-3d5d-a8e1-a15ad3cc9ac8
さて、それでは実際に値を格納してみます。
$ vault write -tls-skip-verify secret/sasakidaisuke value=smokeymonkey
Success! Data written to: secret/sasakidaisuke
するとkeyがKey名から始まるレコードが作成されます。valueは暗号化されており読めません。
vault=> select * from vault_kv_store where key='sasakidaisuke';
parent_path | path | key |
value
-------------+------------------------------------------------+---------------+---------------------------------------------
-------------------------------------------------------------------------
/logical/ | /logical/54cf8082-35ce-276c-886b-eab5522e81e3/ | sasakidaisuke | \x00000001028c77005e83f990818378b8aea9c679c1
dff115259f84948535f382b96dbefac8d300f54d1c5e310864d0506a7c48d187960d62f6
(1 行)
さいごに
PostgreSQLをストレージとして使う場合にはHigh Availability Modeがサポートされません。Aurora自体は信頼性が高いのですがフロントとなるVault Serverの可用性の担保が難しいことを認識しておきましょう。