Keycloakは、主にWebおよびモバイルアプリケーションにおける認証、認可、シングルサインオン(SSO)を提供することを目的としています。
Keycloakは、セキュリティとアクセス制御を一元管理することで、アプリケーション開発者がこれらの機能を効率的に組み込むことができるように設計されています。
Kubeflowはデフォルトでdexを使用して認証機能を提供していますがこの認証機能は変更することが可能です。Kubeflowの認証機能をKeycloakに変更する方法をシェアしたいと思います。
以下の記事では、Windows環境にKubeflowのインストール方法をシェアしているので、Kubeflowのインストールがまだであれば、こちらの記事を参照してください。
1. Keycloakの設定
1. Kuberntes環境へKeycloakのデプロイ
Keycloakの公式サイトから、KeycloakのManifestファイルをダウンロードします。
https://www.keycloak.org/getting-started/getting-started-kube
$ kubectl create -f https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes/keycloak.yaml -n auth
ifconfig
でIPアドレスを取得して、下記のURLでアクセスできるか確認してみてください。
http://<取得したIPアドレス>:8080
アクセスができたら次のような画面が表示されるはずです。
「Administration Console」をクリックするとログイン画面が表示されるので、下記のユーザ名とパスワードでログインしてください。
ユーザ名:admin パスワード:admin
2. KeycloakコンソールからClientの設定
Keycloakのコンソールから、ClientにKubeflowを設定します。
※今回の目標はKubeflowの認証機能をKeycloakに変更することなので、レルムの設定などは行いません。
1. Clientの作成
左側のメニューから「Client」をクリックします。
「Create client」をクリックして、クライアントを作成します。
2. Client IDの設定
「Client ID」を設定します。
今回はkubeflow-oidc-authservice
と設定しました。
3. Client authenticationの設定
「Client authentication」を「On」に設定します。
4. Valid redirect URIsの設定
「Valid redirect URIs」を設定します。
ここは下記のURLを設定してください。
http://localhost:8989/authservice/oidc/callback
5. Secretの取得
作成したClientをクリックして、Secretを取得します。
作成したClientを選択してください。
「Credential」タブの「Client Secret」の情報を取得します。
後ほどKubeflow側の設定の際に使用するのでメモしておいてください。
6. メールアドレスの設定
今回の設定では、ユーザのメールアドレスが必須になるので、メールアドレスを設定します。
左側のメニューの「Users」をクリックします。
※今回はユーザ作成は実施しないので、デフォルトで作成されているadmin
ユーザに対して設定を行います。
メールアドレスを設定します。
これでKeycloak側の設定が完了しました。
2. Kubeflowの設定
ManifestファイルでKubeflowをインストールした場合に、認証機能周りの情報が記載されているディレクトリは下記となります。
manifests/common/oidc-authservice/base
設定を変更するファイルとしては、下記の2ファイルの編集を行います。
params.env
secret_params.env
コンテナ起動時に権限が不十分で、権限エラーが発生するため下記のStatefulSetに修正を行います。
statefulset.yaml
1. OIDCプロバイダの変更
params.env
を下記のように修正します。
OIDC_PROVIDER
とOIDC_AUTH_URL
は、ifconfig
で取得したIPアドレスを設定してください。
# http://<keycloakのIP>:<keyclockのport>/realms/<レルム名> OIDC_PROVIDER=http://<IPアドレス>:8080/auth/realms/master # http://<keycloakのIP>:<keyclockのport>/realms/<レルム名>/protocol/openid-connect/auth OIDC_AUTH_URL=http://<IPアドレス>:8080/auth/realms/master/protocol/openid-connect/auth # profile email groups ⇒ profile email OIDC_SCOPES=profile email # 追加 AUTHSERVICE_URL_PREFIX=/authservice/ # /dex ⇒ /authservice SKIP_AUTH_URLS=/authservice AFTER_LOGOUT_URL=/ # http://<kubeflowのIP>:<kubeflowのport>/authservice/oidc/callback REDIRECT_URL=http://localhost:8989/authservice/oidc/callback USERID_HEADER=kubeflow-userid USERID_PREFIX= USERID_CLAIM=email PORT="8080" STORE_PATH=/var/lib/authservice/data.db
※最初にKeycloakのServiceへの内部IPを指定したのですが、Kubeflowアクセスの際に内部IPだとうまくいきませんでした。
secret_params.env
を下記のように修正します。
# Keycloakコンソールで設定したclient id CLIENT_ID=kubeflow-oidc-authservice # keycloakコンソールで取得したclient secret CLIENT_SECRET=〇〇〇〇〇〇〇
2. StatefulSetの修正
statefulset.yaml
を下記のように修正します。
apiVersion: apps/v1 kind: StatefulSet metadata: name: authservice spec: replicas: 1 selector: matchLabels: app: authservice serviceName: authservice template: metadata: annotations: sidecar.istio.io/inject: "false" labels: app: authservice spec: serviceAccountName: authservice ################################# # 権限変更処理の追加 initContainers: - name: fix-permission image: busybox command: ['sh', '-c'] args: ['chmod -R 777 /var/lib/authservice'] volumeMounts: - mountPath: /var/lib/authservice name: data ################################# containers: - name: authservice image: gcr.io/arrikto/kubeflow/oidc-authservice:e236439 imagePullPolicy: Always ports: - name: http-api containerPort: 8080 envFrom: - secretRef: name: oidc-authservice-client - configMapRef: name: oidc-authservice-parameters volumeMounts: - name: data mountPath: /var/lib/authservice readinessProbe: httpGet: path: / port: 8081 securityContext: fsGroup: 111 volumes: - name: data persistentVolumeClaim: claimName: authservice-pvc
3. 変更の適用
修正が完了したら、下記のコマンドでManifestファイルを適用します。
# manifests/common/oidc-authservice/base直下で適用する $ kustomize build | kubectl delete -f - $ kustomize build | kubectl apply -f -
Podの状態は、下記のコマンドで確認できるのでエラーが出力されていないか確認してみてください。
# 認証系を提供するリソース $ kubectl get pods -n istio-system $ kubectl describe pods -n istio-system authservice-0 $ kubectl logs -n istio-system authservice-0 # keycloakのリソース $ kubectl get pods -n auth $ kubectl describe pods -n auth keycloak-6f447f47f4-9hhd4 $ kubectl logs -n auth keycloak-6f447f47f4-9hhd4 # 適宜Pod名は修正する
3. Kubeflowへのアクセス
Kubeflowにアクセスするために、下記のコマンドを実行します。
$ kubectl port-forward svc/istio-ingressgateway -n istio-system 8989:80
ブラウザから下記のURLでアクセスできます。
http://localhost:8989
Keycloakのログイン画面が表示されます。
ユーザ名とパスワードはKeycloakの下記でアクセスができます。
ユーザ名:admin パスワード:admin
実際にログインができました。
Keycloak上でユーザを作成すれば、作成したユーザでアクセスができます。