HashiCorp Vault Serverをオレオレ証明書を使ってTLS対応にする

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

これまでの記事はこちらです。

はじめに

今回はVault ServerをTLSで接続出来るようにします。TLSで使う証明書にはオレオレ証明書を使います。

やってみた

オレオレ証明書の作成

まずは秘密鍵を作成します。

$ openssl genrsa 2048 > vault-server.key
Generating RSA private key, 2048 bit long modulus

次に作成した秘密鍵からCSRを作成します。設定値は全てデフォルトで特に変更しません。

$ openssl req -new -key vault-server.key > vault-server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

作成したCSRを署名してサーバ証明書を作成します。

$ openssl x509 -req -signkey vault-server.key < vault-server.csr > vault-server.crt

これでサーバ証明書が出来上がりました。

$ ls -alF ./vault-server.*
-rw-rw-r-- 1 ec2-user ec2-user 1103  2月  8 01:12 ./vault-server.crt
-rw-rw-r-- 1 ec2-user ec2-user  952  2月  8 01:10 ./vault-server.csr
-rw-rw-r-- 1 ec2-user ec2-user 1679  2月  8 01:09 ./vault-server.key

Configファイルの修正

Vault Server起動時に指定するCOnfigファイルを作成します。ストレージをインメモリにしています。5行目と6行目でTLSで使うサーバ証明書と秘密鍵を指定しています。

storage "inmem" {}

listener "tcp" {
 address     = "プライベートIPアドレス:8200"
 tls_cert_file = "/home/ec2-user/vault-server.crt"
 tls_key_file  = "/home/ec2-user/vault-server.key"
}

そしてConfigファイルを指定して起動します。

$ sudo ./bin/vault server -config=config.hcl

クライアントから接続する

Vault Serverのアドレスを環境変数に設定します。httpsになっているのがキモです。

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

そしてコマンドを投げてみます。

$ vault status
Error checking seal status: Get https://EC2のパブリックIPアドレス:8200/v1/sys/seal-status: x509: cannot validate certificate for EC2のパブリックIPアドレス because it doesn't contain any IP SANs

はい!エラーになりました。これは接続しているIPアドレスと証明書で持っているCommon Nameに相違があるためです。通常ですとCommon Nameはサーバのホスト名(例:www.example.com)になりますし、クライアントが接続するのもサーバのホスト名(例:www.example.com)になります。今回はオレオレ証明書でCommon Nameを設定しておらず、接続もパブリックIPアドレスで行っているので、エラーとなりました。

このエラーを回避するためには、クライアント側で-tls-skip-verifyを付与します。

$ vault status -tls-skip-verify
Error checking seal status: Error making API request.

URL: GET https://52.196.136.24:8200/v1/sys/seal-status
Code: 400. Errors:

* server is not yet initialized

はい、通りました。あとはinitializeしてあげればちゃんとステータスが見れます。

$ vault operator init -tls-skip-verify
$ vault status -tls-skip-verify
Key                Value
---                -----
Seal Type          shamir
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    0/3
Unseal Nonce       n/a
Version            0.9.3
HA Enabled         true
HA Mode            sealed

さいごに

ということで、オレオレ証明書によるTLS対応が出来ました!これでセキュアにVault Serverへ接続することが出来ます。