はじめに
生成AIのMVPアプリを作るなら、セキュリティも最初からちゃんと考えておきたいところ。ログイン認証にはIBM Verifyを使って、LLMのクラウドAPIキーとかシークレット情報はHashiCorp Vaultでしっかり管理。これだけでも安心して開発を進められる土台ができます。
そこでシークレット管理としてHashiCorp Vaultを利用する時、ログイン認証のMethodにOIDCが選べることに気が付きます。「そうだ IBM Cloud でログイン認証に使ってる IBMid をここで使えたら便利」と思いませんか?
HashiCorp Vault とは
Vaultは APIキーやAPIシークレット、管理権限のユーザーIDやパスワードといったシークレットを暗号化し、アクセスを制御することで、シークレット管理機能を提供します。Vaultを使用するとポリシーを適用して、シークレット、証明書、キー、データを保護します。
IBM Verify とは
IBM VerifyはいわゆるIAM ソリューションでID管理とアクセス管理、特権アカウントの制御のための機能を提供します。OktaやAuth0のようなIAMサービスであり Azure Active Directory (Azure AD) のようなIDプラットフォーム的な使い方もできます。
今回は、その中でもDirectory機能として独自Directory ProviderとIBM Cloudにログインする時に使う IBMid を用いて認証を行えることに着目しました。
ここで試せること
IBM VerifyをOIDC IDプロバイダーとして、HashiCorp Vaultに設定します。
VaultでAdminとReaderの2つのグループを作成し、IBM Verifyのdepartment属性にマッピングすることでアクセスを分離します。同様の設定は、Verifyでユーザーをグループに追加し、Vaultでグループ名をマッピングすることでも実現できます。
ここではIBM Verifyを使ってますが、もちろんOIDC認証をサポートする他のIAMプラットフォームもVaultは対応しています(むしろそっちの記事の方が多い)
前提条件
- IBM Verify インスタンス(IBM Cloudサービスとして利用可能)
- HashiCorp Vault
設定手順
ステップ1: IBM Verify に HashiCorp Vault アプリケーションを追加
- Verify 管理コンソールで、Application に移動し、Add application を選択
- Hashicorp Vault を検索してアプリケーションを追加
- アプリケーションページで Sign-on タブを選択、次の3か所入力します
-
Application URL に Vault インスタンスの URL を入力 (VAULT_ADDR 例えば
https://your-vault-hostname.hashicorp.cloud:8200) -
Redirect URIs に以下のエントリを追加:
-
VAULT_ADDR/ui/vault/auth/oidc/oidc/callback(VAULT_ADDR は Vault インスタンスの URL) -
http://localhost:8250/oidc/callback(Vault CLI 用)
-
- 下にスクロールして Attribute mappings セクションで、Attribute name を
group、Attribute source をdepartmentに更新 - Save をクリックした後、もう一度この画面に戻って、Entitlement タブで Automatic access for all users and groups を選択
- Save をクリック
- Vault側の設定で使用するため、Sign-on タブから Client ID と Client secret の値をコピーしておく
ステップ2: Vault側のOIDC設定
OIDCプロトコルは標準化されているので、各プロバイダーで必要なのは基本的に Client ID, Client Secret, Discovery URL のみです。
-
Vault CLI に接続
-
OIDC 認証メソッドを有効化:
vault auth enable oidc
IBM Verify の接続情報を追加し、デフォルトロールを設定:
Bash / Linux / macOS:
vault write auth/oidc/config \
oidc_discovery_url="<Verify_Tenant>/oidc/endpoint/default" \
oidc_client_id="Verify_Client_ID" \
oidc_client_secret="Verify_Client_Secret" \
default_role="verify"
PowerShell / Windows:
vault write auth/oidc/config `
oidc_discovery_url="<Verify_Tenant>/oidc/endpoint/default" `
oidc_client_id="Verify_Client_ID" `
oidc_client_secret="Verify_Client_Secret" `
default_role="verify"
注: Discovery URL は、OIDC ProviderのURLで、ここから
.well-known/openid-configurationを取得できます。例えばhttps://<your-hostname>.verify.ibm.com/oidc/endpoint/defaultと記述します
デフォルトロール verify を作成:
Bash / Linux / macOS:
vault write auth/oidc/role/verify \
bound_audiences="Verify_Client_ID" \
allowed_redirect_uris="<VaultAddress>/ui/vault/auth/oidc/oidc/callback" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
user_claim="sub" \
groups_claim="group" \
token_policies="default"
PowerShell / Windows:
vault write auth/oidc/role/verify `
bound_audiences="Verify_Client_ID" `
allowed_redirect_uris="<VaultAddress>/ui/vault/auth/oidc/oidc/callback" `
allowed_redirect_uris="http://localhost:8250/oidc/callback" `
user_claim="sub" `
groups_claim="group" `
token_policies="default"
Admin と Reader のポリシーを作成:
Bash / Linux / macOS:
# Admin ポリシー: Vault のすべての権限を付与
cat > admin.hcl <<EOF
path "*" {
capabilities = ["sudo","read","create","update","delete","list","patch"]
}
EOF
vault policy write admin admin.hcl
# Reader ポリシー: "kv/" パス配下のシークレットの一覧表示と読み取りを許可
cat > reader.hcl <<EOF
path "kv/*" {
capabilities = ["read", "list"]
}
EOF
vault policy write reader reader.hcl
PowerShell / Windows:
# Admin ポリシー: Vault のすべての権限を付与
@"
path "*" {
capabilities = ["sudo","read","create","update","delete","list","patch"]
}
"@ | Out-File -FilePath admin.hcl -Encoding utf8
vault policy write admin admin.hcl
# Reader ポリシー: "kv/" パス配下のシークレットの一覧表示と読み取りを許可
@"
path "kv/*" {
capabilities = ["read", "list"]
}
"@ | Out-File -FilePath reader.hcl -Encoding utf8
vault policy write reader reader.hcl
外部グループ Verify-Admins と Verify-Readers を作成:
Bash / Linux / macOS:
vault write -format=json identity/group name="Verify-Admins" \
policies="admin" \
type="external" | jq -r ".data.id" > admin_group_id.txt
vault write -format=json identity/group name="Verify-Readers" \
policies="reader" \
type="external" | jq -r ".data.id" > reader_group_id.txt
PowerShell / Windows:
vault write -format=json identity/group name="Verify-Admins" `
policies="admin" `
type="external" | ConvertFrom-Json | Select-Object -ExpandProperty data | Select-Object -ExpandProperty id | Out-File -FilePath admin_group_id.txt -Encoding utf8 -NoNewline
vault write -format=json identity/group name="Verify-Readers" `
policies="reader" `
type="external" | ConvertFrom-Json | Select-Object -ExpandProperty data | Select-Object -ExpandProperty id | Out-File -FilePath reader_group_id.txt -Encoding utf8 -NoNewline
注: これらのグループ名は、Verify の属性値やグループ名と一致しなくても大丈夫。
Verify の department 属性値またはグループ名と一致するグループエイリアスを作成:
Bash / Linux / macOS:
vault auth list -format=json | jq -r '.["oidc/"].accessor' > accessor.txt
vault write identity/group-alias name="Admin" \
mount_accessor=$(cat accessor.txt) \
canonical_id="$(cat admin_group_id.txt)"
vault write identity/group-alias name="Reader" \
mount_accessor=$(cat accessor.txt) \
canonical_id="$(cat reader_group_id.txt)"
PowerShell / Windows:
vault auth list -format=json | ConvertFrom-Json | Select-Object -ExpandProperty 'oidc/' | Select-Object -ExpandProperty accessor | Out-File -FilePath accessor.txt -Encoding utf8 -NoNewline
$accessor = Get-Content -Path accessor.txt -Raw
$adminGroupId = Get-Content -Path admin_group_id.txt -Raw
$readerGroupId = Get-Content -Path reader_group_id.txt -Raw
vault write identity/group-alias name="Admin" `
mount_accessor=$accessor `
canonical_id=$adminGroupId
vault write identity/group-alias name="Reader" `
mount_accessor=$accessor `
canonical_id=$readerGroupId
ステップ3: 接続テスト
方法1: ブラウザ経由
- Vault コンソールにブラウザで接続し、OIDCを選択。うまく動いてるとIBM Verify別ウィンドウが開きます。IBMidを使ってログインする時は、左下に控えめにあるリンク Sign in with IBMid をクリックして認証します。
方法2: CLI 経由
vault login -method=oidc
まとめ
もともとHashiCorp VaultはOIDC認証をサポートするIAMプラットフォームと親和性が高いですが、この記事ではIBM VerifyをOIDC ProviderとしてHashiCorp Vaultと接続することができました。



