keycloak 은 콜솔에서 직접 계정 생성/조회/삭제 등여러가지 기능이 가능하지만, API 로도 이를 사용 할 수 있다.

 

[API 문서]

https://www.keycloak.org/docs-api/15.0/rest-api/index.html#_accesstoken

 

Keycloak Admin REST API

This is a REST API reference for the Keycloak Admin Version information URI scheme Host: localhost:8080 BasePath: /auth Schemes: HTTP

www.keycloak.org

이중 대표적인 API 몇가지만 사용해 보자


환경

Keycloak : jboss/keycloak

https://hub.docker.com/r/jboss/keycloak/

 

Docker

 

hub.docker.com


1.  jboss/keycloak docker 설치

[code]
sudo docker run -e KEYCLOAK_USER=<USERNAME> -e KEYCLOAK_PASSWORD=<PASSWORD> jboss/keycloak

[code sample]
sudo docker run -p 8080:8080 -d -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak

- 8080포트로 포트포워딩
- -d 옵션으로 백그라운드 실행
- -e 환경 변수로 IP/PW = admin/admin 설정

 

2. 설치 확인

sudo docker ps | grep keycloak

- 'CONTAINER ID' 를 메모해 두자

[결과값]

 

3.  Keycloak IP 확인

sudo docker exec -it dee207029f5f /bin/bash
> hostname -i

 

4. Container Network Test

curl {keycloak container IP}:8080
curl {localhost IP}:8080

[결과값]

 

5. Keycloak Web Browser 접속

http://[IP]:8080
ID/PW = admin/admin

 

 

6. admin-cli Client 설정 변경

  • Master - Clients - admin-cli  - Settings - Service Accounts Enabled 를 ON 으로 변경 후 저장
  • 저장하고나면 Service Account Roles 탭이 생기는데 이곳에서 권한 설정
  • Service Account Roles - Client Roles - 'master-realm' 에서 권한 추가
  • 필요한 권한만 추가하면 되나, 이 글에서는 모든 권한 추가
  • Master - Clients - admin-cli  - Settings - Access Type 을 confidential 로 변경 후 저장
  • Master - Clients - admin-cli  - Credentials - Secret 을 저장[토큰 발행시 사용]

 

7. 토큰발행 API

curl -k \
-d "client_id=admin-cli" \
-d "client_secret={client_secert}" \
-d "grant_type=client_credentials" \
-X POST "{IP}/auth/realms/master/protocol/openid-connect/token"

[결과값]

  • access_token, expires_in, refresh_expires_in, token_type 등 여러 값이 나오는데 이중 access_token 만 저장
  • expires 같은경우 master-token 에서 설정 변경 가능

8. 전체 유저 확인

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {TOKEN}" \
-X GET "{IP}/auth/admin/realms/master/users"

 

 

9. 특정 유저 확인

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {TOKEN}" \
-X GET "{IP}/auth/admin/realms/master/users?username={username}"

 

 

10. 유저 생성

curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {TOKEN}" \
-X POST "{IP}" \
-d "{"email":"test@keycloak.com", "enabled":"true", "username":"app-user", "credentials": [{"type":"password", "value":"1234", "temporary": false}]}"

 



 

이 외 여러 API 들은 keycloak API 에서 확인하여 사용하면 된다.

 

[참고자료]

  • keycloak Token 을 사용하여 특정인원 조회 하는 쉘 스크립트
  • jq -r 구문을 통해서 access_token 값을 val1 에 저장
  • $1 을 사용해서 특정 유저 조회 [쉘 실행시 'sh keycloak.sh username'] 
#!bin/bash

echo ''
val1=`curl -k \
-H "Content_Type: application/json" \
-d "client_id=admin-cli" \
-d "client_secret={secret key}" \
-d "grant_type=client_credentials" \
-X POST "{ip:port}/auth/realms/master/protocol/openid-connect/token" | jq -r '.access_token'`

echo '---------Token value-------'
echo ''
echo $val1
echo ''
echo '---------------------------'


echo ''
echo '---------Search All User-------'
echo ''
curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $val1" \
-X GET "{ip:port}/auth/admin/realms/master/users"
echo ''
echo ''
echo '-------------------------------'


echo ''
echo ''
echo '--------Search One User-------'
echo ''
curl -k \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $val1" \
-X GET "{ip:port}/auth/admin/realms/master/users?username=$1"

echo ''
echo ''
echo '-------------------------------'

 


환경 구성 정보 및 내용

 

Grafana Version : 9.3.1

bitnami Keycloak Version : 20.0.2

 


상세 설정 내용

 

 

 

1. Create Realm 버튼을 사용하여 Relam 생성

  • relam 명 : grafana2

keycloak main

 

2. 생성된 relam 안에 Create client 를 사용하여 client 생성

  • Client Id : grafana2
  • Client authentication : ON
  • Authorization : OFF
  • Authentication flow : Standard flow ON, Direct access grants ON, Implicit flow ON, 나머지 OFF

Client 생성 설정 1
Clitnt 생성 설정 2

 

3. Client 세부 설정

  • Root URL : <grafana URL>
  • Valid redirect URLs : <grafana URL>/login/generic_oauth

 

Clitnt 세부 설정 1

 

 

4. 위 내용들을 저장 하면 Credentials Tab 이 생기는데 아래 Client secret 을 메모장에 저장 

Credentials -> Client secret key 확인 후 저장

 

5. Role 생성

  • role name : admin / editor
  • 아래 그림의 admin 설정 적용 후 editor 도 같은 방식으로 생성

Roles 생성

 

admin role 생성

 

 

6. admin role 생성 후 아래와 같이 설정 적용

  • 우측 상단에 Action 콤보박스에서 Add associated roles 적용
  • admin 에는 admin role 적용
  • editor 에는 editor role 적용

Add associated roles

Client role 로 생성한 admin 을 추가

아래 사진과 같이 필터항목 탭을 Filter by clients 로 변경 후 생성한 role 선택하여 추가

Assign roles to admin account 설정 적용

 

 

 

7. User 생성 

  • id : user-admin / user-editor
  • user-admin 생성 후 user-editor 도 같은 방식으로 생성 및 적용
  • email 은 아무내용이나 입력
  • Required user actions 설정을 통해 2차인증 적용 가능 

user 생성
user-admin 설정

 

 

8. user-admin Credentials 생성

  • password 변경
  • Temporary(비밀번호 변경 옵션) OFF

Credentials 생성
설정 화면

 

9. 생성된 user-admin 에 Role Mapping

  • Assign role 클릭
  • Assign roles to user-admin account 에서 Filter by Clients 클릭 후 admin 권한 추가

Role mapping 화면
Role mapping

 

 

 

10. Client Scope 설정

  • Clients - Client scopes - grafana2-dedicated 클릭
  • scope 탭에서 full scope allowed OFF 

Client scopes 설정 화면
Full scope allowed OFF

 

11. Mappers 설정

  • Configure a new mapper 추가
  • Mapper Type : User Client Role
  • Client ID : grafana2
  • Token Claim Name : roles
  • Claim JSON Type : String
  • Add to ID token : ON 
  • Add to access token : ON
  • Add to userinfo : ON

Configure a new mapper 설정

 

세부 설정 내용

 

 

12. Token 값 확인

  • 입력한 client id / client secret key / grafana url / relams 명을 사용하여 아래 명령어 입력 후 token 확인
curl -s \
-d "client_id=<client id>" \
-d "client_secret=<secret key>" \
-d "username=<ID>" \
-d "password=<Password>" \
-d "grant_type=password" \
"<grafana URL>/realms/<relams 명>/protocol/openid-connect/token"

 

 

13. Token decode

  • 12번에서 curl 을 입력 함으로써 나온 JSON 형식의 token 을 https://jwt.io/ 에서 decode 해서 내용 확인
  • decode 한 내용중 roles : admin 값이 있는지 확인

decode 상세 내용중 일부

14. 지금 까지 한 내용들을 바탕으로 user-editor 생성 후 role 매핑 진행 -> 10번 11번은 공통 내용이믈 제외하고 진행

 

15. grafana.ini 설정 변경

  • 아래 내용을 참고하여 설정한 값으로 입력
  • grafana 설치관련된 내용은 이전 게시글 확인
kubectl edit -n monitoring cm/grafana
apiVersion: v1
data:
  grafana.ini: |
    [analytics]
    check_for_updates = true
    [grafana_net]
    url = https://grafana.net
    [log]
    mode = console
    [paths]
    data = /var/lib/grafana/
    logs = /var/log/grafana
    plugins = /var/lib/grafana/plugins
    provisioning = /etc/grafana/provisioning
    [server]
    domain = <grafana url>
    root_url = <grafana url>
    [auth.generic_oauth]
    enabled = true
    name = Keycloak-OAuth
    allow_sign_up = true
    client_id = <client id>
    client_secret = <secret key>
    scopes = profile openid
    auth_url = <grafana url>/realms/<realm name>/protocol/openid-connect/auth
    token_url = <grafana url>/realms/<realm name>/protocol/openid-connect/token
    api_url = <grafana url>/realms/<realm name>/protocol/openid-connect/userinfo
    role_attribute_path = contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'
    tls_skip_verify_insecure = true
    [auth]
    disable_login_form: false
    oauth_auto_login: false
    [security]
    allow_embedding: true
    cookie_secure: false
    cookie_samesite: lax

 

 

16. Configmap 수정후 pod 재배포를 위해 grafana pod 삭제

  • grafana 를 pod를 삭제할 경우 deploy 에 의해서 pod가 재배포됨
  • 재배포시 15번에서 수정한 Configmap 부분이 수정되어 배포가됨
kubectl delete -n monitoring po/<GRAFANA pod 명>

 

 

17. 접속 확인

  • Grafana 계정을 사용한 login이 아닌 keycloak login 사용
  • keycloak 에서 생성한 user id/pw 로 접속
  • 접속 후 생성한 role 권한이 적용 되었는지 확인

Grafana Main
Grafana 에서 keycloak 으로 login 화면 전환
user-admin 으로 접속 하였을 경우 권한
user-editor 로 접속 하였을 경우 권한

 

+ Recent posts