Kubernetes

쿠버네티스에서 Keycloak + grafana 설치 SSO 연동하기

맨날화남 2023. 9. 5. 15:48

1. Keycloak + grafana 설치 SSO 연동하기

 

우분투에서 Keycloak + grafana 설치 SSO 연동하기 : https://kclouder.tistory.com/2

 

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

eycloak과 Grafana는 각각 사용자 인증 및 인가를 처리하는 오픈 소스 소프트웨어입니다. Keycloak은 싱글 사인온(SSO), 사용자 관리 및 보안 토큰 기반 인증을 제공하며, Grafana는 데이터 시각화 및 대시

kclouder.tistory.com

 

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

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

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

 

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

 

우분투에서 진행했던 Keycloak + grafana 설치 SSO 연동하기를 쿠버네티스 환경에서 해보도록 하겠습니다.

저는 쿠버네티스 환경으로 Control Plane 1대, Worker Node 1대를 준비했습니다.

 

 

 

2. Keycloak

grafana pod를 생성할때 keycloak의 정보를 넣어야 하므로 우선 keycloak pod를 생성하겠습니다.

 

2-1. Keycloak 생성

1. keycloak.yaml 파일을 생성하고 아래 내용을 넣습니다.

  • 내부 포트는 keycloak의 기본 포트인 8080
  • 외부 노출을 위해 NodePort 타입 Service로 31500번 포트를 할당했습니다.
  • keycloak의 기본 ID와 PW는 둘 다 admin으로 설정했습니다.
apiVersion: v1
kind: Service
metadata:
  name: keycloak
  labels:
    app: keycloak
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      nodePort: 31500
  selector:
    app: keycloak
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak
  labels:
    app: keycloak
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: quay.io/keycloak/keycloak:latest
          args: ["start-dev"]
          env:
            - name: KEYCLOAK_ADMIN
              value: "admin"
            - name: KEYCLOAK_ADMIN_PASSWORD
              value: "admin"
            - name: KC_PROXY
              value: "edge"
          ports:
            - name: http
              containerPort: 8080
          readinessProbe:
            httpGet:
              path: /realms/master
              port: 8080

 

2. keycloak.yaml 파일로 keycloak의 Service. Deployment 생성합니다.

kubectl create -f keycloak.yaml

 

3. Pod와 Service가 제대로 생성되었는지 확인합니다.

kubectl get pod
kubectl get service

 

2-2. Keycloak 설정

1. 이제 Node의 공인IP:31500 로 접속해서 keycloak 화면이 뜨는지 확인합니다.

 

2. Administration Console을 클릭합니다.

 

3. keycloak.yaml에서 적었던 기본 ID와 PW로( admin / admin ) 로그인 합니다. 

 

4. 왼쪽 상단 master를 클릭하면 나타나는 메뉴에서 Create Realm을 클릭합니다.

 

5. Realm명(Grafana)을 입력하고 Create를 클릭합니다.

  • Grafana 연동시 Reale명을 적게 되는데 대소문자를 구분하므로 주의하시기 바랍니다.

 

6. Grafana Realm이 선택된 것을 확인 후 Clients로 들어가 Create Client를 클릭합니다.

 

7. Client ID에 grafana을 입력하고 Next를 클릭합니다.

 

8. Client authentication을 On으로 변경, OAuth 2.0 Device Authorization Grant 체크 후 Next를 클릭합니다.

 

9. Root URL과 Valid redirect URIs 입력 후 Next를 클릭합니다.

  • Valid redirect URIs에는 grafana의 주소를 넣습니다.
  • 하나의 Node에서 실행 할 예정이니 Node의 공인IP와 grafana가 사용할 NodePort의 번호를 넣습니다.
Root URL : ${authBaseUrl}

http://223.130.137.204:32000/login/generic_oauth

 

10. garafana Client가 만들어지면 Roles -> Create role를 클릭합니다. 

 

11. Role name에 admin을 입력하고 Save를 클릭합니다.

 

12. admin Role이 생성되었다면 오른쪽 상단의 Action을 클릭하면 나오는 메뉴에서 Add associated roles를 클릭합니다.

 

13. 새로 열린 팝업창에서 Filter by realm roles를 클릭하면 나오는 Filter by clients를 클릭합니다.

 

14. 새로 생성된 목록에서 grafana.com의 admin을 체크 후 Assign을 클릭합니다.

 

15. 조금 기다리면 Composite가 False에서 True로 변합니다.

 

16. Client details로 돌아가 Credentials를 클릭하면 나오는 항목 중 Client Sercet의 눈 아이콘을 클릭하면 좌측에 ***로 나와있던 키를  확인할 수 있습니다.  grafana 설정에 필요하므로 해당 키를 복사해둡니다.

 

17. Client scopes -> garafana-dedicated를 클릭합니다.

 

18. Configure a new mapper를 클릭합니다.

 

19. 생성된 팝업창에서 스크롤을 내리다보면 나오는 User Client Role를 클릭합니다.

 

20. name : Roles 입력, Client ID : grafana 선택, Token Claim Name : roles 입력 후 Save하고 Dedicated scopes를 클릭하여 전 화면으로 돌아갑니다.

 

21. User Client Role가 생성된 것을 확인하고 Scope를 클릭합니다.

 

22. Full scope allowed가 on 상태인데 아래와 같이 off로 변경 후 왼쪽 메뉴의 Users를 클릭합니다.

 

23. Add user을 클릭합니다.

 

24. Required user actions는 Update Password를 선택, 나머지 항복들은 임의대로 넣어주고 Create를 클릭합니다.

 

25. User가 생성된 것을 확인하고 Credentials -> Set password를 클릭합니다.

 

26. 해당 User의 Password를 설정하고 Temporary를 off 후 Save를 클릭하면 창이 하나 뜨는데 Save password를 클릭합니다.

 

27. Role mapping -> Assign role를 클릭합니다.

 

28. Filter by realm roles를 클릭하면 나오는 메뉴에서 Filter by Clients를 클릭합니다.

 

29. grafana.com admin을 체크 후 Assign을 클릭하면 keycloak에서의 설정은 끝입니다.

 

 

 

3. Grafana

Keycloak 설정은 끝났으니 이제 Grafana Pod를 생성하겠습니다.

 

3-1. Grafana 생성

1. grafana.yaml 파일을 생성하고 아래 내용을 넣습니다.

  • grafana의 기본 포트는 3000번 입니다만 port와 target port를 그대로 3000을 쓰고 nodeport만 32000을 썼을 시 keycloak에서 Grafana로 요청을 보낼 때 32000번 포트를 지정해도 3000번 포트로 보내는 문제가 있어 전부 32000번으로 통일했습니다.
  • grafana 컨테이너의 환경변수를 설정해줍니다.
    • GF_SERVER_DOMAIN : grafana pod가 실행될 node의 공인IP
    • GF_SERVER_HTTP_PORT : 포트를 32000으로 지정
    • GF_AUTH_GENERIC_OAUTH_CLIENT_ID : keycloak에서 생성한 Client ID
    • GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET : keycloak에서 복사 해뒀던 Secret Key
    • GF_AUTH_GENERIC_OAUTH_AUTH_URL
      • http://<keycloak 공인IP>:<keycloak NodePort>/realms/<Keycloak에서 생성한 realm명>/protocol/openid-connect/auth
    • GF_AUTH_GENERIC_OAUTH_TOKEN_URL : 
      • http://<keycloak 공인IP>:<keycloak NodePort>/realms/<Keycloak에서 생성한 realm명>/protocol/openid-connect/token
    • GF_AUTH_GENERIC_OAUTH_API_URL :  
      • http://<keycloak 공인IP>:<keycloak NodePort>/realms/<Keycloak에서 생성한 realm명>/protocol/openid-connect/userinfo
    • GF_role_attribute_path : Grafana가 받은 애플리케이션의 계정 역할에 따라 권한을 부여 합니다.
apiVersion: v1
kind: Service
metadata:
  name: grafana
  labels:
    app: grafana
spec:
  ports:
    - name: http
      port: 32000
      targetPort: 32000
      nodePort: 32000
  selector:
    app: grafana
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  labels:
    app: grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
        - name: grafana
          image: grafana/grafana:latest
          env:
            - name: GF_SERVER_DOMAIN
              value: 223.130.137.204
            - name: GF_SERVER_HTTP_PORT
              value: "32000"
            - name: GF_AUTH_GENERIC_OAUTH_ENABLED
              value: "true"
            - name: GF_AUTH_GENERIC_OAUTH_NAME
              value: "Keycloak"
            - name: GF_AUTH_GENERIC_OAUTH_ALLOW_SIGN_UP
              value: "true"
            - name: GF_AUTH_GENERIC_OAUTH_CLIENT_ID
              value: "grafana"
            - name: GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET
              value: "pWqHqYliR6vBFsrdIP9NoAkFVF45FPfO"
            - name: GF_AUTH_GENERIC_OAUTH_SCOPES
              value: "openid email profile offline_access roles"
            - name: GF_AUTH_GENERIC_OAUTH_AUTH_URL
              value: "http://223.130.137.204:31500/realms/Grafana/protocol/openid-connect/auth"
            - name: GF_AUTH_GENERIC_OAUTH_TOKEN_URL
              value: "http://223.130.137.204:31500/realms/Grafana/protocol/openid-connect/token"
            - name: GF_AUTH_GENERIC_OAUTH_API_URL
              value: "http://223.130.137.204:31500/realms/Grafana/protocol/openid-connect/userinfo"
            - name: GF_role_attribute_path
              value: "contains(roles[*], 'grafanaadmin') && 'GrafanaAdmin' || contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'"

 

2. grafana.yaml 파일로 grafana의 Service. Deployment 생성합니다.

kubectl create -f grafana.yaml

 

3. Pod와 Service가 제대로 생성되었는지 확인합니다.

kubectl get pod
kubectl get service

 

3-2. Grafana 연동 확인

1. 이제 Node의 공인IP:32000 로 접속해서 grafana 화면에 Keycloak Login 버튼이 뜨는지 확인하고 클릭합니다.

 

2. Keycloak Login 화면이 뜹니다. Keycloak에서 생성했던 User ID와 PW를 입력하고 Sign을 클릭합니다.

 

3. 우측 상단의 아이콘을 클릭하면 Keycloak에서 만든 ID로 Login 된 것을 확인합니다.

 

4. 왼쪽 상단의 메뉴 -> Administration -> Users로 들어갑니다.

 

5. User 목록에 Keycloak에서 생성한 User가 보입니다. 클릭합니다.

 

6. Keycloak User에게 Admin 권한도 제대로 부여되어있는걸 확인하면 끝 입니다.