[Keycloak] Grafana Oauth 로그인
서론
일반적으로 사용자가 늘어난다면, 권한에 대한 작업은 사용하는 플랫폼의 곱으로 구성된다.
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이 사용된다고 보면 될 것이다.
각 Realm을 통해 관리자는 격리된 환경에서 역할(Role) 및 사용자(User)와 그룹(Group) 등을 만들어서 관리할 수 있다.
대시보드 좌측 상단의 Keycloak이라고 표기되어 있는 셀렉트 박스를 누르면, 새로운 Realm을 생성하기 위한 [Create realm]이라는 버튼이 있다.
버튼을 누르고 develop이라는 realm을 만들어준다.
생성을 한다면 메인화면으로 Redirect되고 좌측 상단에 develop라는 realm을 사용 중인 것을 볼 수 있다.
Client 생성
Client는 해당 Realm에서 사용할 애플리케이션이라고 볼 수 있다.
이번 글에서는 Grafana와 연동할 것이기 때문에, Grafana라는 Client를 생성할 것이다.
좌측에 있는 Clients를 누르면 위 화면이 나오고 [Create client] 버튼으로 Client를 생성할 수 있다.
Client type은 OIDC로 하고 나머지는 grafana로 채워준다.
-> 위 ID를 나중에 Grafana의 ini에 기입한다.
그 다음으로는 Client authentication을 활성화시켜주고 나머지 옵션은 필요에 따라 사용해 준다.
이번 예제에서는 필요로 하지 않기 때문에 활성화하지는 않았다.
마지막으로 위와 같이 URL까지 작성하고 [Save]를 한다면, client 생성이 완료된 것이다.
저장을 한다면 아래와 같은 화면이 나올 것이다.
여기서 상단의 [Credentials]에 들어가서 Client Secret을 확인 후 개인 파일에 기록해 둔다.
바로 옆에 있는 눈모양의 아이콘을 누른다면 텍스트 형식으로 볼 수 있고 그 옆의 Docs모양의 아이콘을 누른다면 클립보드에 복사가 된다.
-> Credentials의 Secret은 추후 Grafana에 기입하여 사용하는데, Keycloak에 등록된 Client라는 것을 증명하는 비밀 키를 의미
Role 생성
grafana라는 client를 만들었으니, 해당 client에서 사용될 Role을 생성해 줄 것이다.
위 [Credentials]의 옆에 [Roles]라는 항목이 있고, 여기서 grafana에서 사용될 Role을 만들 수 있다.
[Create role]으로 Role을 생성할 수 있다.
admin이라는 이름의 role과 editor라는 이름의 role을 만든다.
※ 여기서 생성한 Role은 Keycloak에서 생성한 User에 부여할 것이고, Grafana의 Role과 연동할 예정이다.
Client scopes - Mapper 설정
Role 생성이 완료됐다면 상단의 Client scopes로 이동한다.
여기서 [grafana-dedicated]라는 scope를 누르게 된다면, 아래와 같이 Mapper를 설정할 수 있는 화면이 나온다.
여기서 [Configure a new mapper]를 이용하여 새로운 Mapper를 등록한다.
위 목록에서 [User Client Role]을 선택하고, 아래와 같이 이름을 기입 후 Client ID를 선택하여 Mapper를 생성해 준다.
여기까지 했다면, 기본적인 Client 설정은 다 마친 것이다.
다음은 User를 생성하고, Client의 Role을 배정할 것이다.
User 생성 및 Role 부여
좌측 목록의 Users를 선택한다면 유저를 생성할 수 있는 화면이 나온다.
여기서 [Create new user]로 다음과 같이 유저 생성이 가능하다.
Required user actions는 다양하게 있지만, 초기 비밀번호 변경과 같은 옵션만 추가해 주었고, 나머지는 대충 작성했다.
사용자가 생성이 됐다면 상단의 Credentials로 넘어가서, [Set password]를 이용하여 초기 비밀번호를 입력해 준다.
※ Temporary는 초기 1회성 비밀번호 세팅이기에 필요에 따라 설정하면 될 것이다.
유저 생성을 완료했다면, 위 사용자는 newadmin이라고 생성한 이름처럼, grafana의 admin의 role을 배정할 것이다.
[Role mapping]으로 가서 [Assign role]을 클릭 후, 아래와 같이 client(grafana)로 검색을 하면, 아래처럼 두 개의 role이 나오는데 admin이라는 role을 선택하여 배정해 준다.
같은 방식으로 newdev라는 사용자까지 생성하고, 이 사용자는 editor라는 role을 mapping 해준다.
Users에서 생성된 유저를 확인할 수 있고, 여기까지 기본적인 Keycloak은 세팅이 다 끝이 난 것이다.
이제 Grafana 부분만 수정하여 적용하면 된다.
Grafana ini 설정
※ 필자는 kube-prometheus-stack이라는 Helm Chart를 통하여 grafana를 설치하였기에 아래 내용은 해당 values.yaml을 기반으로 작성됨
helm 차트의 values.yaml을 본다면, grafana로 시작하는 부분을 찾을 수 있다.
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 되어 생성된 것을 볼 수 있다.