작업 상황
Kubeflow와 Keycloak이 각각 다른 클러스터에 설치되어 있다. Kubeflow가 설치된 Cluster에 같이 설치되어 있는 Kubeflow의 기본 인증 모듈인 Dex를 Keycloak으로 변경하였다.(인증 시 Keycloak 클러스터 연동)

※ 테스트를 위한 임의 환경임
테스트용 환경이므로 인증서를 설치하지 않고 http를 허용하여 임의로 테스트를 진행하였다.
* Keycloak master realm에서 sslRequired를 NONE으로 변경해주었음
$ ./kcadm.sh update realms/master -s sslRequired=NONE
* Keycloak이 설치된 클러스터의 ingress gateway host 설정도 http 허용으로 수정하였음
오류 상황
인증 방식 변경을 완료한 후, Kubeflow 대시보드로 접속을 하면 Keycloak 로그인 페이지로 정상적으로 연동되고, 로그인도 정상 처리되나 로그아웃 시 403 Forbidden 오류 발생하며 로그아웃이 정상적으로 처리되지 않았다.
Request Method: POST
Status Code: 403 Forbidden



오류 원인
결론부터 말하면, 인증서가 적용되지 않아서 발생한 오류로 인증서가 적용되면 해당 오류는 발생하지 않는다. oidc-authservice에서 로그아웃 시 토큰을 폐기하려고 할 때 https가 아닌 http로 호출하여 프로그램에서 exception을 발생시켜 error로 종료된 상황이다.
아래 인증 flow에서 도대체 어느 구간에서 403 오류를 발생시키는 건지 원인을 찾는데 한참 헤맸다.

오류 로그 및 추적 과정
<로그아웃 버튼을 클릭한 후 로그 확인 과정>
1. 위 Flow 그림에 있는 [OIDC Provider]에 해당하는 Keycloak이 설치된 cluster에서 로그아웃 버튼 클릭 시 호출이 들어오는지 로그를 확인했는데, 아무 로그가 찍히지 않았다. 이걸 보아 OIDC Provider로 진입 전에 exception이 발생한 것이라고 생각했다.
(* pod 로그 조회 명령어 예 : $kubectl logs -f keycloak-5cd8d6595f-46jzd -n hbr-keycloak)
2. 로그아웃 버튼 클릭 시 kubeflow cluster의 [Istio Gateway]에는 403 오류 로그가 찍힌다. 이걸 보아 Istio Gateway까지 넘어갔다가 뒷단 프로그램에서 넘겨주는 오류를 정상적으로 받아서 리턴한 것을 알 수 있었다.
$ kubectl get pods -n istio-system

$ kubectl logs -f istio-ingressgateway-6f7997fc44-lmjf9 -n istio-system

3. [AuthService] authservice-0 파드 로그 확인 시 아래와 같이 토큰 폐기 api 호출 시 https로 호출되지 않아서 오류가 발생했음을 알 수 있었다. 🤯😖
$ kubectl logs -f authservice-0 -n istio-system

time="2024-05-27T17:28:20Z" level=info msg="Attempting to revoke refresh token..."
time="2024-05-27T17:28:20Z" level=error msg="Error revoking tokens: Error revoking tokens: Failed to revoke refresh token: Revocation endpoint (http://34.64.230.135/realms/master/protocol/openid-connect/revoke) MUST use https" ip=10.244.0.32 request=/authservice/logout userid=admin@test.com
오류 조치(임시 우회 조치)
오류 조치를 위한 정상적인 방법은 인증서를 적용하는 것이다. 하지만, 본 환경은 테스트 환경이기도 하고 위 오류를 발생시키는 소스를 확인해서 수정한 후 http 호출로도 logout이 정상적으로 되는지 확인해보고 싶었다.
그래서.. 아래 순서로 작업 후 로그아웃에 성공했다. 👏👏👏
1. "arrikto/oidc-authservice" github repository에서 error 발생시키는 코드 확인

2. 오류 발생 소스 임시 skip

3. 수정된 소스로 Docker image 빌드
Dockerfile도 repository에 다 있어서 소스 수정 후 build만 하면 된다.
4. Docker Hub에 빌드한 이미지 push
docker push eunong/oidc-authservice-edit:latest
docker pull eunong/oidc-authservice:latest
5. kubeflow에서 참조하는 oidc-authservice image를 수정한 이미지(4번)로 변경
manifests로 설치한 kubeflow의 oidc-authservice image를 수정한다.
$ vi ~/manifests/common/oidc-authservice/base/statefulset.yaml

6. oidc-authservice 관련 kubernetes resource 삭제 후 재반영
cd ~/manifests/common/oidc-authservice/base
kustomize build | kubectl delete -f -
kustomize build | kubectl apply -f -

7. 로그아웃 정상 처리됨 확인



테스트 환경 및 버전
- Cloud CSP : Google Cloud
- VM Image : ubuntu-2004-focal-v20240519
- OS 버전 : Ubuntu 20.04.6 LTS (Focal Fossa)
- Kubeflow Version: v1.7.0
- Kubernetes Client Version: v1.29.5
- Kubernetes Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
- Kubernetes Server Version: v1.29.2
참고
kubeflow 인증 방식 DEX -> Keycloak 변경 시 참조한 블로그
아래 방법이 최신 방법이므로 첫 번째 블로그 링크를 참조하면 좋을 것 같다.
테스트 결과 Kubeflow 1.8~ 버전에서는 정상적으로 인증 방식이 변경되지 않는 것으로 확인하였다. (Keycloak 초기 로그인 페이지가 떴다가, 로그인 한 후에 DEX로 계속 Redirect 되는 현상 발생)
본 케이스 처럼 인증 방식을 변경하고 싶을 경우 1.7 이하 버전에서 작업할 것!
Integrating Keycloak with Kubeflow
Integrating Keycloak with Kubeflow - 機械学習ともろもろ
Keycloak is primarily designed to provide authentication, authorization, and Single Sign-On (SSO) for web and mobile applications. It is designed to centralize security and access control, enabling application developers to efficiently integrate these feat
venoda.hatenablog.com
Using Keycloak for Kubeflow (instead of dex)
Using Keycloak for Kubeflow (instead of dex)
Dex is the defalut authentication application of kubeflow and there is a option using both dex and keycloak. But I wanted to use…
medium.com