Devops/Keycloak

[Keycloak] Grafana Oauth 로그인

dev_ss 2025. 2. 10. 10:05

 

 

 


서론

 

일반적으로 사용자가 늘어난다면, 권한에 대한 작업은 사용하는 플랫폼의 곱으로 구성된다.

ex) 사용자가 1명 늘어나면, 사용될 플랫폼의 개수만큼의 추가적인 작업이 필요하다는 의미

 

 

사용자 수가 많아진다면, 사용자의 생성/삭제와 권한 부여/수정과 같은 작업을 하는 시간 및 노력도 많이 들고, 산재된 사용자의 정보로 인하여 관리하는 부분에서 더 애를 먹게 되는 것은 필연적이다.

 

 

위와 같은 이유로, 사내 오픈소스 툴들의 사용자를 Keycloak을 활용하여 집약적으로 관리하는 방향으로 개선하게 되었다.

 


 

 

이전에는 Keycloak에 대한 개념과 간단한 설치 과정(k8s 환경)을 알아보았다.

 

https://ssnotebook.tistory.com/entry/Keycloak%EC%9D%B4%EB%9E%80

 

[Keycloak] Keycloak이란

Keycloak Keycloak은 RedHat에서 개발한 오픈소스 IAM(Identity and Access Management) 솔루션이다.   현대 애플리케이션에서 필수적인 사용자 인증과 접근 제어를 손쉽게 구현할 수 있게 해주는 도구이며, SSO

ssnotebook.tistory.com

 

이번 글에서는 Keycloak의 유저를 기반으로 Grafana에서 Oauth 로그인을 하는 과정을 알아볼 것이다.

 

keycloak version: quay.io/keycloak/keycloak:25.0.4

 

 


 

Realm 생성

하나의 Realm은 Multi-Tenancy 환경에서의 하나의 Tenant로 빗대어 볼 수 있다.

 

 

아래의 사진은 Multi-Tenancy를 설명해 놓은 사진이고, 이와 같은 구조로 Realm이 사용된다고 보면 될 것이다. 

 

[출처: https://kubernetes.io/ko/docs/concepts/security/multi-tenancy/ ]

 

 

 

각 Realm을 통해 관리자는 격리된 환경에서 역할(Role) 및 사용자(User)와 그룹(Group) 등을 만들어서 관리할 수 있다.

 

 

[Create realm]

 

 

대시보드 좌측 상단의 Keycloak이라고 표기되어 있는 셀렉트 박스를 누르면, 새로운 Realm을 생성하기 위한 [Create realm]이라는 버튼이 있다.

 

 

 

 

[Realm 생성]

 

 

버튼을 누르고 develop이라는 realm을 만들어준다.

 

 

생성을 한다면 메인화면으로 Redirect되고 좌측 상단에 develop라는 realm을 사용 중인 것을 볼 수 있다.

 

 


Client 생성

 

Client는 해당 Realm에서 사용할 애플리케이션이라고 볼 수 있다.

 

 

이번 글에서는 Grafana와 연동할 것이기 때문에, Grafana라는 Client를 생성할 것이다.

 

[Create client]

 

 

좌측에 있는 Clients를 누르면 위 화면이 나오고 [Create client] 버튼으로 Client를 생성할 수 있다.

 

[Client 생성 - General settings]

 

 

Client type은 OIDC로 하고 나머지는 grafana로 채워준다.

 -> 위 ID를 나중에 Grafana의 ini에 기입한다.

 

 

 

 

[Client 생성 - Capability config]

 

그 다음으로는 Client authentication을 활성화시켜주고 나머지 옵션은 필요에 따라 사용해 준다.

 

이번 예제에서는 필요로 하지 않기 때문에 활성화하지는 않았다.

 

[Client 생성 - Login settings]

 

 

마지막으로 위와 같이 URL까지 작성하고 [Save]를 한다면, client 생성이 완료된 것이다.

 

 

 

저장을 한다면 아래와 같은 화면이 나올 것이다.

 

 

[생성된 Client 확인]

 

 

여기서 상단의 [Credentials]에 들어가서 Client Secret을 확인 후 개인 파일에 기록해 둔다.

 

 

 

[Client Secret 확인]

 

 

바로 옆에 있는 눈모양의 아이콘을 누른다면 텍스트 형식으로 볼 수 있고 그 옆의 Docs모양의 아이콘을 누른다면 클립보드에 복사가 된다. 

 

-> Credentials의 Secret은 추후 Grafana에 기입하여 사용하는데, Keycloak에 등록된 Client라는 것을 증명하는 비밀 키를 의미

 

 

 


 

Role 생성

 

grafana라는 client를 만들었으니, 해당 client에서 사용될 Role을 생성해 줄 것이다.

 

위 [Credentials]의 옆에 [Roles]라는 항목이 있고, 여기서 grafana에서 사용될 Role을 만들 수 있다.

 

[Create role]

 

 

[Create role]으로 Role을 생성할 수 있다.

 


 

 

[Role 생성]

 

 

 admin이라는 이름의 role과 editor라는 이름의 role을 만든다.

 

 


 

 

[Role 생성 결과 확인]

 

 

※ 여기서 생성한 Role은 Keycloak에서 생성한 User에 부여할 것이고, Grafana의 Role과 연동할 예정이다.

 


Client scopes - Mapper 설정

 

Role 생성이 완료됐다면 상단의 Client scopes로 이동한다.

 

[Client scopes 목록]

 

 

여기서 [grafana-dedicated]라는 scope를 누르게 된다면, 아래와 같이 Mapper를 설정할 수 있는 화면이 나온다.

 

[grafana-dedicated 상세]

 

 

여기서 [Configure a new mapper]를 이용하여 새로운 Mapper를 등록한다.

 

 

[Mapper 목록]

 

 

위 목록에서 [User Client Role]을 선택하고, 아래와 같이 이름을 기입 후 Client ID를 선택하여 Mapper를 생성해 준다.

 

 

[Mapper 기입]

 

 

여기까지 했다면, 기본적인 Client 설정은 다 마친 것이다.

 

다음은 User를 생성하고, Client의 Role을 배정할 것이다.

 


User 생성 및 Role 부여

 

[User 생성]

 

좌측 목록의 Users를 선택한다면 유저를 생성할 수 있는 화면이 나온다.

 

 

여기서 [Create new user]로 다음과 같이 유저 생성이 가능하다.

 

[User 생성 상세]

 

 

Required user actions는 다양하게 있지만, 초기 비밀번호 변경과 같은 옵션만 추가해 주었고, 나머지는 대충 작성했다.

 

 

 

사용자가 생성이 됐다면 상단의 Credentials로 넘어가서, [Set password]를 이용하여 초기 비밀번호를 입력해 준다.

 

[Set Password]

 

※ Temporary는 초기 1회성 비밀번호 세팅이기에 필요에 따라 설정하면 될 것이다.

 


 

유저 생성을 완료했다면, 위 사용자는 newadmin이라고 생성한 이름처럼, grafana의 admin의 role을 배정할 것이다. 

 

[Role mapping]

 

 

[Role mapping]으로 가서  [Assign role]을 클릭 후, 아래와 같이 client(grafana)로 검색을 하면, 아래처럼 두 개의 role이 나오는데 admin이라는 role을 선택하여 배정해 준다.

[Role 배정]

 

 

 

 

같은 방식으로 newdev라는 사용자까지 생성하고, 이 사용자는 editor라는 role을 mapping 해준다.

 

 

Users에서 생성된 유저를 확인할 수 있고, 여기까지 기본적인 Keycloak은 세팅이 다 끝이 난 것이다.

 

 

이제 Grafana 부분만 수정하여 적용하면 된다.

 


Grafana ini 설정

 

※ 필자는 kube-prometheus-stack이라는 Helm Chart를 통하여 grafana를 설치하였기에 아래 내용은 해당 values.yaml을 기반으로 작성됨

 

helm 차트의 values.yaml을 본다면, grafana로 시작하는 부분을 찾을 수 있다.

 

[기본 values.yaml]

 

 

kube-prometheus-stack의 헬름 차트에서 values.yaml 옵션에는 grafana.ini에 대한 내용이 기입되어 있지 않으나,

 

 

헬름 차트 내부 templates의 grafana의 values.yaml에는 ini 부분을 Override 해서 사용할 수 있도록 제작되었기 때문에, 다음과 같이 내용을 수정한다면, 적용이 가능하다.

 

 

# values.yaml
# grafana 부분

grafana:
  enabled: true

  namespaceOverride: ""

  grafana.ini:
    server:
      domain: "<grafana HOST>"
      #Ingress 사용 시
      #root_url: "%(protocol)s://%(domain)s/prefix"
      #serve_from_sub_path: true
    auth.generic_oauth:
      enabled: true
      name: Keycloak-OAuth
      allow_sign_up: true
      client_id: grafana
      client_secret: <Client Secret>
      scopes: profile openid
      auth_url: http://<Keycloak URI>/realms/develop/protocol/openid-connect/auth
      token_url: http://<Keycloak URI>/realms/develop/protocol/openid-connect/token
      api_url: http://<Keycloak URI>/realms/develop/protocol/openid-connect/userinfo
      role_attribute_path: contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'
      tls_skip_verify_insecure: true

 

위처럼 values.yaml을 수정하고 helm upgrade로 재배포를 해준다면, grafana에서 아래와 같이 Keycloak의 로그인 버튼을 볼 수 있다.

 

 

 

 

 

누르게 된다면, Keycloak의 [develop]라는 Realm의 로그인화면으로 Redirect 되고, 여기서 아까 만들었던 newadmin계정으로 로그인을 할 수 있다.

 

 

 

 

그러면 성공적으로 로그인이 된 것을 볼 수 있다.

 

 

 

로그인 이후 Home 옆의 좌측 메뉴 버튼을 누른다면, 아래와 같은 메뉴가 나온다.

(Administration과 같은 메뉴는 admin권한이 있어야 나온다.)

 

 

 

 

여기서 Administration -> Users로 들어가 보면, 아래와 같이 계정이 생성된 것을 확인할 수 있고 Role 또한 Mapping 되어 생성된 것을 볼 수 있다.

 

 

 

 


 

 

반응형