Vault on k8s

こんにちは。人生折り返しの歳になりました。 今回はVaultを利用してこんな仕組みを作ったよという実例です。

今回説明するのはBitbucketへのUser SSH KeyをVaultを使って安全に管理するサービスです。 処理内容は次の通り。

  • 認証サービスへのアクセスは特定のIPレンジのみ許可
  • 認証サービスへのアクセスはGoogle認証を使う
  • 24時間毎にSSH Keyを再作成
  • SSH KeyとPassphraseはVaultに保管
  • TOTP認証でSSH Keyを取得
  • SSH Key Passphraseは認証サービスから取得

ぱっと見複雑な感じがしますが、要件的には

組織内メンバーが特定の場所からTOTP認証を使って安全にSSH Keyを運用することができる

ということです。

Vault Key Feature

今回利用するVaultのKey Featureです。

Key/Value

Vaultの最もスタンダード(?)な機能です。

KV Secrets Engine - Version 2

SSH KeyおよびPassphraseの保管で利用します。

TOTP(Time-based One-time Password)

AuthenticatorとかAuthyでワンタイムパスワードを設定する時にバーコードが出てくるアレです。 自前で実装しても良いと思いますが、Vaultには便利なSecret Engineがあります。

TOTP Secrets Engine

SSH KeyおよびPassphraseの取得で利用します。

PKI(Public Key Infrastructure)

Vaultで認証局を作成して証明書を発行する仕組みを提供できます。

PKI Secrets Engine

今回はVaultをk8sにデプロイするので、httpsの証明書として利用します。オレオレ

Archtecture

こんな感じになりました。

archtecture

上記のArchtectureでサーバプログラム書いて、UIをゴニョゴニョすると・・・


TOP

Bootstrap!

top

Get QR Code

totp

このバーコード、Vaultからはbase64で返ってくるのでView側ではこんな感じで直接的に書けます。

{{define "vault-otp"}}
<!DOCTYPE html>
<html lang="ja">
  {{template "bootstrap-header" .}}
  <body>
    <div class="container">
      <h2>Generated your account barcode.</h2>
        <div class="container">
          <img src="data:image/png;base64,{{.}}"/>
        </div>
      <a class="btn btn-danger btn-sm btn-block" href="?generate=true" role="button">Regenerate</a>
      <a class="btn btn-default btn-sm btn-block" href="/" role="button">Back</a>
    </div>
  </body>
</html>
{{end}}

Bitbucket Passphrase

Google認証をクリアすればPassphraseが見れます。

passphrase

Register Bitbucket secrets

BitbucketユーザとAppPasswordをVaultに保管するUI

register

いろいろ端折っていますが・・・

今回お伝えしたかったのは、アイデア次第で小さなシステムを作るぐらいならさくっとできるということです。 では皆さん、良いVaultライフを!