OpenMetadataのユーザ管理をKeycloakに任せちゃうよ
はじめに
OpenMetadataを宅内のKuberntesクラスター上に構築し、Cloudflare Tunnelで外部公開することに成功したので、次はOpenMetadataのユーザ管理をKeycloakに任せてみました!
Keycolakを構築する環境
ブログBuilding OpenMetadata on Local Kubernetresにて構築したKubernetesクラスター上です。
環境の注意事項
OpenMetadataはCloudflare Tunnelによってドメイン経由でアクセス可能な状態です。
Keycloakの構築
Kubernetes上にKeycloakを構築する手法として、今回もHelmを利用します。
利用するHelmは以下の通りです。
keycloak用のDBを用意
今回利用するHelmには、bitnamiのPostgreSQLかそれ以外のデータベースかを選択できます。
今回はbitnamiのPostgreSQLを利用することとします。
ちなみに、bitnamiのKeycloakのHelmを実行するとbitnamiのPostgreSQLのHelmが呼ばれ、PostgreSQLのPodが立ち上がります。
keycloak用のDBのストレージを用意
$ sudo mkdir -p /mnt/data/keycloak/postgresql
$ sudo chmod 777 -R /mnt/data/keycloak/postgresql
続いて、PVとPVCを作成します。
PVとPVCを作成します。sudo kubectl apply -f postgresql-pv.yaml
sudo kubectl apply -f postgresql-pvc.yaml
bitnamiのValues.yamlからKeycloakをインストール
以下Keycloakのvalues.yamlをダウンロードします。
以下が修正後の内容です。
修正した箇所は次のとおりです。
auth:
adminUser: "XXXX" # 管理者用コンソールにアクセスする際のユーザ名
adminPassword: "XXXX" # 管理者用コンソールにアクセスする際のパスワード
proxy: "edge" # CloudflareTunnelにおいてSSL終端させるためのプロキシ設定
ingress:
hostname: XXXX.com # CloudflareTunnel経由でアクセするドメイン
annotations:
kubernetes.io/ingress.class: nginx
postgresql:
enabled: true
auth:
postgresPassword: XXXX # PostgreSQLのpostgreユーザのパスワード
username: bn_keycloak # keycloak用のPostgreSQLユーザ名
password: XXXX # keycloak用のPostgreSQLユーザのパスワード
database: bitnami_keycloak # keycloak用のデータベース名
修正したValues.yamlを使ってKeycloakをインストールします。
kyami@k8s-master:~/keycloak$ sudo helm install keycloak bitnami/keycloak -f keycloak-values.yaml
Release "keycloak" has been upgraded. Happy Helming!
NAME: keycloak
LAST DEPLOYED: Fri May 2 09:31:46 2025
NAMESPACE: default
STATUS: deployed
REVISION: 6
TEST SUITE: None
NOTES:
CHART NAME: keycloak
CHART VERSION: 24.6.3
APP VERSION: 26.2.2
Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami for more information.
** Please be patient while the chart is being deployed **
~略~
Podの起動確認
kyami@k8s-master:~/keycloak$ sudo kubectl get pods
NAME READY STATUS RESTARTS AGE
cloudflared-b98cbd596-tgkx4 1/1 Running 2 (176m ago) 176m
cloudflared-b98cbd596-xwczv 1/1 Running 2 (176m ago) 176m
keycloak-0 1/1 Running 0 6m21s
keycloak-postgresql-0 1/1 Running 0 6m21s
mysql-0 1/1 Running 0 3h1m
openmetadata-6cbbc9d994-p4xsm 1/1 Running 0 178m
openmetadata-dependencies-db-migrations-5b5d54cf78-kbx4q 1/1 Running 0 3h1m
openmetadata-dependencies-scheduler-699ff94db6-jck27 1/1 Running 0 3h1m
openmetadata-dependencies-sync-users-86f7fd7978-fgddp 1/1 Running 0 3h1m
openmetadata-dependencies-triggerer-7d968c7955-jcbgf 1/1 Running 0 3h1m
openmetadata-dependencies-web-6b9b65dbb6-dvx6q 1/1 Running 0 3h1m
opensearch-0 1/1 Running 0 3h1m
kyami@k8s-master:~/keycloak$
ここまでで、Keycloakの構築は完了です。
Cloudflare TunnelでKeyClaokを外部公開
外部公開の手順はBuilding OpenMetadata on Local Kubernetresに記載した通りなため割愛します。
OpenMetadataのCloudflare Tunnel定義ファイルのingressを以下のように修正します。
kubectl applyコマンドで定義ファイルを適用します。
sudo kubectl apply -f cloudflared.yaml
cloudflared.yamlで定義したドメイン宛にアクセスすればKeycloakにアクセスできます。
その後、管理者用コンソールへアクセスする場合はkeycloak-values.yamlで定義した以下の値を使ってログインできます。
ログイン後、このユーザは削除し、新たにAdminユーザを作成することをお勧めします。
~略~
adminUser: "XXX"
adminPassword: "XXX"
~略~
KeycloakとOpenMetadata連携
基本的な手順は以下の参考資料をもとにしています。
参考資料:
Keycloak SSO
Auth Code Flow
Keycloak SSO for Kubernetes
OpenMetadata側の設定
OpenMetadataがサインイン時にKeycloakを利用するようにopenmetadata-values.yamlを修正する必要があります。
一旦openmetadata-values.yaml内のopenmetadata.config.authorizerフィールドは全て削除かコメントアウトします。
その後、Keycloak SSO for Kubernetesにアクセスし、Auth ConfigurationのAuthcodeのyamlをopenmetadata-values.yamlに転記します。
続いて、構築したKeycloakと連携されるようフィールド修正を行います。
基本的に{}
で囲われている部分は修正が必要です。さらに、{OMD-server-domain}や{Keycloak-server-URL}は適宜ご自身の環境に合わせていただければと思います。
それ以外の修正箇所について説明します。
Key | Value | Description |
---|---|---|
openmetadata.config.authorizer.enabled | true | 設定を有効にするので必ずtrueにすること |
openmetadata.config.authorizer.initialAdmins | admin | OpenMetadataに初期で作成される管理者ユーザ |
openmetadata.config.authentication.enabled | true | 設定を有効にするので必ずtrueにすること |
openmetadata.config.authentication.clientId | {Client ID} | keycloakでクライアントを作成する際に設定する値 |
openmetadata.config.authentication.oidcConfiguration.enabled | true | 設定を有効にするので必ずtrueにすること |
以下のGithubのリポジトリに修正後のyamlがありますのでご参考ください。
openmetadata_values.ymlの修正が完了したら、upgradeコマンドで設定の反映を行います。
sudo helm upgrade --install openmetadata open-metadata/openmetadata --values openmetadata_values.yml
Keycloak側の設定
keycloak側の設定は簡単で次の操作を行います。
- Realmの作成
- クライアントの作成
- (Auth Code Flowを参照)
- クライアント作成時のClient Idは
openmetadata.config.authentication.clientId
の値と一致していなければならないので注意です。
- ユーザの作成
- この時Eメールアドレスを設定する必要があり、その値はOpenMetadataに初期作成されたadminユーザのメールアドレスを設定すること
- adminのEメールアドレスのドメインはopenmetadata.config.authorizer.principalDomainの値となります。例:admin@open-metadata.org
- グループを作成し作成したユーザを参加させる
以上で、KeycloakとOpenMetadataの連携は完了です。
実際にOpenMetadataへアクセスしてみると、、、
以下スクショのとおり、Sign in with SSO
のボタンがあわれます。
クリックすると、、、Keycloakのサインイン画面にリダイレクトされます。
Keycloak側で設定したadminユーザのEメールアドレスとパスワードでログインすると、、、
無事管理者でログインすることができました。
まとめ
そもそもOpenMetadataにユーザ管理機能があるので、わざわざKeycloakに任せる必要はあるのか?と思われるかも知れません。
確かにそのとおりですが、利用するサービスが他にもある場合、ユーザ管理が手間になります。
例えばOpenMetadataはairflowを利用しており、airflowのユーザはOpenMetadataユーザとは別で存在します。
他にも似たようなサービスを利用している場合、サービス毎にユーザ管理をしなければならず、負担は増します。
なので、ユーザを管理するための専用のサービスとしてKeycloakを導入することに意味はあります。
また、Keycloakには認可を管理する機能があります。
しかし、OpenMetadataにもポリシーやロールといった認可機能があります。
この場合、どこまでをKeycloakが担当し、どこからOpenMetadataが担当するかの境界を明確にする必要があります。
この場合は至ってシンプルで、ユーザ管理はKeycloak、認可のアクセス制御はOpenMetadataとするのが良いと思います。
Discussion