認証

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_ttlSecret IDの有効期限0(無期限)
secret_id_num_usesSecret IDの使用回数0(無制限)
token_bound_cidrs許可するIPアドレスなし
bind_secret_idSecret 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の分離管理により、高いセキュリティを実現できます。
© 2026 IBM Corporation. Licensed under CC BY 4.0.