Keycloak 설치하기
Helm 차트를 이용하여 Keycloak을 설치하는 방법에 대해 알아보겠습니다. (Docker Desktop에서 구성한 Kubernetes 환경에 설치한 내용을 정리했습니다)
1. Keycloak 개요
Keycloak은 Redhat에서 개발한 인증(authentication)과 인가(authorization)를 지원하는 오픈 소스이며, OIDC, SAML, OAuth 2.0과 같은 인증과 인가에 대한 표준 프로토콜을 모두 지원합니다.
주요 기능은 다음과 같습니다.
- 사용자 등록
- 소셜 로그인
OpenID, SAML, Github, Google 등 - SSO(Single Sign-On)
동일한 realm에 속한 애플리케이션에 대한 SSO 지원 - 2단계 보안 인증
- LDAP 통합
- Keberos 브로커
- Multi-tenancy
Realm 단위의 커스터마이징이 가능한 스킨 지원 - Client Adapter 및 REST API 지원
또한 Keycloak을 사용하기 전에 다음의 용어들을 미리 알아두는 것이 좋습니다.
- OIDC(Open ID Connect)
OAuth 및 인증, 인가를 모두 포함하는 스펙.
OAuth 2.0을 기반으로 좀 더 간편하게 인증을 처리하도록 동작.
OAuth는 인가, OIDC는 인증 목적으로 사용.
SSO 구현을 위한 대표적인 수단.
Keycloak의 기본 인증 방식은 OAuth 2.0을 기반으로 한 OIDC - Realm
인증과 인가가 적용되는 범위.
동일한 Realm에 속한 애플리케이션들을 대상으로 SSO가 적용됨.
Keycloak에서는 다른 Realm들의 기반이 되는 Master Realm을 제공. - Client
인증과 인가를 대행할 애플리케이션 단위.
Realm 종속적이며 1:n 관계로 하나의 Realm에 여러개의 Client를 생성 가능. - User
Client에 인증을 요청할 사용자.
Realm 종속적이며 1:n 관계로 하나의 Realm에 여러개의 User를 생성 가능. - Role
User에게 부여할 권한.
Realm 또는 Client와 관련된 권한을 부여하거나 별도로 구성된 권한을 부여하는 것이 가능. - Group
User가 속할 수 있는 그룹.
Group에 Role을 매핑할 수 있고 그룹에 속한 사용자는 권한을 상속 받게됨.
2. Keycloak 설치
2.1. Helm을 이용한 Keycloak 설치
keycloak 설치를 위해 Helm Repository를 추가해줍니다. bitnami는 애플리케이션 설치를 위한 다양한 차트를 지원하는 라이브러리입니다.
$ helm repo add bitnami https://charts.bitnami.com/bitnami
추가한 Repository의 Helm Chart를 다운로드 해줍니다.
$ git clone https://github.com/bitnami/charts.git
values.yaml 파일이 있는 위치로 이동해줍니다.
$ cd charts/bitnami/keycloak
values.yaml 파일을 열어서 Web UI에서 사용할 admin 계정을 설정해줍니다.
$ vi values.yaml
...
## Keycloak authentication parameters
## ref: https://github.com/bitnami/bitnami-docker-keycloak#admin-credentials
##
auth:
## @param auth.createAdminUser Create administrator user on boot
##
createAdminUser: true
## @param auth.adminUser Keycloak administrator user
##
adminUser: admin
## @param auth.adminPassword Keycloak administrator password for the new user
##
adminPassword: ${adminPassword}
...
네임스페이스를 생성하고 helm으로 keycloak을 설치해줍니다.
$ kubectl create namespace keycloak
$ helm install keycloak bitnami/keycloak -f values.yaml --namespace keycloak
NAME: keycloak
LAST DEPLOYED: Tue Sep 21 18:10:21 2021
NAMESPACE: keycloak
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
Keycloak can be accessed through the following DNS name from within your cluster:
keycloak.keycloak.svc.cluster.local (port 80)
To access Keycloak from outside the cluster execute the following commands:
1. Get the Keycloak URL by running these commands:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch its status by running 'kubectl get --namespace keycloak svc -w keycloak'
export SERVICE_PORT=$(kubectl get --namespace keycloak -o jsonpath="{.spec.ports[0].port}" services keycloak)
export SERVICE_IP=$(kubectl get svc --namespace keycloak keycloak -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "http://${SERVICE_IP}:${SERVICE_PORT}/auth"
2. Access Keycloak using the obtained URL.
3. Access the Administration Console using the following credentials:
echo Username: admin
echo Password: $(kubectl get secret --namespace keycloak keycloak -o jsonpath="{.data.admin-password}" | base64 --decode)
설치가 완료되면 pod을 확인해줍니다.
$ kubectl get pods --namespace keycloak
NAME READY STATUS RESTARTS AGE
keycloak-0 1/1 Running 0 101s
keycloak-postgresql-0 1/1 Running 0 101s
브라우저에서 확인하기 위해 서비스의 type을 NodePort로 변경해주고 nodePort를 지정해줍니다.
$ kubectl edit service keycloak --namespace keycloak
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
...
spec:
...
ports:
- name: http
nodePort: 31234
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 31715
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: keycloak
app.kubernetes.io/instance: keycloak
app.kubernetes.io/name: keycloak
sessionAffinity: None
type: NodePort
...
설정을 변경하면 서비스를 확인해줍니다.
$ kubectl get services --namespace keycloak
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
keycloak NodePort 10.102.132.21 <none> 80:31234/TCP,443:31715/TCP 5m49s
keycloak-headless ClusterIP None <none> 80/TCP 5m49s
keycloak-postgresql ClusterIP 10.108.172.47 <none> 5432/TCP 5m49s
keycloak-postgresql-headless ClusterIP None <none> 5432/TCP 5m49s
2.2. Keycloak Console 확인
브라우저에 접속하여 keycloak console을 확인해줍니다. keycloak 서비스에 nodePort로 설정한 포트로 접속해줍니다.
'Administration Console' 버튼을 클릭해서 로그인 화면으로 이동한 후에 values.yaml에서 설정한 admin 계정으로 로그인해줍니다.
정상적으로 로그인이 되면 다음과 같이 홈 화면이 나타납니다. keycloak의 기본 realm인 Master realm의 설정 화면을 확인할 수 있습니다.
이상으로 Kubernetes에 Keycloak을 설치하는 방법에 대해 알아봤습니다.
※ Reference
- github.com/choisungwook, helm keycloak, https://github.com/choisungwook/portfolio/wiki/helm-keycloak
- subji.github.io, MSA 인증 서비스 Keycloak 소개, https://subji.github.io/posts/2020/07/08/keycloak1
- oingdaddy.tistory.com, MSA 인증서비스를 쉽게 해주는 KeyCloak 설치하기, https://oingdaddy.tistory.com/191
- taesunny.github.io, How to install Keycloak in Kubernetes Cluster with Helm, https://taesunny.github.io/howto/how-to-install-keycloak-in-kubernetes-cluster-with-helm/
- alice-secreta.tistory.com, KeyCloak 설치 & 정리, https://alice-secreta.tistory.com/28
- jsonobject.tistory.com, JBoss Keycloak, 오픈 소스 인증, 인가 대행 솔루션 소개, https://jsonobject.tistory.com/445