Amazon Aurora PostgreSQLをHashiCorp Vault Serverのストレージにする

はじめに

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の可用性の担保が難しいことを認識しておきましょう。

合わせて読みたい