Chuyển đến nội dung chính

レッスン 12: LDAP、OIDC、および JWT 認証方法

LDAP 認証方法 (LDAP/Active Directory の構成、グループ マッピング、ポリシー)、OIDC 認証方法 (Keycloak、Azure AD、Okta、Google による構成)、JWT 認証方法 (CI/CD 用 — GitHub Actions OIDC、GitLab CI JWT)、バインドされたクレーム、クレーム マッピング、allowed_redirect_uris。

🔒 D​​evSecOps — レッスン 12 レッスン 12: LDAP、OIDC、および JWT 認証方法

HashiCorp Vault の基本から上級まで

パート 3: 認証方法 - 認証と認可

xdev.asia

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__P​​3__ を使用して、部門/役割ごとにアクセスを制限します

  • 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 に基づく認証に焦点を当てます。