Keycloak 개념, Helm으로 배포하기
Grafana, ArgoCD 등의 다양한 서비스를 사용하다 보면, 각각의 서비스마다 인증 및 권한 관리를 별도로 구현해야 하는 번거로움이 있습니다. 이떄 Keycloak을 사용하여 SSO(Single Sign On)를 구현하면, 각 서비스마다 인증 및 권한 관리를 효율적으로 관리할 수 있습니다.
Keycloak은 Rad Hat이 개발한 오픈소스 Identity and Access Management(IAM) 서비스로, OAuth2, OpenID Connect, SAML 등의 프로토콜을 지원하며, 다양한 Client와 연동이 가능합니다. Keycloak을 사용해 SSO를 구현하면, 사용자는 한 번의 로그인으로 여러 서비스에 접근할 수 있으며, 서비스 관리자는 사용자의 인증 및 권한을 효율적으로 관리할 수 있습니다.
이번 포스트에서는 Keycloak의 구성 요소에 대해 알아보고 Helm을 사용해 Kubernetes 환경에 Keycloak을 배포하는 방법에 대해 알아보겠습니다.
주요 개념
1. Realm
- 사용자, 애플리케이션(Client), 자격 증명, 세션 등을 하나로 묶는 경계
- 개발/스테이징/프로덕션 등 다양한 환경을
Realm
으로 구분하여 운영 가능
2. Client
- Keycloak에 등록된 애플리케이션 (ex. Grafana, ArgoCD)
- 각 Client마다 OIDC, SAML 등 인증 방식을 지정하고, Callback URL(redirect URI), 권한 부여 방식을 설정
3. Role / Group
- Keycloak에서 사용자의 권한을 나타내는 단위
- Role은 Realm 전체에 적용되는
Realm Role
과, 특정 Client에 국한되는Client Role
로 구분
4. Identity Provider (IDP)
- 다른 SSO 또는 소셜 로그인(Google, GitHub 등)을 Keycloak과 연동할 때 사용
- Keycloak이 외부 IDP를 통해 인증을 대행할 수 있음
Helm으로 Keycloak 배포하기
Bitnami에서 제공 Keycloak Helm Chart를 사용하여 Keycloak을 배포해보도록 하겠습니다.
1. Helm Repository 추가
1
2
❯ helm repo add bitnami https://charts.bitnami.com/bitnami
❯ helm repo update
2. Values 파일 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
replicaCount: 1 # 고가용성을 위해서는 replicaCount를 2 이상으로 설정
tls:
enabled: true
existingSecret: keycloak.kkamji.net-tls
usePem: true
ingress: # Ingress 설정 (Let's Encrypt와 Cert-Manager를 통해 TLS 인증서 발급 및 HTTPS 설정)
enabled: true
ingressClassName: nginx
hostname: {Your Domain}
path: /
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/ingress.class: nginx
tls: true
servicePort: https
auth:
adminUser: admin #admin유저의 이름
production: true
3. 배포
adminPassword는 안전상 values.yaml 파일에 하드코딩을 하는 것보다는 별도로 –set auth.adminPassword=’{YOUR_PASSWORD}’로 전달하거나 Secret을 사용하는 것이 좋습니다.
1
2
❯ helm install keycloak -n keycloak bitnami/keycloak -f values.yaml \
--create-namespace --set auth.adminPassword='{YOUR_PASSWORD}'
4. 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ k get all -n keycloak
NAME READY STATUS RESTARTS AGE
pod/keycloak-0 1/1 Running 0 5h31m
pod/keycloak-postgresql-0 1/1 Running 0 20h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/keycloak ClusterIP 10.233.27.153 <none> 80/TCP 20h
service/keycloak-headless ClusterIP None <none> 8080/TCP 20h
service/keycloak-postgresql ClusterIP 10.233.47.86 <none> 5432/TCP 20h
service/keycloak-postgresql-hl ClusterIP None <none> 5432/TCP 20h
NAME READY AGE
statefulset.apps/keycloak 1/1 20h
statefulset.apps/keycloak-postgresql 1/1 20h
마무리
Keycloak은 인증과 권한 관리를 중앙에서 통합함으로써, SSO 구현이 필요할 때 유용하게 사용할 수 있는 오픈소스 솔루션입니다.
Helm Chart를 사용하면 Kubernetes 환경에서 Keycloak을 쉽게 배포하고 운영할 수 있으며, 고가용성과 TLS 설정도 간단하게 적용할 수 있습니다.
다음 글에서는 ArgoCD와 Keycloak을 연동하여, ArgoCD에 SSO를 적용하는 방법에 대해 알아보겠습니다.
궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji