😻

HashiCorp Vaultを何となく理解する(9):Vault Agent

2024/12/25に公開

イオン⁠⁠⁠⁠⁠⁠⁠スマートテクノロジー DevSecOps Div. SREチームの@hikkie13です。

過去の記事に記載がある通り、弊社ではHCP Vaultの導入を進めています。
https://zenn.dev/aeonpeople/articles/6625a900552311
https://zenn.dev/aeonpeople/articles/0b4492898a0fd3

導入には教育・学習が欠かせません。
その過程で得た知識を何回かに分けてまとめていこうと思います。
今回が最終回です!

最終回の今回は、Vault Agentについてです。

Vault Agentの概要


https://developer.hashicorp.com/vault/docs/agent-and-proxy/agent より

  1. Vaultとの認証: アプリケーションがVaultに対して認証を行う。
  2. アプリケーションのIDを検証: Vaultが信頼できるプラットフォーム(AWSやKubernetesなど)を使用して、アプリケーションのIDを検証する。
  3. 検証完了: アプリケーションのIDが検証される。
  4. クライアントトークンの返却: Vaultはアプリケーションに対してクライアントトークンを返す。
  5. トークンをシンクに保存: Vault Agentが取得したトークンをsink(例: ファイルシステムなど)に保存する。
  6. テンプレートファイルのレンダリングに必要なシークレットを読み込む: Vault Agentがシークレットを読み込み、テンプレートファイルをレンダリングする。
  7. アプリケーションが出力ファイルを使用: アプリケーションがVault Agentによって生成された期待される出力ファイルを利用する。

Vault Agentはアプリケーションの隣で動作するクライアントデーモンであり、レガシーアプリケーションがシークレットをやり取りし、利用できるようにする。アプリケーションが必要とするシークレットを含むテンプレートをレンダリングする機能を提供することで、アプリケーション自体に変更を加える必要がなくなるというメリットがある。

Vault Agent の機能として、今回は以下の3つを紹介する。

  • Auto-Auth
  • レスポンスのラッピング
  • テンプレート処理

Auto-Auth

https://developer.hashicorp.com/vault/docs/agent-and-proxy/autoauth

  • Vault Agentは事前定義された認証方法を使用してVaultに対して認証し、トークンを取得する。
  • トークンは「シンク(sink)」に保存され、これはVaultトークンを含むローカルファイルシステム上の単なるフラットファイルとなる。
  • アプリケーションはこのトークンを読み取り、Vault APIを直接呼び出すことができる。
  • この戦略により、Vault Agentがトークンを管理し、常に有効なトークンがアプリケーションに提供されることが保証される。

methodとsink

Auto-authは以下の2つで構成される:

  • method : 現在の環境に対する認証方法
  • sink : トークンの値が変わる際にツールがトークンを保存する場所

Auto-authが有効な状態でサポートされるツールが起動すると、ツールは設定されたメソッドを使用してVaultトークンをリクエストする。リクエストが失敗した場合、ツールは指数バックオフを伴って再試行する。

リクエストが成功すると、auto-authはVaultが更新を拒否するまで、自動的にアンラップされた認証トークンを更新する。認証方法がトークンをラッピングする場合、auto-authはトークンを自動的に更新できない。

Vaultは通常、次の場合にトークンの更新を拒否する:

  • トークンが取り消された場合
  • トークンが使用回数の上限を超えた場合
  • トークンがその他の理由で無効である場合
    認証が成功するたびに、auto-authは適切に設定されたsinkにトークンを書き込む。

sinkについて

https://developer.hashicorp.com/vault/docs/agent-and-proxy/autoauth#configuration-sinks

https://developer.hashicorp.com/vault/docs/agent-and-proxy/autoauth/sinks/file

現在のところ、file が Auto-authトークンを保存する唯一のサポートされている方法の模様。

代表的なパラメータは以下

  • type : 使用するシンクの種類(file のみ利用可能 ※大事なことなので何回も言う)
  • path : ファイルの保存場所
  • mode : シンクファイルのファイル権限を変更する
  • wrap_ttl : レスポンスラッピングを使用してトークンを取得

レスポンスのラッピング

https://developer.hashicorp.com/vault/docs/agent-and-proxy/autoauth#response-wrapping-tokens

Auth-Authを使用してトークンを保護するために、VaultはVault Agentが認証する際にトークンをレスポンスラッピングできる。

レスポンスをラッピングする方法は2種類あり、Vault Agentの設定ファイル内のwrap_ttlの配置によって、レスポンスラッピングがどこで行われるかが決まる。

Auth Methodによってラッピングされたレスポンス

認証メソッドを使用することで、エンドクライアントはトークンのcreation_pathを調べることができ、これにより中間者攻撃(MITM)を防ぐことができる。
ただし、auto-authはcreation_pathを変更せずにトークンをアンラップし再ラップすることができないため、トークンを更新することができない。この場合、トークンの更新はエンドクライアントの責任となる。
このモードでは、一部の認証メソッドが特定のイベントで再認証を許可するため、Agentはデーモン化された状態を維持する。

sinkによってラッピングされたレスポンス

複数のsinkを構成できるため、トークンはVaultから返される際にラッピングされるのではなく、取得された後にラッピングされる必要がある。
その結果、creation_pathは常にsys/wrapping/wrapとなり、このフィールドの検証はMITM攻撃に対する保護として使用できない。
しかし、このモードではauto-authがトークンを更新し、期限切れ時に自動的に再認証することが可能となる。

比較項目 Auth Methodによるラッピング sinkによるラッピング
メリット ・中間者攻撃(MITM)を防止する ・トークンを更新し再認証できる
デメリット ・Vault Agentはトークンを更新できない ・トークン取得後にラッピングされるためMITM攻撃に対して脆弱になる

テンプレート機能

https://developer.hashicorp.com/vault/docs/agent-and-proxy/agent/template

Vault Agentのテンプレート機能を使用すると、Vaultのシークレットをファイルまたは環境変数にレンダリングできる。

  • この機能はConsul Templateマークアップを使用する。
  • Consul-Templateの機能がVault Agentに直接組み込まれているため、アプリケーションサーバーにConsul-Templateのバイナリをインストールする必要はない。

configurationには2種類あり、global configuraitonとtemplate configurationsがある。前者は全てのテンプレートに影響を与え、後者はテンプレートごとに対する設定になる。

templateファイル

exmaple:
  database: hoge
  host: hogehoge.com
  {{ with secret "database/role/reader" }}  ★ここがVaultのPath
  username: "{{ .Data.username }}" ★Vaultの取得されたデータから指定 
  password: "{{ .Data.password }}" ★Vaultの取得されたデータから指定
  {{ end }}

Configuration

auto_auth {
  method "approle" {
     mount_path = "auth/approle"
  ...

  sink "file" {
     config = {
path = "/etc/vault.d/exmample.txt" ...
template_config {                  ★global configuration
  exit_on_retry_failure = false
  static_secret_render_interval = "10m"
}
template {                         ★template configuration
  source = "/etc/vault/web.tmpl"
  destination = "/etc/webapp/config.yml"
  error_on_missing_key = true
}

# templateを利用している例
template {                         ★template configuration
  contents     = "{{ with secret \"secret/my-secret\" }}{{ .Data.data.foo }}{{ end }}"
  destination  = "/tmp/agent/render-content.txt"
}

まとめ

Vault Agentを利用することで、レガシーアプリケーションでもVaultを利用し易くなるので是非活用していきましょう🚀

最後に

全世界で大好評(当社比)だった「HashiCorp Vaultを何となく理解する」シリーズは一旦本記事で終了となります。
完全に網羅をしているわけではないですが、概要を掴んでvault associateの資格を取得できるような知識はまとめられたかなと思っております。自分の勉強用メモ的な側面が多分にありますが、皆様の何かのお役に立てれば嬉しいです!

参考

https://developer.hashicorp.com/vault/docs
https://youtube.com/playlist?list=PLFkEchqXDZx7CuMTbxnlGVflB7UKwf_N3&si=uJE2c_GhjxQ4FmMA
HashiCorp Certified: Vault Associate 2024 (w/ Hands-On Labs)
HashiCorp Certified: Vault Operations Professional

イオングループで、一緒に働きませんか?

イオングループでは、エンジニアを積極採用中です。少しでもご興味もった方は、キャリア登録やカジュアル面談登録などもしていただけると嬉しいです。
皆さまとお話できるのを楽しみにしています!

AEON TECH HUB

Discussion