Naver Cloud

[Naver Cloud Platform] 네이버 클라우드 플랫폼에서 우분투 Keycloak + grafana 설치 SSO 연동하기

gam-sung 2023. 7. 21. 14:14

eycloak과 Grafana는 각각 사용자 인증 및 인가를 처리하는 오픈 소스 소프트웨어입니다.

Keycloak은 싱글 사인온(SSO), 사용자 관리 및 보안 토큰 기반 인증을 제공하며, Grafana는 데이터 시각화 및 대시보드 생성을 위한 도구입니다.

두 플랫폼을 연동하여 사용자가 Grafana 대시보드에 접근하고 인증을 받을 수 있도록 하는 것이 가능합니다.

 

Keycloak과 Grafana를 연동하면 사용자는 Keycloak에 등록된 계정으로 Grafana에 로그인할 수 있게 되며, 보안 및 싱글 사인온 기능을 활용할 수 있습니다.

 

저는 NCP(Naver Cloud Platform)에서 Ubuntu OS 기반의 가상 서버를 생성하여 위 작업을 진행하였습니다.

따라서 SSO 연동을 위한 일련의 과정들은 가상 서버에 오픈 소프트웨어를 설치 및 설정하는 작업이기 때문에 별도의 가상머신을 준비했다는 가정하에 실습 내용을 정리하였습니다. 

 

1단계: 시스템 업데이트

$ sudo apt update

 

2단계: Java 설치

링크 : https://www.oracle.com/java/technologies/downloads/

    •  우분투에서 java 설치를 진행했고, x64 Debian Package 다운로드 진행함.
    • Rpm 파일을 다운 받았기 때문에 rpm으로 설치를 진행하려고 했지만 안됐음. 알아 보니 우분투에서는 rpm 파일을 곧바로 설치할 없다고 . rpm 툴을 설치하여도 에러가 발생함

       rpm: RPM should not be used directly install RPM packages, use Alien instead!
       rpm: However assuming you know what you are doing...
    • Alien 툴을 이용해야 . alien 툴은 이름 그대로 rpm 파일을 deb 변환하거나 곧바로 설치할 있도록 도와주는 .  
      • Alien 설치
        # apt -y install alien
      • Alien 옵션
        (1) rpm 파일을 변환하여 설치
        # alien -c [변환할파일].rpm
        # ll
        [
        변환파일].deb
         
        (2) dpkg -I [변환파일].deb

 

3단계: keycloak 다운 관리자 계정 생성

최신 버전(20.0.2)도 있지만 버전마다 UI가 다르기 때문에 구글에서 자료가 많은 이전 버전(18.0.0)으로 다운 받음.

링크 : https://www.keycloak.org/downloads

 

  • 버전 18.0.0 으로 다운이 완료되면 파일의 압축을 풉니다.

  • 압축 해제한 디렉터리로 이동합니다.

  • Keycloak를 시작하기 전에 초기 관리자 계정을 생성해야 합니다.

  • keycloak을 실행 합니다.

  • 이제 웹 브라우저를 열고 URL http://my-server-ip:8080 을 사용하여 keycloak 웹 인터페이스에 액세스합니다.
  • 아래 페이지가 나오면 Administration Console 탭을 클릭해줍니다.

  • 초기에 생성한 관리자 계정과 패스워드를 입력합니다.

  • 로그인 성공하면 아래처럼 keycloak 대시보드가 표시되어야 합니다.

 

 

JWT 토큰 발행 테스트

사용자가 로그인에 성공하면 서버는 JWT 발급하고, 사용자는 토큰을 이후의 API 요청에서 Authorization 헤더에 담아 서버에 보냅니다.

서버는 해당 JWT 검증하고 필요한 정보를 추출하여 해당 사용자의 인증과 권한을 확인합니다.

이렇게 함으로써 세션 상태를 서버에 저장하지 않아도 되며, 토큰 자체가 필요한 정보를 가지고 있어 인증과정이 단순해집니다.

 

 

realm, Client 생성

  1. Realm 생성
    realm
    이란 Keycloak에서 인증, 권한의 부여가 적용되는 범위를 나타내는 단위입니다. realm에서 여러개의 client를 설정할수 있고 realm 내부에 설정된 client들은 SSO를 사용할수 있게 됩니다.
  • Master realm : eycloak 설치시 생성되는 관리자용 realm입니다. Master realm에는 client를 설정하지 않고 하위에 realm들을 생성하고 관리하는 용도로 사용합니다.
  • Other realm : Master realm에서 생성한 realm입니다. realm에는 client를 설정할수 있는데 SSO를 사용할 애플리케이션이라고 볼수 있습니다.

출처 : https://freestrokes.tistory.com/153

 

  • 화면왼쪽탭 Master realm에 커서를 위치하면 Add realm이 보이는데 저는 MyRealm 이라는 이름으로 realm 을 생성했습니다.

2. Client 생성
왼쪽탭
Client에서 Create 버튼을 눌러 새로운 client를 생성합니다. client 이따가 설치할 Grafana에서 인증하기 위한 용도 입니다.

  • Client ID : jwttoken
  • Client Protocol : openid-connect

 

Client 설정

 

1. Setting
Client 생성하면 바로 설정화면으로 넘어가는데 Setting 탭의 옵션을 다음과 같이 수정하고 저장합니다.

  • Access Type : confidentials

  • Root URL : Grafana UI 주소인데,여기에서는  ${authBaseUrl} 설정
    "${authBaseUrl}"은 인증 서비스 또는 API에 대한 기본 URL 값을 보유하는 변수임을 나타냅니다.
  • Valid Redirect Urls : <Grafana URL>/login/generic_oauth
    저는 http://서버공인ip:8080/login/generic_oauth .
  • Base URL : /login/generic_oauth
  • Admin URL, Web Origins 삭제

 

 

  • Advanced Setting 에서 Access Token Lifespan 값을 10으로 입력

  • Authentication Flow Overrides  에서 browser / direct grant 로 설정

2. Credentials
저장하고 나면 상단에 Credentials 탭이 새로 생깁니다. 해당 탭에서 Secret 생성되는데 나중에 Grafana 설정에서 사용해야 하는 값입니다.

 

3. Roles

Roles  탭에서 Add Role 클릭하여 다음과 같이 생성합니다.  저는 Role Name admin으로 생성했습니다. 여기서 Role Name Grafana에서 사용할 권한 레벨 입니다. Grafana에는 admin, editor, viewer 레벨이 있는데 admin 으로 생성합니다.

 

4. Scope

Scope  탭의 Full Scope Allowed 옵션을 OFF 설정합니다.

 

 

5. Mapper

  1. Mapper 탭에서 Create mapper 생성한 아래와 같이 설정 저장합니다. 
  • Name: Roles
  • Mapper Type: User Client Role
  • Client ID: jwttoken
  • Token Claim Name: roles
  • Claim JSON type: string

 

[tip] keycloak 의 "http" 포트에 엑세스하려고 할 때마다 "HTTPS REQUIRED" 표시 안 뜨게 하는 방법

 

(1) 마스터 realm 에서 조치할 때는 터미널 명령어로 가능

 

# keycloak 폴더로 이동하여 export 명령어로 keycloak 어드민 계정과 비밀번호 저장

# Keycloak bin 폴더로 이동

 

(2) 생성한 realm 에서 해결하는 방법
      Realm Settings > Login > Require SSL : none

 

 

 

User 생성

이제 Client 생성한 jwttoken 사용할 user 생성합니다. 아래에 user 생성한 내용입니다.

1. Credentials

생성된 User 에서 Credentials 탭에서 패스워드를 설정하는데 Temporary 옵션은 OFF 설정한 사용할 password 입력한 다음 Reset Rassword 클릭하면 설정된 패스워드 값이 저장됩니다.

 

2. Role Mappings

Client 에서 Role 설정했던 방법과 같이 Role 설정을 해야 합니다.

 

JWT 토큰발행 테스트

터미널에서 아래의 명령어로 토큰을 발행해볼 있다. client-secret에는 client 설정의 Credentials 탭에서 확인할 수 있습니다.

 

 

Grafana 설치 설정

다운로드 링크 : https://grafana.com/grafana/download/9.2.10

 

Download Grafana | Grafana Labs

Overview of how to download and install different versions of Grafana on different operating systems.

grafana.com

 

  • 설치 후 서비스 운영 상태 확인

 

  • 생성된 conf directory 에서 grafana.ini 다음과 같이 수정합니다.

 

  • Grafana.ini 설정 저장 후 keycloak 설정 중에서 Valid Redirect URIs 에 grafana URL을 추가 안했으면 추가해 줍니다.

 

 

로그인

이제 OAuth 이용한 Grafana 로그인 준비가 완료되었습니다.

실제 로그인을 수행합니다.

위에 과정을 수행했다면 grafana 서비스를 리스타트하면 Log in 버튼 아래에 SSO 버튼이 활성화 됩니다.

SSO 버튼 클릭하면 MyRealm 로그인 페이지로 이동합니다. 

Realm 과 연결된 User와 Password를 입력한 후 sign in 하면 접속됩니다. 

 

그라파나 UI 페이지를 확인할 수 있습니다.