Post

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 Main


마무리

Keycloak은 인증과 권한 관리를 중앙에서 통합함으로써, SSO 구현이 필요할 때 유용하게 사용할 수 있는 오픈소스 솔루션입니다.

Helm Chart를 사용하면 Kubernetes 환경에서 Keycloak을 쉽게 배포하고 운영할 수 있으며, 고가용성과 TLS 설정도 간단하게 적용할 수 있습니다.

다음 글에서는 ArgoCD와 Keycloak을 연동하여, ArgoCD에 SSO를 적용하는 방법에 대해 알아보겠습니다.


궁금하신 점이나 추가해야 할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji

This post is licensed under CC BY 4.0 by the author.