Hashicorp VaultのPKI Secerts Engineを試す

HashicorpのVaultはPKI(Public Key Infrastructure、公開鍵基盤)として利用できるらしい。今回はRoot CAの作成、サーバー証明書の作成、クライアント証明書の作成と失効を試した。間違ってたらゴメンなさい。Vaultについての概要はWEB+DB PRESS Vol.104に記事が書かれているので読むとよさそう。

準備

Vaultのバージョンはv0.10.1。macOS用のバイナリをダウンロードして、PATHの通った場所に置いた。

curlはHomwbrewでインストールし、opensslを使うようにしている。

Homebrewでcurlをインストールした時のコマンド。

nginxもHomebrewでインストールした。

Vault serverサーバーの初期化・ログイン

まずはvault serverを用意する。ファイルで諸々を設定。バックエンドにはファイルを使うことにした。また、vaultのAPIをTLSなしで利用できるようにしておく。

シュッと起動。

ターミナルの別セッションを開いて、initからのunseal、login。このあたりは長いので実行コマンドだけ。

これで利用準備が整った。

Root CAの作成

まずはRoot CAを作るのだが、vaultでPKIを有効にする必要がある。vault secrets enableコマンドを使う。

これで、PKIタイプのsecretとしてalpacaができた。

Generate Root APIを使ってRoot CAを作る。

certificate endpoint / crl distribution points などを設定する。set url apiを使う。

Root CAまわりはこれでOK。

SSLサーバー証明書を作る

まず、Create Role APでロールを作る。

Generate Certificate API でCertificateを作る。Private Keyは保存されないので、コマンド実行後に出力されたものを自分で保存しておくこと。certificateとprivate_keyに対応するvalueをファイルに保存する。alpaca.repl.info.crt と alpaca.repl.info.keyとする。

nginxに設定する

nginx.confを用意する。ssl_certificateとssl_certificate_keyに先ほど作成したcertificateとprivate_keyを設定する。

nginxを起動して…

alpaca.repl.infoでnginxにアクセスできるよう、hostsに追記しておく。

ここで、curlを使ってアクセスしてみる。nginxで設定したサーバー証明書の検証ができないので、以下のようなエラーとなる。

insecureオプションをつけて検証しないようにするとアクセスできる。

ここで、Root CAのcertificateをca.pemとして用意し、–cacertオプションで指定する。これにより、サーバー証明書の検証を行うことができ、アクセスできる。

クライアント証明書で認証する

認証したい。まずは認証に失敗してアクセスできないことを確認する。nginx.confに設定を追加する。ここではca.pemはRoot CAのcerfiticateを使っている。

アクセス不可になることを確認する。

クライアント用の証明書と秘密鍵を作る。サーバー証明書を作った時と同様、ロールを作成して証明書を作る。

certificateとprivate_keyをファイルに保存し、curlの–certと–keyオプションで指定することでアクセスに成功する。

クライアント証明書を失効させてみる

認証で使うのだから、何かあったときには失効させたい。revoke certificate APIがあって、これを使えば失効させられる。

失効できたが、これだけだとまだアクセスできる。CRLをnginxが参照していないためである。

API経由でcrl.pemを取得する。

見てみると、失効したシリアルナンバーである”37:d2:7c:db:c6:cf:ad:cd:21:00:5c:a6:63:2d:5b:51:f1:e2:71:87″がrevoked certificatesに含まれていることがわかる。

nginxに設定を追加して、crlを見るようにする。

再度アクセスを試みるが、bad requestとなり、繋がらなくなることがわかる。

ひとまず動いたぞ!という記録だが、結構使えそうだなあという感触を得た。Kubernetesのような、いろんなコンポーネントがバシバシ証明書を必要とする環境で役立ちそうである。今回は証明書の配置を手動で行ったが、Consul Templateと組み合わせて自動配布、なんてこともできるので夢が広がるなあ。また、中間CAを扱うこともできるようなので、そちらも試しておきたい。