Slide 1

Slide 1 text

2026/03/12 Database Engineering Meetup #9 Keycloak を使った SSO で CockroachDB にログインする #DBEM \ コンニチハ /

Slide 2

Slide 2 text

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.

Slide 3

Slide 3 text

今回の検証に利用したマニフェスト https://github.com/kota2and3kan/keycloak-samples

Slide 4

Slide 4 text

Keycloak

Slide 5

Slide 5 text

Keycloak とは ● いわゆる IdP (Identity Provider) / OP (OpenID Provider) / AS (Authorization Server)。ユーザー情報や認証/認可を一元管理できる。 ● OIDC (OpenID Connect) や SAML (Security Assertion Markup Language) を サポートしている。 ● https://www.keycloak.org/

Slide 6

Slide 6 text

CockroachDB の SSO (Single Sign-on) \ SSO /

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Demo 環境 \ カンキョウ /

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Kubernetes (minikube) PostgreSQL Keycloak Demo 環境概要 (DB Console へのログイン) CockroachDB Cluster SQL CLI CockroachDB CockroachDB CockroachDB ブラウザ

Slide 13

Slide 13 text

PostgreSQL Kubernetes (minikube) Keycloak Demo 環境概要 (SQL Interface へのログイン) CockroachDB Cluster SQL CLI CockroachDB CockroachDB CockroachDB ターミナル ブラウザ

Slide 14

Slide 14 text

Demo \ デモ /

Slide 15

Slide 15 text

Keycloak 側にユーザー (goki と buri) を作成

Slide 16

Slide 16 text

goki の Role は “foo” と “bar” になっている

Slide 17

Slide 17 text

buri の Role は “bar” と “baz” になっている

Slide 18

Slide 18 text

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)

Slide 19

Slide 19 text

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)

Slide 20

Slide 20 text

DB Console \ コンソール /

Slide 21

Slide 21 text

ログイン画面で Log in with Keycloak を選択

Slide 22

Slide 22 text

Keycloak のログイン画面にリダイレクトされる

Slide 23

Slide 23 text

Keycloak 側でログインすると

Slide 24

Slide 24 text

CockroachDB の DB Console にログインできる

Slide 25

Slide 25 text

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)

Slide 26

Slide 26 text

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)

Slide 27

Slide 27 text

SQL Interface \ エスキューエル /

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Verification URL (Keycloak) にアクセス

Slide 30

Slide 30 text

ユーザーコードを入力する

Slide 31

Slide 31 text

buri ユーザーでログインする

Slide 32

Slide 32 text

認可を求められるので Yes を選択する

Slide 33

Slide 33 text

ログイン完了画面が表示される

Slide 34

Slide 34 text

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)

Slide 35

Slide 35 text

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)

Slide 36

Slide 36 text

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)

Slide 37

Slide 37 text

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)

Slide 38

Slide 38 text

まとめ \ マトメ /

Slide 39

Slide 39 text

まとめ ● CockroachDB は SSO でのログインができる! ● IdP で認証されたユーザーを、自動的に CockroachDB 側に 作ってくれる! ● Role の割り当てもいい感じに IdP 側で管理できる!

Slide 40

Slide 40 text

Thank you!