この記事は公開されてから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へ接続することが出来ます。