HashiCorp Vault Serverをオレオレ証明書を使ってTLS対応にする
これまでの記事はこちらです。
はじめに
今回は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へ接続することが出来ます。