1. LDAP Auth Method
LDAP 認証方法 を使用すると、Vault が LDAP ディレクトリ (Active Directory、OpenLDAP、FreeIPA) を使用してユーザーを認証できるようになります。ほとんどの組織ではすでに LDAP/AD インフラストラクチャが導入されているため、これは企業で人間のユーザーを認証する最も一般的な方法です。
アーキテクチャ
┌──────────┐ 1. Login ┌──────────────┐
│ User │ ───────────────────▶ │ Vault │
│ │ │ LDAP Auth │
│ │ 4. Vault Token │ │
│ │ ◀─────────────────── │ │
└──────────┘ └──────┬───────┘
│
2. LDAP Bind (verify password)
3. Search groups
│
▼
┌──────────────┐
│ LDAP Server │
│ (AD / LDAP) │
└──────────────┘
Active Directory で構成
# Enable LDAP auth
vault auth enable ldap
# Cấu hình kết nối Active Directory
vault write auth/ldap/config \
url="ldaps://ad.company.com:636" \
userdn="OU=Users,DC=company,DC=com" \
userattr="sAMAccountName" \
groupdn="OU=Groups,DC=company,DC=com" \
groupattr="cn" \
groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \
binddn="CN=vault-svc,OU=ServiceAccounts,DC=company,DC=com" \
bindpass="VaultServiceP@ss" \
starttls=false \
insecure_tls=false \
certificate=@/etc/vault/ldap-ca.pem \
token_ttl=8h \
token_max_ttl=24h
OpenLDAP による構成
vault write auth/ldap/config \
url="ldaps://ldap.company.com:636" \
userdn="ou=people,dc=company,dc=com" \
userattr="uid" \
groupdn="ou=groups,dc=company,dc=com" \
groupattr="cn" \
groupfilter="(|(memberUid={{.Username}})(member={{.UserDN}}))" \
binddn="cn=vault,ou=services,dc=company,dc=com" \
bindpass="LdapBindP@ss" \
certificate=@/etc/vault/ldap-ca.pem
Group → Policy Mapping
# Map LDAP group "DevOps" → Vault policies
vault write auth/ldap/groups/DevOps \
policies="devops-admin,kv-devops,pki-issue"
# Map LDAP group "Developers" → Vault policies
vault write auth/ldap/groups/Developers \
policies="dev-readonly,kv-dev"
# Map LDAP group "DBA" → Vault policies
vault write auth/ldap/groups/DBA \
policies="db-admin,db-rotate"
# Map specific user → additional policies
vault write auth/ldap/users/john.doe \
policies="team-lead-extra" \
groups="DevOps,Developers"
# Liệt kê groups
vault list auth/ldap/groups
LDAP でログイン
# CLI login
vault login -method=ldap username=john.doe
# Password (will be hidden): ****
# API login
curl -s --request POST \
--data '{"password": "userPassword"}' \
${VAULT_ADDR}/v1/auth/ldap/login/john.doe | jq .
2. OIDC Auth Method
OIDC (OpenID Connect) 認証メソッド を使用すると、OIDC をサポートする ID プロバイダー (Keycloak、Azure AD (Entra ID)、Okta、Google Workspace、Auth0) 経由で Vault を認証できます。これは、SSO、MFA、ブラウザベースのログインをサポートしているため、人間認証の最も最新の方法です。
OIDC Authentication Flow
┌──────────┐ 1. vault login ┌──────────────┐
│ User │ ─────────────────────▶ │ Vault │
│ (Browser)│ │ OIDC Auth │
│ │ 2. Redirect to IdP │ │
│ │ ◀───────────────────── │ │
│ │ └──────────────┘
│ │ 3. Login at IdP
│ │ ─────────────────────▶ ┌──────────────┐
│ │ │ Keycloak/ │
│ │ 4. Auth code │ Azure AD │
│ │ ◀───────────────────── │ │
│ │ └──────────────┘
│ │ 5. Auth code → Vault
│ │ ─────────────────────▶ ┌──────────────┐
│ │ │ Vault │
│ │ 6. Exchange code │ │
│ │ for tokens │ │
│ │ 7. Vault Token │ │
│ │ ◀───────────────────── │ │
└──────────┘ └──────────────┘
Keycloak で構成
# Enable OIDC auth
vault auth enable oidc
# Cấu hình OIDC với Keycloak
vault write auth/oidc/config \
oidc_discovery_url="https://keycloak.company.com/realms/company" \
oidc_client_id="vault" \
oidc_client_secret="vault-client-secret" \
default_role="default"
# Tạo OIDC role
vault write auth/oidc/role/default \
bound_audiences="vault" \
allowed_redirect_uris="https://vault.company.com/ui/vault/auth/oidc/oidc/callback" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
user_claim="preferred_username" \
groups_claim="groups" \
token_policies="default" \
token_ttl=8h \
token_max_ttl=24h \
oidc_scopes="openid,profile,email,groups"
# Tạo role cho admin với bound claims
vault write auth/oidc/role/admin \
bound_audiences="vault" \
allowed_redirect_uris="https://vault.company.com/ui/vault/auth/oidc/oidc/callback" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
user_claim="preferred_username" \
groups_claim="groups" \
bound_claims='{"department": "IT", "role": "admin"}' \
claim_mappings='{"email": "email", "department": "department"}' \
token_policies="admin,kv-admin" \
token_ttl=4h \
token_max_ttl=8h
Azure AD で構成する (Entra ID)
vault write auth/oidc/config \
oidc_discovery_url="https://login.microsoftonline.com/<tenant-id>/v2.0" \
oidc_client_id="<application-id>" \
oidc_client_secret="<client-secret>" \
default_role="azure-default"
vault write auth/oidc/role/azure-default \
bound_audiences="<application-id>" \
allowed_redirect_uris="https://vault.company.com/ui/vault/auth/oidc/oidc/callback" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
user_claim="email" \
groups_claim="groups" \
token_policies="default" \
oidc_scopes="openid,profile,email"
OIDC でログイン
# Browser-based login (mở browser tự động)
vault login -method=oidc role=default
# Chỉ định port cho callback
vault login -method=oidc port=8250 role=default
# Qua Vault UI: chọn OIDC → Sign in → redirect đến IdP
3. JWT Auth Method
JWT 認証メソッド は、JSON Web トークンを使用して認証します。 OIDC (ブラウザベース) とは異なり、JWT 認証は、クライアントがすでに JWT トークンを持っている場合、特に CI/CD パイプラインの場合、マシン認証 に適しています。
JWT vs OIDC Auth
から取得された JWT| 基準 | JWT認証 | OIDC認証 |
|---|---|---|
| ログイン フロー | クライアントは JWT を直接送信 | ブラウザ リダイレクト ベース |
| オブジェクト | マシン、CI/CD | 人間のユーザー |
| トークン ソース | クライアントには、IdP | |
| Vault がすでにあります | ||
| MFA サポート | いいえ | はい (IdP 経由) |
GitHub Actions OIDC → Vault JWT Auth
GitHub アクションは、ワークフロー実行ごとに OIDC トークンを提供し、シークレットを保存せずに Vault への認証を可能にします:
# Enable JWT auth cho GitHub Actions
vault auth enable -path=github-actions jwt
# Cấu hình JWT auth với GitHub OIDC Provider
vault write auth/github-actions/config \
oidc_discovery_url="https://token.actions.githubusercontent.com" \
bound_issuer="https://token.actions.githubusercontent.com"
# Tạo role cho repository cụ thể
vault write auth/github-actions/role/my-app \
role_type="jwt" \
bound_audiences="https://github.com/my-org" \
bound_claims_type="glob" \
bound_claims='{"repository": "my-org/my-app", "ref": "refs/heads/main"}' \
user_claim="repository" \
token_policies="my-app-deploy" \
token_ttl=10m \
token_max_ttl=30m
# Tạo role cho toàn bộ organization
vault write auth/github-actions/role/org-readonly \
role_type="jwt" \
bound_audiences="https://github.com/my-org" \
bound_claims_type="glob" \
bound_claims='{"repository": "my-org/*"}' \
user_claim="repository" \
token_policies="org-readonly" \
token_ttl=5m
GitHub Actions Workflow
# .github/workflows/deploy.yml
name: Deploy with Vault OIDC
on:
push:
branches: [main]
permissions:
id-token: write # Required cho OIDC token
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Authenticate to Vault
uses: hashicorp/vault-action@v3
with:
url: https://vault.company.com
method: jwt
path: github-actions
role: my-app
jwtGithubAudience: https://github.com/my-org
secrets: |
secret/data/production/db username | DB_USER ;
secret/data/production/db password | DB_PASS
- name: Deploy
run: ./deploy.sh
GitLab CI JWT Auth
# Enable JWT auth cho GitLab CI
vault auth enable -path=gitlab-ci jwt
# Cấu hình
vault write auth/gitlab-ci/config \
jwks_url="https://gitlab.company.com/-/jwks" \
bound_issuer="https://gitlab.company.com"
# Tạo role
vault write auth/gitlab-ci/role/deploy \
role_type="jwt" \
bound_claims='{"project_id": "42", "ref_protected": "true"}' \
user_claim="project_path" \
token_policies="gitlab-deploy" \
token_ttl=10m
# .gitlab-ci.yml
deploy:
stage: deploy
id_tokens:
VAULT_ID_TOKEN:
aud: https://vault.company.com
script:
- |
VAULT_TOKEN=$(vault write -field=token auth/gitlab-ci/login \
role=deploy \
jwt="${VAULT_ID_TOKEN}")
export VAULT_TOKEN
DB_PASS=$(vault kv get -field=password secret/production/db)
./deploy.sh
4。バインドされたクレームとクレームのマッピング
Bound Claims
Bound クレームは、ロールへのログインを許可される JWT トークンを制限します:
# Exact match
vault write auth/jwt/role/strict-role \
bound_claims='{"department": "engineering", "team": "platform"}'
# Glob pattern matching
vault write auth/jwt/role/glob-role \
bound_claims_type="glob" \
bound_claims='{"repository": "my-org/*", "ref": "refs/heads/main"}'
# Multiple values (OR logic)
vault write auth/jwt/role/multi-role \
bound_claims='{"group": ["devops", "sre", "platform"]}'
Claim Mappings
クレーム マッピングは、JWT クレームを Vault ID メタデータにマッピングします:
vault write auth/oidc/role/mapped-role \
claim_mappings='{"email": "email", "department": "dept", "employee_id": "emp_id"}'
# Metadata available in policies:
# {{identity.entity.aliases.<mount_accessor>.metadata.email}}
# {{identity.entity.aliases.<mount_accessor>.metadata.dept}}
5. Best Practices
LDAP
常に LDAPS (ポート 636) または StartTLS
を使用します
Vault バインドのサービス アカウントには読み取り専用権限が必要です
管理を容易にするために個々のユーザーではなくグループをマップします
本番環境を適用する前に、LDAP フィルター構成を慎重にテストしてください
OIDC
allowed_redirect_urisを Vault の実際の URL のみに制限bound_claims__P3__ を使用して、部門/役割ごとにアクセスを制限しますIdP で MFA を有効にする (Keycloak、Azure AD)
oidc_client_secretを定期的に回転させる
JWT
静的シークレットの代わりに CI/CD からの OIDC トークンを優先します (AppRole)
バインドされたクレームはできる限り具体的である必要があります (リポジトリ、ブランチ、環境)
CI/CD のトークン短い TTL (5 ~ 15 分)
トークンの誤用を防ぐためにbound_audiencesを使用してください
6。概要
LDAP Auth — 既存の AD/LDAP インフラストラクチャを活用した、人間ユーザー向けのエンタープライズ選択
OIDC Auth — 人間ユーザー向けの最先端、SSO、MFA、ブラウザベースのログイン
JWT Auth — CI/CD (GitHub Actions OIDC、GitLab CI JWT) に最適、静的シークレットを保存する必要はありません
次の記事では、Kubernetes、AWS、およびクラウドの認証方法、つまりワークロード ID に基づく認証に焦点を当てます。