본문 바로가기
Devops/Keycloak

[Keycloak] Grafana Oauth 로그인

by dev_ss 2025. 2. 10.

 

 

 


서론

 

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

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 되어 생성된 것을 볼 수 있다.

 

 

 

 


 

 

반응형

'Devops > Keycloak' 카테고리의 다른 글

[Keycloak] Keycloak이란  (0) 2024.11.21