Kubernetes 이야기

argocd와 keycloak을 사용하여 SSO 구축하기 본문

Kubernetes/devops

argocd와 keycloak을 사용하여 SSO 구축하기

kmaster 2022. 5. 14. 23:37
반응형

KeyClock

 

KeyCloak은 다음과 같은 기능을 제공한다.

  • 싱글 사인온 (SSO) : 개별 애플리케이션에서 각각 사용자 인증과 저장을 처리할 필요가 없다. Keycloak에 로그인하면 사용자는 다른 애플리케이션에 액세스하기 위해 다시 로그인할 필요가 없다.
  • OpenID / SAML 2.0 지원 : Keycloak은 또한 기존 OpenID Connect 또는 SAML 2.0 ID 제공자를 사용하여 사용자를 인증할 수 있어 Social Network 의 연동이 쉽다.
  • User Federation : LDAP이나 Active directory 와 연동하여 SSO 처리가 가능하다.
  • 관리 콘솔 : UI을 통해 애플리케이션과 서비스를 생성 및 관리하고 세분화된 권한 부여 정책을 정의할 수 있다.

Keycloak 설치

 

아래와 같이 chart를 다운로드 받은 후 values를 수정한 후 설치한다.

# git clone https://github.com/bitnami/charts.git
# cd charts/bitnami/keycloak
# helm install keycloak bitnami/keycloak -f values.yaml --namespace keycloak --create-namespace

혹은

helm install  --namespace keycloak --create-namespace keycloak bitnami/keycloak --values - <<EOF
auth:
  adminPassword: "password"
  managementPassword: "password"
postgresql:
  enabled: true
  auth:
    username: keycloak
    password: "keycloak"
    database: keycloak
    existingSecret: ""
  architecture: standalone
EOF

 

설치 후 아래와 같이 Pod가 생성되었는지 확인한다.

# k get all -n keycloak
NAME                        READY   STATUS    RESTARTS   AGE
pod/keycloak-0              1/1     Running   0          2m7s
pod/keycloak-postgresql-0   1/1     Running   0          2m7s

NAME                             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/keycloak                 LoadBalancer   10.96.209.133   <pending>     80:31794/TCP,443:31145/TCP   2m7s
service/keycloak-headless        ClusterIP      None            <none>        80/TCP                       2m7s
service/keycloak-postgresql      ClusterIP      10.96.24.137    <none>        5432/TCP                     2m7s
service/keycloak-postgresql-hl   ClusterIP      None            <none>        5432/TCP                     2m7s

NAME                                   READY   AGE
statefulset.apps/keycloak              1/1     2m7s
statefulset.apps/keycloak-postgresql   1/1     2m7s

 

[keycloak ingress 생성]

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: keycloak-ingress
  namespace: keycloak
  annotations:
    cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
spec:
  rules:
  - host: "keycloak.172.21.251.79.nip.io"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: keycloak
            port:
              number: 80
  tls:
  - hosts:
    - keycloak.172.21.251.79.nip.io
    secretName: keycloak-cert

 

이제 브라우저에서 keycloak 콘솔로 접속해 보자.

로그인을 하면 위와 같은 화면을 보게 될 것이다. 그럼 argocd를 위한 keycloak 설정을 해보자.

 

우선 keyclock의 용어를 잠시 살펴보자.

용어 설명
Realms 사용자, 자격 증명, 역할 및 그룹 집합을 관리한다. 사용자가 이 Realm에 속하고 로그인한다. Realm은 서로 격리되어 있으며 자신이 제어하는 ​​사용자만 관리하고 인증할 수 있다.
Clients Client는 Keycloak에 사용자 인증을 요청할 수 있는 객체이다. 대부분의 경우 클라이언트는 Keycloak을 사용하여 자신을 보호하고 싱글 사인온 솔루션을 제공하려는 애플리케이션 및 서비스이다. 클라이언트는 또한 Keycloak으로 보호되는 네트워크의 다른 서비스를 안전하게 호출할 수 있도록 ID 정보 또는 액세스 토큰을 요청하려는 객체일 수도 있다.
Roles 역할은 사용자의 유형 또는 범주를 식별한다. Admin, user, manager및 employee는 모두 조직에 존재할 수 있는 일반적인 역할이다. 사용자를 다루는 것은 너무 세분화되고 관리하기 어려울 수 있으므로 애플리케이션은 종종 개별 사용자가 아닌 특정 역할에 액세스 및 권한을 할당한다
Users 사용자는 시스템에 로그인할 수 있는 객체이다. 이메일, 사용자 이름, 주소, 전화번호, 생년월일 등 자신과 관련된 속성을 가질 수 있다. 그룹 구성원이 할당될 수 있으며 특정 역할이 할당된다.
Groups 그룹은 사용자 그룹을 관리한다. 속성은 그룹에 대해 정의할 수 있다. 역할을 그룹에 매핑할 수도 있다. 그룹의 구성원이 된 사용자는 그룹이 정의하는 속성 및 역할 매핑을 상속한다.
identity token 사용자에 대한 ID 정보를 제공하는 토큰. OpenID Connect 사양의 일부이다.
access token 호출되는 서비스에 대한 액세스 권한을 부여하는 HTTP 요청의 일부로 제공될 수 있는 토큰. 이것은 OpenID Connect 및 OAuth 2.0 사양의 일부이다.
identity provider (IDP) IDP(Identity Provider)는 사용자를 인증할 수 있는 서비스이다. Keycloak은 IDP이다.
client role 클라이언트는 자신에게 특정한 역할을 정의할 수 있다. 이것은 기본적으로 클라이언트 전용의 역할 이름 공간이다.

 

1. Realm 생성

 

 

2. User 와 Group, Role 설정

 

    그룹을 아래와 같이 2개 생성한다.

 

    사용자를 등록한다.

 

    client scope를 생성한다.

   

사용자 Client Scopes 설정

 

3. Client 생성

 

4. secert 저장

 

 

ArgoCD 와 Keyclcok 연동

 

ArgoCD 설치는 아래를 참고한다.

https://kmaster.tistory.com/76

 

argocd (설치)

argo project에는 다양한 오픈소스 프로젝트들이 있다. 대표적으로 argo workflow, argocd, argo rollout, argo event 등이 있다. 이 중 argo workflow의 pipeline을 이용하여 ci/cd 하는 방법에 대해 글을 쓴적..

kmaster.tistory.com

 

ArgoCD OIDC 설정

 

위에서 저장한 Keycloak Client Secret을 base64 인코딩한다.

# echo -n 'JW5DgssNd1DbQFxPBNjHiNc02YnddV1D' | base64
Slc1RGdzc05kMURiUUZ4UEJOakhpTmMwMlluZGRWMUQ=

 

argocd-secret을 다음과 같이 수정한다.

# kubectl edit secret argocd-secret -n argocd
apiVersion: v1
data:
...
  oidc.keycloak.clientSecret: Slc1RGdzc05kMURiUUZ4UEJOakhpTmMwMlluZGRWMUQ=
...

 

argocd-cm configmap을 다음과 같이 수정한다.

# kubectl edit configmap argocd-cm -n argocd
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
data:
  url: https://argocd.172.21.251.79.nip.io
  oidc.config: |
    name: Keycloak
    issuer: https://keycloak.172.21.251.79.nip.io/realms/argocd
    clientID: argocd
    clientSecret: $oidc.keycloak.clientSecret
    requestedScopes: ["openid", "profile", "email", "groups"]

 

keycloak 17+ 버전부터 issuer 이 변경되었다. 기존에 ~/auth/realms/ 에서 ~/realms/ 로 변경되었다.

 

마지막으로 argocd-rbac-cm configmap을 수정한다.

# kubectl edit configmap argocd-rbac-cm -n argocd
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
data:
  policy.csv: |
    g, /argocd-admin, role:admin

 

이제 로그인을 해보자.

로그인 버튼을 클릭하면 아래와 같은 나타난다.

로그인 후 아래와 같이 정상적으로 argocd로 로그인 할 수 있다.

 

 

 

참고

https://argo-cd.readthedocs.io/en/stable/operator-manual/user-management/keycloak/

 

 

반응형

'Kubernetes > devops' 카테고리의 다른 글

argocd (활용 - helm chart 및 Kustomize 배포)  (0) 2022.05.18
argocd (활용 - Git 연동)  (0) 2022.05.17
argocd (설치)  (0) 2022.05.13
GitOps and Flux  (0) 2022.05.07
Argo Event  (0) 2022.05.03
Comments