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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Vault ServerはストレージとしてMySQLが使えます。今回はAmazon Aurora MySQLをストレージとして使ってみます。

やってみた

Amazon Aurora MySQLの準備

以下のようにAmazon Aurora MySQLを構築しました。またセキュリティグループの設定で、Vault ServerとなるEC2から接続を許可しておきます。

サーバ側の作業

Vault Server起動時に指定するConfigファイルを作成します。storage項目でMySQLを指定します。また前回同様にオレオレ証明書でTLSを有効にしています。

storage "mysql" {
 address  = "aurora-mysql.XXXXXX.ap-northeast-1.rds.amazonaws.com:3306"
 username = "ADMIN"
 password = "PASSWORD"
 database = "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"
}

MySQLを使う場合のパラメータは以下の通りです。

  • address ... MySQLサーバのアドレス。今回の場合はAurora MySQLのエンドポイントを設定しています。
  • database ... Vaultで使うデータベース名。ここで指定したデータベースが存在しない場合は作成します。
  • table ... Vaultで使うテーブル名。 ここで指定したテーブルが存在しない場合は作成します。
  • tls_ca_file ... TLS接続する場合のCAファイルを指定。
  • max_parallel ... 最大並列接続数。デフォルトは128。
  • username ... MySQLサーバに接続するためのユーザー名。
  • password ... MySQLサーバに接続するためのユーザーのパスワード。

Vault Serverを起動します。Storageがmysqlになっています。

$ 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: mysql
                 Version: Vault v0.9.3
             Version Sha: 7d73ac4c967b3b8726c71e00c017129e1d36ad3c

==> Vault server started! Log data will stream in below:

この時点でConfigファイルで指定したテーブルが出来ています。

$ mysql -h aurora-mysql.XXXXXX.ap-northeast-1.rds.amazonaws.com -P 3306 -u ADMIN -p vault

mysql> show tables from vault;
+-----------------+
| Tables_in_vault |
+-----------------+
| vault           |
+-----------------+
1 row in set (0.01 sec)

テーブル構造はこんな感じ。

mysql> desc vault;
+-------------+----------------+------+-----+---------+-------+
| Field       | Type           | Null | Key | Default | Extra |
+-------------+----------------+------+-----+---------+-------+
| vault_key   | varbinary(512) | NO   | PRI | NULL    |       |
| vault_value | mediumblob     | YES  |     | NULL    |       |
+-------------+----------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

ちなみにレコードは0件です。

mysql> select * from vault;
Empty set (0.00 sec)

クライアント側の作業

Vault Serverのアドレスを環境変数に設定します。

$ export VAULT_ADDR='https://EC2のパブリックIPアドレス:8200'

initializeします。

$ vault operator init -tls-skip-verify

するとvaultテーブルに16件のレコードが作成されます。。これはVault Serverの設定などが格納されています。

mysql> select vault_key from vault;
+-------------------------------------------------------------+
| vault_key                                                   |
+-------------------------------------------------------------+
| core/audit                                                  |
| core/auth                                                   |
| core/cluster/local/info                                     |
| core/keyring                                                |
| core/local-audit                                            |
| core/local-auth                                             |
| core/local-mounts                                           |
| core/master                                                 |
| core/mounts                                                 |
| core/seal-config                                            |
| core/wrapping/jwtkey                                        |
| sys/policy/default                                          |
| sys/policy/response-wrapping                                |
| sys/token/accessor/2081f7518896b21c5d9df727af5ff1ca4a57c3dd |
| sys/token/id/83cbf1c725fb96b0106a4033ec73a49d273332ef       |
| sys/token/salt                                              |
+-------------------------------------------------------------+
16 rows in set (0.01 sec)

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

するとvault_keyがlogicalから始まるレコードが作成されます。valut_valueは暗号化されており読めません。

mysql> select * from vault where vault_key like "logical%";
+------------------------------------------------------------+-----------------------------------------------------------+
| vault_key                                                  | vault_value                                               |
+------------------------------------------------------------+-----------------------------------------------------------+
| logical/ecc6f036-b5d8-c282-b0cf-323f439f303c/sasakidaisuke |    �~���£�
                                                                         �����wߛ����&!�U1�8���ѡuϺΦa��Z���t                               |
+------------------------------------------------------------+-----------------------------------------------------------+
1 row in set (0.00 sec)

さいごに

MySQLをストレージとして使う場合にはHigh Availability Modeがサポートされません。Aurora自体は信頼性が高いのですがフロントとなるVault Serverの可用性の担保が難しいことを認識しておきましょう。

合わせて読みたい