🐷

OpenMetadataのユーザ管理をKeycloakに任せちゃうよ

に公開

はじめに

https://zenn.dev/kyami/articles/5fd8a6b3f6a091
↑の記事の続きです。
OpenMetadataを宅内のKuberntesクラスター上に構築し、Cloudflare Tunnelで外部公開することに成功したので、次はOpenMetadataのユーザ管理をKeycloakに任せてみました!

Keycolakを構築する環境

ブログBuilding OpenMetadata on Local Kubernetresにて構築したKubernetesクラスター上です。

環境の注意事項

OpenMetadataはCloudflare Tunnelによってドメイン経由でアクセス可能な状態です。

Keycloakの構築

Kubernetes上にKeycloakを構築する手法として、今回もHelmを利用します。
利用するHelmは以下の通りです。
https://artifacthub.io/packages/helm/bitnami/keycloak

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を作成します。
https://github.com/kyamisama/custom_openmetadata_helm_values/blob/main/keycloak_custom_values/keycloak_storage/postgresql-pv.yaml
https://github.com/kyamisama/custom_openmetadata_helm_values/blob/main/keycloak_custom_values/keycloak_storage/postgresql-pvc.yaml
PVとPVCを作成します。

sudo kubectl apply -f postgresql-pv.yaml
sudo kubectl apply -f postgresql-pvc.yaml

bitnamiのValues.yamlからKeycloakをインストール

以下Keycloakのvalues.yamlをダウンロードします。
https://artifacthub.io/packages/helm/bitnami/keycloak?modal=values
ダウンロードしたvalues.yamlから必要な箇所の修正を行いました。
以下が修正後の内容です。
https://github.com/kyamisama/custom_openmetadata_helm_values/blob/main/keycloak_custom_values/keycloak_main_values/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を以下のように修正します。
https://github.com/kyamisama/custom_openmetadata_helm_values/blob/main/cloudflare_custom_values/cloudflare_tunnel/cloudflared.yaml

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がありますのでご参考ください。
https://github.com/kyamisama/custom_openmetadata_helm_values/blob/9e98876da66151e4f78dd9cba7db463eb50e8e89/openmetadata_custom_values/openmetadata_main/openmetadata-values.yaml#L103-L131

openmetadata_values.ymlの修正が完了したら、upgradeコマンドで設定の反映を行います。

sudo helm upgrade  --install openmetadata open-metadata/openmetadata --values openmetadata_values.yml

Keycloak側の設定

keycloak側の設定は簡単で次の操作を行います。

  1. Realmの作成
  2. クライアントの作成
    1. Auth Code Flowを参照)
    2. クライアント作成時のClient Idはopenmetadata.config.authentication.clientIdの値と一致していなければならないので注意です。
  3. ユーザの作成
    1. この時Eメールアドレスを設定する必要があり、その値はOpenMetadataに初期作成されたadminユーザのメールアドレスを設定すること
    2. adminのEメールアドレスのドメインはopenmetadata.config.authorizer.principalDomainの値となります。例:admin@open-metadata.org
  4. グループを作成し作成したユーザを参加させる

以上で、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