HashiCorp Vaultのインストールと設定メモ【シークレット管理ツール】
Vaultとは
HashiCorp Vaultは、パスワード・APIキー・証明書などの機密情報(シークレット)を安全に管理するためのオープンソースツールです。
主な特徴は以下のとおりです。
- シークレットの一元管理 — アプリケーションがVaultからシークレットを取得する構成にすることで、設定ファイルに直接パスワードを書かずに済みます
- アクセス制御(Policy) — 誰がどのシークレットにアクセスできるかをPolicyで細かく制御できます
- 複数の認証方法 — AppRole・Token・GitHub・AWS IAMなど多様な認証方法に対応しています
- 監査ログ — シークレットへのアクセス履歴を記録できます
インストール
Vaultのインストールは公式リポジトリから行います。
# GPGキーのダウンロード
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
# リポジトリの登録
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
# インストール
sudo apt update && sudo apt install vault
設定ファイルの作成
config.hclを作成します。
storage "file" {
path = "vault-data"
}
listener "tcp" {
address = "10.10.10.10:8200"
tls_disable = "true"
}
api_addr = "http://10.10.10.10:8200"
ui = true
各項目の説明です。
| キー | 説明 |
|---|---|
storage | シークレットの保存先(fileはローカルファイル) |
listener | VaultがリッスンするアドレスとTLS設定 |
api_addr | クラスタ構成時のAPIアドレス |
ui | Web UIの有効化 |
起動と初期化
# サーバの起動
vault server -config=config.hcl
# Vaultの初期化(初回のみ)
vault operator init
初期化後、以下のキーが生成されます。必ず安全な場所に保存してください。
Unseal Key 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Unseal Key 2: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Unseal Key 3: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Unseal Key 4: dddddddddddddddddddddddddddddddddddddddddddd
Unseal Key 5: llllllllllllllllllllllllllllllllllllllllllll
Initial Root Token: hvs.uuuuuuuuuuuuuuuuuuuuuuuu
デフォルトでは5つのUnseal Keyのうち3つが必要です(threshold=3)。 Root Tokenはすべての操作が可能な強力なトークンです。通常運用では使用せず、AdminポリシーのTokenを別途発行することを推奨します。
Unsealとログイン
Vaultは起動するたびにSealされた状態になります。 使用可能にするにはUnseal操作が必要です。
# Unseal(3回実行が必要)
vault operator unseal
# ログイン(Root Tokenで)
vault login
シークレットの追加
KV(Key-Value)v2型のシークレットエンジンを有効化してシークレットを追加します。
# KV v2型のシークレットエンジンを有効化
vault secrets enable -path=secret kv-v2
# 有効化されているエンジンの確認
vault secrets list
# シークレットの追加
vault kv put -mount=secret myapp username=admin password=mypassword
# シークレットの確認
vault kv get secret/myapp
Policyの設定
Policyでアクセス権限を制御します。 以下はsecret/配下の読み取りのみ許可するPolicyの例です。
vault policy write app-policy - << EOF
path "secret/data/*" {
capabilities = ["read"]
}
EOF
# Policyの確認
vault policy read app-policy
AppRoleの設定
AppRoleはアプリケーションがVaultに認証するための仕組みです。
role_idとsecret_idの2つを使って認証します。
# AppRoleの有効化
vault auth enable approle
# AppRoleを追加してPolicyを紐付け
vault write auth/approle/role/my-app policies="app-policy"
# role_idの確認
vault read auth/approle/role/my-app/role-id
# secret_idの発行
vault write -f auth/approle/role/my-app/secret-id
アプリケーションはこのrole_idとsecret_idを使ってVaultにログインし、シークレットを取得します。
# AppRoleでログイン
vault write auth/approle/login \
role_id=<role_id> \
secret_id=<secret_id>
CIDRによるアクセス制限
特定のIPアドレスからのみアクセスを許可したい場合はsecret_id_bound_cidrsを設定します。
vault write auth/approle/role/my-app/ \
secret_id_bound_cidrs="10.10.10.0/24"
# 設定の確認
vault read auth/approle/role/my-app
まとめ
HashiCorp Vaultを使うことで、アプリケーションのシークレットを安全に一元管理できます。 AppRoleを使えばアプリケーションがVaultから動的にシークレットを取得できるため、設定ファイルへの直書きを避けることができます。