Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Keycloak を使った SSO で CockroachDB にログインする / Cockr...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Keycloak を使った SSO で CockroachDB にログインする / CockroachDB SSO with Keycloak

Avatar for kota2and3kan

kota2and3kan

March 12, 2026
Tweet

More Decks by kota2and3kan

Other Decks in Technology

Transcript

  1. Name: こたつ&&みかん Account: @kota2and3kan Company: Name: Scalar, Inc. Product: -

    ScalarDB (Distributed Transaction Manager) - ScalarDL (Byzantine Fault Detection Middleware) Job: [Technical Support, Infra Engineer] Like: DB: [PostgreSQL, CockroachDB] Bouldering: 5Q Dislike: Real Cockroach Who am I.
  2. Keycloak とは • いわゆる IdP (Identity Provider) / OP (OpenID

    Provider) / AS (Authorization Server)。ユーザー情報や認証/認可を一元管理できる。 • OIDC (OpenID Connect) や SAML (Security Assertion Markup Language) を サポートしている。 • https://www.keycloak.org/
  3. CockroachDB には 2つの SSO 機能がある 1. Configure OIDC Authorization for

    DB Console ◦ OIDC (OpenID Connect) を利用した DB Console (いい感じの Web UI) へ のログイン。 ◦ https://www.cockroachlabs.com/docs/v26.1/oidc-authorization 2. Configure JWT Authorization ◦ JWT を利用した SQL Interface へのログイン。厳密には OIDC や OAuth 2.0 の仕様に沿った仕組みではないが、IdP から発行された ID Token や Access Token が利用可能。 ◦ https://www.cockroachlabs.com/docs/v26.1/sso-sql
  4. IdP で認証されたユーザーを自動で作成できる • Automatic user provisioning ◦ IdP 側で認証されたユーザーを、自動的に CockroachDB

    側に作成してくれ る。 ◦ CockroachDB 側での (手動での) ユーザー作成が不要になり、IdP 側での ユーザー情報の一元管理が可能になる。 ◦ DB Console ▪ https://www.cockroachlabs.com/docs/stable/sso-db-console#option- 1-automatic-user-provisioning-recommended ◦ SQL Interface ▪ https://www.cockroachlabs.com/docs/v26.1/sso-sql#configure-user-p rovisioning
  5. Role の割り当ても IdP 側で管理できる 1. Configure OIDC Authorization for DB

    Console ◦ ID Token 内の特定の claim (デフォルトは “groups” claim) の値を基に、認証 されたユーザーに Role を自動的に割り当ててくれる。 ◦ https://www.cockroachlabs.com/docs/v26.1/oidc-authorization 2. Configure JWT Authorization ◦ JWT 内の特定の claim (デフォルトは “groups” claim) の値を基に、認証され たユーザーに Role を自動的に割り当ててくれる。 ◦ https://www.cockroachlabs.com/docs/v26.1/jwt-authorization
  6. Demo 環境概要 (Pod) $ kubectl get pod NAME READY STATUS

    RESTARTS AGE cockroachdb-0 1/1 Running 0 4m9s cockroachdb-1 1/1 Running 0 4m9s cockroachdb-2 1/1 Running 0 4m9s cockroachdb-client 1/1 Running 0 2m54s cockroachdb-init-zspqq 0/1 Completed 0 4m9s keycloak-0 1/1 Running 0 6m45s postgres-54d858b658-8jpqj 1/1 Running 0 6m45s
  7. PostgreSQL Kubernetes (minikube) Keycloak Demo 環境概要 (SQL Interface へのログイン) CockroachDB

    Cluster SQL CLI CockroachDB CockroachDB CockroachDB ターミナル ブラウザ
  8. CockroachDB 側に goki と buri は存在しない root@cockroachdb-public:26257/defaultdb> SHOW USERS; username

    | options | member_of | estimated_last_login_time -----------+-----------+-----------+-------------------------------- admin | {} | {} | NULL bar | {NOLOGIN} | {} | NULL baz | {NOLOGIN} | {} | NULL foo | {NOLOGIN} | {} | NULL root | {} | {admin} | 2026-03-07 14:13:42.890919+00 (5 rows)
  9. CockroachDB 側の Role は事前に作る必要がある root@cockroachdb-public:26257/defaultdb> SHOW USERS; username | options

    | member_of | estimated_last_login_time -----------+-----------+-----------+-------------------------------- admin | {} | {} | NULL bar | {NOLOGIN} | {} | NULL baz | {NOLOGIN} | {} | NULL foo | {NOLOGIN} | {} | NULL root | {} | {admin} | 2026-03-07 14:13:42.890919+00 (5 rows)
  10. CockroachDB 側に “goki” が自動で作成される root@cockroachdb-public:26257/defaultdb> SELECT -> username, -> member_of

    -> FROM -> [SHOW USERS] -> WHERE -> username = 'goki'; username | member_of -----------+------------ goki | {bar,foo} (1 row)
  11. goki は Role “foo” と “bar” のメンバーになっている root@cockroachdb-public:26257/defaultdb> SELECT ->

    username, -> member_of -> FROM -> [SHOW USERS] -> WHERE -> username = 'goki'; username | member_of -----------+------------ goki | {bar,foo} (1 row)
  12. Device Authorization Grant での認証処理を開始する $ DEVICE_AUTHORIZATION_RESPONSE=$(curl -s -XPOST \ -d

    'client_id=cockroachdb-sso-client' \ -d 'client_secret=cockroachdb-sso-sample-client-password' \ -d 'scope=openid crdb' \ -d 'nonce=cockroachdb-sso-nonce' \ http://keycloak/realms/cockroachdb-sso-realm/protocol/openid-connect/auth/device) $ echo "${DEVICE_AUTHORIZATION_RESPONSE}" | jq -r '.user_code' KHGM-JFEB $ echo "${DEVICE_AUTHORIZATION_RESPONSE}" | jq -r '.verification_uri' http://keycloak/realms/cockroachdb-sso-realm/device
  13. ID Token を取得する $ DEVICE_ACCESS_TOKEN_RESPONSE=$(curl -s -XPOST \ -d 'client_id=cockroachdb-sso-client'

    \ -d 'client_secret=cockroachdb-sso-sample-client-password' \ -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code' \ -d "device_code=$(echo "${DEVICE_AUTHORIZATION_RESPONSE}" | jq -r '.device_code')" \ http://keycloak/realms/cockroachdb-sso-realm/protocol/openid-connect/token) $ COCKROACHDB_SSO_JWT=$(echo "${DEVICE_ACCESS_TOKEN_RESPONSE}" | jq -r '.id_token') $ echo ${COCKROACHDB_SSO_JWT} eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJuQmotLWdFQjNHSENyNnFkQXF3TjZXMGt4S256Ti1N ZUZoRGxRenROdTdFIn0.eyJleHAiOjE3NzI4OTgyODUsImlhdCI6MTc3Mjg5Nzk4NSwiYXV0aF90aW1lIjoxNzcyODk3 OTQ5LCJqdGkiOiJiOGU3ODlkOS01NTVmLTQ1NTItNzM0MC00MGY3YWUyMzk3N2QiLCJpc3MiOiJodHRwOi8va2V5Y2xv YWsvcmVhbG1zL2NvY2tyb2FjaGRiLXNzby1yZWFsbSIsImF1ZCI6ImNvY2tyb2FjaGRiLXNzby1jbGllbnQiLCJzdWIi OiI3Mzg3YjFlOC1lNDkzLTQ4MjY... (omit)
  14. ID Token を指定して SQL CLI でログインできる $ kubectl exec -it

    cockroachdb-client -- ./cockroach sql --url "postgresql://buri: ${COCKROACHDB_SSO_JWT} @cockroachdb-public:26257?options=--crdb:jwt_auth_e nabled=true" --certs-dir=./cockroach-certs # # Welcome to the CockroachDB SQL shell. # All statements must be terminated by a semicolon. # To exit, type: \q. (omit) buri@cockroachdb-public:26257/defaultdb> buri@cockroachdb-public:26257/defaultdb> SELECT current_user; current_user ---------------- buri (1 row)
  15. CockroachDB 側に “buri” が自動で作成される root@cockroachdb-public:26257/defaultdb> SELECT -> username, -> member_of

    -> FROM -> [SHOW USERS] -> WHERE -> username = 'buri'; username | member_of -----------+------------ buri | {bar,baz} (1 row)
  16. buri は Role “bar” と “baz” のメンバーになっている root@cockroachdb-public:26257/defaultdb> SELECT ->

    username, -> member_of -> FROM -> [SHOW USERS] -> WHERE -> username = 'buri'; username | member_of -----------+------------ buri | {bar,baz} (1 row)
  17. まとめ • CockroachDB は SSO でのログインができる! • IdP で認証されたユーザーを、自動的に CockroachDB

    側に 作ってくれる! • Role の割り当てもいい感じに IdP 側で管理できる!