티스토리 뷰

DevOps/System&Tools

Grafana with okta

Jacob_baek 2021. 10. 19. 22:29

Grafana를 okta와 연동하는 방법에 대하여 알아보도록 하자.
진행했던 방식은 OIDC 연동방식이다.

순서

  1. okta app 생성
  2. okta 사용자 추가
  3. grafana 연동 설정
  4. grafana rbac 설정

1. okta 설정

별도의 app 생성에 대한 설명은 추가하지 않았다. 이유는 아래 설정정보만 참고할수 있어도 설정에 크게 문제가 되지 않았다.

주의할것은 url 설정이며 Grafana에서 okta 연동시 사용되는 url은 /login/okta를 포함한 주소이다.

2. okta 사용자 추가

실제 okta 화면에 app이 표출이 될 사용자를 추가하자.
(여기서 추가한 사용자만이 okta 화면상에서 app 표출이 이루어진다.)

3. Grafana 설정

Grafana는 Grafana.ini에 필요 설정만 잘 추가하면 된다.
아래는 기본적인 okta 연동을 위한 설정만 존재한다.
(주석으로 설명된 항목만 잘 참고하여 설정한다면 문제는 없을것이다.)

[analytics]
check_for_updates = true
[grafana_net]
url = https://grafana.jacobbaek.com
[log]
mode = console
level = debug                                  ###### okta userinfo 응답정보 확인을 위해 사용
[server]
root_url = https://grafana.jacobbaek.com       ###### 해당 url을 설정하지 않을 경우 localhost로 요청될수 있다.
[paths]
data = /var/lib/grafana/data
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = /etc/grafana/provisioning
[auth.okta]
name = Okta
enabled = true
allow_sign_up = true                           ###### false로 할 경우 인증실패가 발생된다.
client_id = xxxxxxxxxxxxxxxxx
client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
scopes = openid profile email groups
auth_url = https://jacobbaek.okta.com/oauth2/v1/authorize
token_url = https://jacobbaek.okta.com/oauth2/v1/token
api_url = https://jacobbaek.okta.com/oauth2/v1/userinfo
allowed_domains =
allowed_groups =
role_attribute_path = contains(email, 'testuser1@jacobbaek.com') && 'Admin' || contains(email, 'testuser2@jacobbaek.com') && 'Admin' || contains(email, 'testuser3@jacobbaek.com') && 'Editor' || contains(email, 'testuser4@jacobbaek.com') && 'Editor' || 'Viewer'

4. Grafana RBAC 설정

debug level을 debug로 설정후 grafana log를 확인해보면 userinfo에 대한 json 형태의 response 를 확인할 수 있다.
해당 결과를 기반으로 role_attribute_path를 설정하면 사용자별/그룹별 role 부여가 가능하다.

사실 좀 생소한 jmespath 라는게 나와 처음엔 작성에 애를 먹었지만 response 기반에 응답을 filter 해주는 방식이기에 작성에 크게 어려움이 따르지는 않을것으로 생각된다.

참고로 okta로 부터 온 response는 다음 항목과 동일하게 출력되었다.

또한 별도의 그룹 지정이 안되어있는 상황이었기에 다음과 같이 사용자별로만 역할 할당을 진행하였다.

role_attribute_path = contains(email, 'testuser1@jacobbaek.com') && 'Admin' || contains(email, 'testuser2@jacobbaek.com') && 'Admin' || contains(email, 'testuser3@jacobbaek.com') && 'Editor' || contains(email, 'testuser4@jacobbaek.com') && 'Editor' || 'Viewer'

만약 group을 통한 filter를 적용하고자 할 경우 okta 메뉴중에 Application의 Sign On 메뉴에서 Group claim filter를 추가해주어야 한다. regex로 다수의 그룹을 포함할수도 있다.

 

댓글
댓글쓰기 폼