Vault とは

  • Hashicorp社がメインで開発するOSSの機密管理ツール
  • 2018/12 にver 1.0.0 に到達し、現在は 1.2.0 系
  • 触ってみた感想: とっつきにくいけどそんなに難しくはない

機密情報

  • アプリケーションや作業者が使用するトークンやアカウント、証明書
  • いわゆる顧客データ

機密情報管理の課題

理想

  • 機密情報が必要な最小限の人間のみに利用可能になっていること

現実

  • 認証を行うユーザー・システムと認証先システム・サービスは増え続ける
    • いざ変更したいときに影響範囲がわからなくなりがち
  • 人事異動や退職による頻繁な権限更新
    • 離脱時に適切に権限を除外するのは難しい

Vaultを利用すると

  • 機密情報をVaultに集約することができる
    • 機密情報利用者は機密情報自体を知っている必要はなく、組織のvaultへのアクセス方法を知るだけで良い
    • Vaultのpolicy設定により秘密情報のローテーション・削除を中央管理できる
      • 機密情報の管理に関するリスクをVault管理者が中央集権的に管理可能になる
  • auditログによりいつ誰がどんな機密にアクセスしたかのログが収集できる
  • CLIやAPIが提供されていてプログラムから連携しやすい
    • WebUIも用意されており単なるTeamPassの上位互換のような利用方法も可能

Vaultの基本概念

  • 認証メソッド
    • Vaultへアクセスするユーザー自体の認証手段を行う機構(デフォルトはトークン方式)
    • LDAPやGithubアカウントによる認証メソッドなどが用意されている
  • シークレットエンジン
    • Vaultの機能の根幹をなす部分
    • 利用するエンジンによってKVS機能、暗号・複合化サービス、ローテーション付きアクセス権限の付与など様々な機能を提供できる
  • パス
    • Vaultに保持される機密情報や一部設定はPATHによって一意に特定できるようになっている
  • ポリシー
    • 認証されたユーザーがアクセスできるパスを管理する
  • ストレージバックエンド
    • Vaultが管理する機密情報を保存しておく場所
    • ローカルファイルはもちろんのことS3やGCSといった様々な場所に機密情報の保存が可能
    • 保存されるデータは暗号化されている

https://www.vaultproject.io/img/layers.png

Vaultは利用者が提示したPathに応じて利用されるシークレットエンジンや認証メソッドを識別する

使ってみる

基本的な流れは以下の通り

ログイン

$ vault login
Token (will be hidden):
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
Key Value
--- -----
token s.qlsWtk7h42GsBW......
token_accessor M7qRJUMvTok......
token_duration ∞
token_renewable false
token_policies ["root"]
identity_policies []
policies ["root"]

pathの有効化 ⇒ vault secrets enable -paht=[PATH] [SECRET ENGING]

$ vault secrets enable -path=kv kv
Success! Enabled the kv secrets engine at: kv/

secret書き込み ⇒ vault write [PATH] [VALUE]

$ vault write kv/hello address=a@a password=abc
Success! Data written to: kv/hello

secret読み出し ⇒ vault read [PATH]

$ vault read kv/hello
Key Value
--- -----
refresh_interval 768h
address a@a
password abc
> 

シークレットエンジン

様々なシークレットエンジンが用意されている

シークレットエンジン: KV

  • vaultをkey-valueストアとして使うためのシークレットエンジン
  • vault kv という専用のサブコマンドが用意されている

シークレットエンジン: aws (Dynamic Secretの例)

  • 必要な認証情報の作成から削除をVaultが代行してくれる
  • 詳細は以下

Dynamic Secrets

  • Dynamic Secret は各種DB等にも対応している

シークレットエンジン: otp

  • 携帯を利用しない2段階認証が可能なので個人に紐付かないアカウントの2段階認証なんかに便利そう

シークレットエンジン: transit

  • Vaultの暗号化をサービスとして提供できる
  • 暗号化するサービスと復号化するサービスが別々に存在するときに便利

シークレットエンジン: ssh

  • vault をつかってサーバーへのSSHをセキュアにしたり便利にしたり
  • OTP認証: ssh でotpを使うことで2段階認証に
  • CA認証: vault を PKI の CA として振る舞わせることでサーバーに一時的にログイン

HashiCorp VaultでSSHをCA認証に - Carpe Diem

ポリシー

ポリシーの設定

ポリシーを設定することでログインユーザの操作を制限できる

  • アクセス可能PATH
  • PATHごとの必須パラメータ・禁止パラメータ

ポリシー設定例

作成部分

$ echo <<EOF
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "kv/*" {
capabilities = ["list"]
}
path "kv/hello/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "otp/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
EOF > policy.hcl

登録部分

$ vault write sys/policy/mypolicy policy=@policy.hcl

ポリシーを適用したトークンの生成

$ vault token create -tls-skip-verify -policy=mypolicy

HashiCorp Vaultのポリシーを使いこなす | DevelopersIO

認証メソッド

デフォルトでtokenベースの認証が用意されているがldap連携など、その他の認証方式も用意サれている

認証メソッド: github

有効化

$ vault auth enable github

github organization の設定

$ vault write auth/github/config organization=hashicorp

teamごとにpolicy設定が可能

$ vault write auth/github/map/teams/dev value=dev-policy

その他機能

  • vault-agent

    • ssh-agentのようにvaultへの認証の自動化を行ってくれたり取得した機密情報のキャッシュを持ってくれたり
  • web-ui

  • ブラウザのパスワードオートコンプリート

    mulbc/vaultPass

セキュリティモデル

エンベロープ暗号化

  • Vaultで管理される個々の機密はそれぞれ別々の暗号化キーで暗号化されている
  • 個々の暗号化キーはvaultのマスター暗号化キーで暗号化されている
    • S3などのストレージに保存されるのは個々の機密と暗号化された暗号化キーまで
  • マスター暗号化キーはVaultは外部に決して公開せずメモリ内でのみ保持
    • 再起動によってマスターキーは喪失される(sealed状態)ので起動時に毎回マスターキーを与える必要がある(マスターキーはシャミアの秘密分散法で管理)

エンベロープ暗号化によるメリット

  • 同じデータでも毎回暗号化結果が異なる
  • 個々の暗号化キーはマスター鍵によって保護されているので、ある程度パフォーマンスを重視した暗号化方式を選択できる?
  • マスターキーを変更したい場合も全機密の最暗号化を行う必要が無くなる
    • 個々の暗号化キーのみ最暗号化すれば良い

シャミアの秘密分散法

  • Vault起動時はマスターキーを入力する必要があるがマスターキーはシャミアの秘密分散法に習って管理されている
  • マスターキーを5つのシャードキーに分割
  • 5つ中のいずれか3つを合成することでマスターキーが復元される
  • それぞれのシャードキーを別々の人が管理しておくことで、悪意のある管理者が一人いても悪用される恐れはない

※ うかつに再起動できない問題を緩和するために aws kms などを利用した自動起動(unseal)機能も用意されている(本末転倒感…)

参考

docs

Vault Documentation - Vault by HashiCorp%