認証
AppRole
アプリケーション向けの認証方法
最終更新: 2026/2/17
AppRole認証
AppRoleは、アプリケーションやマシン向けに設計された認証方法です。自動化やCI/CDパイプラインに最適です。
AppRoleとは
AppRoleは、Role IDとSecret IDの2つの認証情報を使用する認証方法です。
基本概念
アプリケーション
├── Role ID(公開可能)
└── Secret ID(機密情報)
↓
Vault認証
↓
トークン発行
特徴:
- Role ID: アプリケーションの識別子(公開可能)
- Secret ID: 認証のための秘密情報(機密)
- 分離管理: 2つの情報を別々に管理可能
AppRoleの利点
1. セキュリティ
✅ 2要素認証
- Role IDとSecret IDの両方が必要
- 片方が漏洩しても認証できない
✅ Secret IDの動的生成
- デプロイ時に動的に生成
- 使用後に破棄可能
✅ IPアドレス制限
- 特定のIPアドレスからのみアクセス可能
2. 自動化
✅ スクリプトに適している
- パスワード入力不要
- 完全に自動化可能
✅ CI/CDパイプライン
- デプロイプロセスに統合しやすい
3. 柔軟性
✅ 複数のアプリケーション
- アプリケーションごとにロールを作成
✅ 環境ごとの設定
- 開発、ステージング、本番で異なる設定
AppRoleの有効化
基本的な有効化
# AppRole認証を有効化
vault auth enable approle
出力:
Success! Enabled approle auth method at: approle/
有効化の確認
vault auth list
出力:
Path Type Description
---- ---- -----------
approle/ approle n/a
token/ token token based credentials
ロールの作成
基本的なロール作成
# シンプルなロールを作成
vault write auth/approle/role/myapp \
token_policies="myapp-read,myapp-write" \
token_ttl=1h \
token_max_ttl=4h
詳細な設定でロール作成
# 詳細な設定を含むロール
vault write auth/approle/role/production-app \
token_policies="prod-read,prod-write" \
token_ttl=1h \
token_max_ttl=4h \
secret_id_ttl=10m \
secret_id_num_uses=1 \
token_bound_cidrs="10.0.0.0/8" \
bind_secret_id=true
パラメータの説明:
| パラメータ | 説明 | デフォルト |
|---|---|---|
token_policies | 付与するポリシー | - |
token_ttl | トークンの初期TTL | システムデフォルト |
token_max_ttl | トークンの最大TTL | システムデフォルト |
secret_id_ttl | Secret IDの有効期限 | 0(無期限) |
secret_id_num_uses | Secret IDの使用回数 | 0(無制限) |
token_bound_cidrs | 許可するIPアドレス | なし |
bind_secret_id | Secret IDを必須にする | true |
ロール一覧の表示
vault list auth/approle/role
出力:
Keys
----
myapp
production-app
staging-app
ロール情報の確認
vault read auth/approle/role/myapp
出力:
Key Value
--- -----
bind_secret_id true
local_secret_ids false
secret_id_bound_cidrs <nil>
secret_id_num_uses 0
secret_id_ttl 0s
token_bound_cidrs []
token_explicit_max_ttl 0s
token_max_ttl 4h
token_no_default_policy false
token_num_uses 0
token_period 0s
token_policies [myapp-read myapp-write]
token_ttl 1h
token_type default
Role IDの取得
Role IDの取得
# Role IDを取得
vault read auth/approle/role/myapp/role-id
出力:
Key Value
--- -----
role_id abc123-def456-ghi789-jkl012
重要: Role IDは公開可能な情報です。アプリケーションのコードに埋め込むことができます。
カスタムRole IDの設定
# カスタムRole IDを設定
vault write auth/approle/role/myapp/role-id \
role_id=my-custom-role-id
Secret IDの生成
基本的なSecret ID生成
# Secret IDを生成
vault write -f auth/approle/role/myapp/secret-id
出力:
Key Value
--- -----
secret_id xyz789-abc123-def456-ghi789
secret_id_accessor accessor-abc123
secret_id_ttl 0s
メタデータ付きSecret ID
# メタデータを付与
vault write auth/approle/role/myapp/secret-id \
metadata=environment=production \
metadata=deployed_by=jenkins
TTL付きSecret ID
# 10分間有効なSecret ID
vault write auth/approle/role/myapp/secret-id \
ttl=10m
使用回数制限付きSecret ID
# 1回のみ使用可能なSecret ID
vault write auth/approle/role/myapp/secret-id \
num_uses=1
CIDR制限付きSecret ID
# 特定のIPアドレスからのみ使用可能
vault write auth/approle/role/myapp/secret-id \
cidr_list="10.0.0.0/8,192.168.1.0/24"
認証
CLIでの認証
# Role IDとSecret IDで認証
vault write auth/approle/login \
role_id=abc123-def456-ghi789-jkl012 \
secret_id=xyz789-abc123-def456-ghi789
出力:
Key Value
--- -----
token hvs.CAESIJ...
token_accessor accessor-abc123
token_duration 1h
token_renewable true
token_policies ["default" "myapp-read" "myapp-write"]
identity_policies []
policies ["default" "myapp-read" "myapp-write"]
token_meta_role_name myapp
APIでの認証
# APIで認証
curl \
--request POST \
--data '{"role_id":"abc123-def456","secret_id":"xyz789-abc123"}' \
http://127.0.0.1:8200/v1/auth/approle/login
レスポンス:
{
"auth": {
"client_token": "hvs.CAESIJ...",
"accessor": "accessor-abc123",
"policies": ["default", "myapp-read", "myapp-write"],
"token_policies": ["default", "myapp-read", "myapp-write"],
"metadata": {
"role_name": "myapp"
},
"lease_duration": 3600,
"renewable": true
}
}
実践例
1. CI/CDパイプラインでの使用
GitHub Actionsの例:
# .github/workflows/deploy.yml
name: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# Vaultから認証
- name: Authenticate to Vault
id: vault
run: |
VAULT_TOKEN=$(curl -s --request POST \
--data "{\"role_id\":\"${{ secrets.VAULT_ROLE_ID }}\",\"secret_id\":\"${{ secrets.VAULT_SECRET_ID }}\"}" \
${{ secrets.VAULT_ADDR }}/v1/auth/approle/login | jq -r '.auth.client_token')
echo "::add-mask::$VAULT_TOKEN"
echo "VAULT_TOKEN=$VAULT_TOKEN" >> $GITHUB_ENV
# シークレットを取得
- name: Get Secrets
run: |
curl -s --header "X-Vault-Token: $VAULT_TOKEN" \
${{ secrets.VAULT_ADDR }}/v1/secret/data/myapp/config \
| jq -r '.data.data'
設定手順:
# 1. ロールを作成
vault write auth/approle/role/github-actions \
token_policies="ci-cd-read" \
token_ttl=10m \
token_max_ttl=15m \
secret_id_ttl=10m \
secret_id_num_uses=1
# 2. Role IDを取得(GitHub Secretsに保存)
vault read auth/approle/role/github-actions/role-id
# 3. Secret IDを生成(GitHub Secretsに保存)
vault write -f auth/approle/role/github-actions/secret-id
2. アプリケーションでの使用
Pythonアプリケーションの例:
import hvac
import os
# 環境変数から認証情報を取得
role_id = os.environ['VAULT_ROLE_ID']
secret_id = os.environ['VAULT_SECRET_ID']
vault_addr = os.environ['VAULT_ADDR']
# Vaultクライアントの初期化
client = hvac.Client(url=vault_addr)
# AppRoleで認証
client.auth.approle.login(
role_id=role_id,
secret_id=secret_id
)
# シークレットを取得
secret = client.secrets.kv.v2.read_secret_version(path='myapp/config')
db_password = secret['data']['data']['db_password']
print(f"Successfully authenticated to Vault")
デプロイスクリプト:
#!/bin/bash
# Role IDはアプリケーションに埋め込み
ROLE_ID="abc123-def456-ghi789-jkl012"
# Secret IDはデプロイ時に動的に生成
SECRET_ID=$(vault write -field=secret_id -f auth/approle/role/myapp/secret-id)
# アプリケーションを起動
export VAULT_ROLE_ID=$ROLE_ID
export VAULT_SECRET_ID=$SECRET_ID
export VAULT_ADDR="http://vault:8200"
./myapp
3. Kubernetes環境での使用
Deployment例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
initContainers:
- name: vault-auth
image: vault:latest
command:
- sh
- -c
- |
# AppRoleで認証
VAULT_TOKEN=$(vault write -field=token auth/approle/login \
role_id=${VAULT_ROLE_ID} \
secret_id=${VAULT_SECRET_ID})
# トークンをファイルに保存
echo $VAULT_TOKEN > /vault/token
env:
- name: VAULT_ADDR
value: "http://vault:8200"
- name: VAULT_ROLE_ID
valueFrom:
configMapKeyRef:
name: vault-config
key: role-id
- name: VAULT_SECRET_ID
valueFrom:
secretKeyRef:
name: vault-secret
key: secret-id
volumeMounts:
- name: vault-token
mountPath: /vault
containers:
- name: myapp
image: myapp:latest
env:
- name: VAULT_ADDR
value: "http://vault:8200"
- name: VAULT_TOKEN
valueFrom:
secretKeyRef:
name: vault-token
key: token
Secret IDの管理
Secret ID一覧の表示
# Secret IDのアクセサー一覧
vault list auth/approle/role/myapp/secret-id
Secret ID情報の確認
# アクセサーで情報を確認
vault write auth/approle/role/myapp/secret-id-accessor/lookup \
secret_id_accessor=accessor-abc123
Secret IDの破棄
# アクセサーで破棄
vault write auth/approle/role/myapp/secret-id-accessor/destroy \
secret_id_accessor=accessor-abc123
# Secret ID本体で破棄
vault write auth/approle/role/myapp/secret-id/destroy \
secret_id=xyz789-abc123-def456-ghi789
セキュリティのベストプラクティス
1. Secret IDの動的生成
# デプロイ時に毎回新しいSecret IDを生成
SECRET_ID=$(vault write -field=secret_id -f auth/approle/role/myapp/secret-id)
2. 短いTTL
# 短いTTLを設定
vault write auth/approle/role/myapp \
token_policies="myapp-read" \
token_ttl=10m \
token_max_ttl=30m \
secret_id_ttl=5m \
secret_id_num_uses=1
3. 使用回数制限
# 1回のみ使用可能なSecret ID
vault write auth/approle/role/myapp/secret-id \
num_uses=1
4. IPアドレス制限
# 特定のIPアドレスからのみアクセス可能
vault write auth/approle/role/myapp \
token_policies="myapp-read" \
token_bound_cidrs="10.0.0.0/8"
5. Role IDとSecret IDの分離管理
Role ID: アプリケーションコードに埋め込み
Secret ID: デプロイ時に動的に生成・注入
トラブルシューティング
認証に失敗する
エラー:
Error making API request.
Code: 400. Errors:
* invalid role_id or secret_id
確認事項:
# ロールが存在するか確認
vault list auth/approle/role
# Role IDを確認
vault read auth/approle/role/myapp/role-id
# Secret IDが有効か確認
vault write auth/approle/role/myapp/secret-id-accessor/lookup \
secret_id_accessor=accessor-abc123
Secret IDの有効期限切れ
エラー:
Error making API request.
Code: 400. Errors:
* secret_id is expired
解決策:
# 新しいSecret IDを生成
vault write -f auth/approle/role/myapp/secret-id
使用回数超過
エラー:
Error making API request.
Code: 400. Errors:
* secret_id has reached its use limit
解決策:
# 新しいSecret IDを生成
vault write -f auth/approle/role/myapp/secret-id
次のステップ
AppRole認証を理解したら、次はKVシークレットでシークレットエンジンの使い方を学びましょう。
AppRoleの活用AppRoleは、アプリケーションやCI/CDパイプラインに最適な認証方法です。Role IDとSecret IDの分離管理により、高いセキュリティを実現できます。