iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Kubernetes

異世界生存戰記:30天煉成GKE大師系列 第 20

Day20 Grafana + GCP OAuth API 一鍵登入數據聖殿

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20241004/20169017ryZF24JyPG.jpg

前言

在雲端原生應用盛行的今日,確保應用程式安全存取 Google Cloud Platform (GCP) 資源至關重要。OAuth 2.0 是一種業界標準的授權框架,允許第三方應用程式在不洩露使用者密碼的情況下安全地存取使用者資料。

為了提升安全性及簡化登入流程,Grafana 支援透過 GCP OAuth API 進行身份驗證。本篇文章將提供一個逐步指南,教你如何設定 Grafana,使其能與 Google Cloud Platform 整合,並使用 Google 帳戶安全地登入。

將涵蓋從 GCP 專案設定、OAuth 同意螢幕配置,到 Grafana 設定檔修改等所有必要步驟。 無論你是 Grafana 新手還是經驗豐富的使用者,這篇教學都將幫助你快速掌握 GCP OAuth 的整合技巧,提升你的 Grafana 使用體驗,並強化系統安全性。 跟著我們的步驟,輕鬆打造更安全便捷的監控平台。

介紹 Google OAuth API

GCP OAuth 2.0 提供了一個安全且靈活的機制,讓應用程式可以存取使用者資料。 了解 OAuth 2.0 的運作流程和不同授權類型,可以幫助開發者構建更安全可靠的應用程式。 使用 Google 提供的 Client Libraries 可以簡化 OAuth 2.0 的整合過程。 務必遵循最佳實務,以確保應用程式的安全性。

GCP OAuth 2.0 的運作流程:

  1. 客戶端請求授權: 客戶端將使用者重新導向到 Google 的授權伺服器,並指定所需的範圍。
  2. 使用者授權: 使用者在 Google 的授權伺服器上登入並授權客戶端存取其資料。
  3. 授權伺服器發放授權碼: 授權伺服器將授權碼發送給客戶端。
  4. 客戶端使用授權碼交換存取權杖: 客戶端使用授權碼向授權伺服器請求存取權杖和重新整理權杖。
  5. 客戶端使用存取權杖存取資源: 客戶端使用存取權杖向資源伺服器請求使用者資料。
  6. 使用重新整理權杖更新存取權杖: 當存取權杖過期時,客戶端可以使用重新整理權杖取得新的存取權杖,無需再次與使用者互動。

設定 GCP OAuth API

進入 API & Services 頁面,點選 OAuth 同意畫面設定,如果讀者已經設定過了,可以跳過這個步驟,直接進入到設定 Credentials(憑證) 步驟。

設定同意畫面,選擇內部,因為 Grafana 通常是給內部使用的系統,點選建立。

需要擁有自己公司網域的 Email,只對公司網域的使用者 Email 進行開放登入。

https://ithelp.ithome.com.tw/upload/images/20241004/20169017ehNq54JaDX.png

userinfo.profile, openid, userinfo.email 三項新增至 您的非機密範圍

https://ithelp.ithome.com.tw/upload/images/20241004/201690175Sode1HqjH.png

設定完成登入頁面後,點擊左側選單中的 Credentials(憑證),點擊創建 OAuth client ID

https://ithelp.ithome.com.tw/upload/images/20241004/20169017G3RfkHC2k6.png

選擇網頁應用程式,已授權的 JavaScript 來源填入自建的 https://Grafana網址,已授權的重新導向 URI 填入 https://Grafana網址/login/google,設定完成後點擊建立。

https://ithelp.ithome.com.tw/upload/images/20241004/201690178coYERSa6Y.png

會彈出 OAuth 用戶端已建立 視窗,紀錄下 用戶端編號用戶端密鑰,待會設定 Grafana Config 會使用到。

https://ithelp.ithome.com.tw/upload/images/20241004/20169017YIqUMAwmeb.png

安裝 Grafana

使用 Helm Chart 安裝 Grafana

$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm pull grafana/grafana --version=8.5.1 

這裡為了方便示範先將 assertNoLeakedSecrets 關閉,否則去檢查 auth.google.client_secret 機密是否存在。通常在正式環境中會使用 Vault, GCP Secret Manager 等工具紀錄機密資訊,再由 External Secret Manager 引入進來,詳情請看 Day17 GKE 秘密封印:External Secret Manager & ReloaderGrafana 官方文件

values.yaml

# values.yaml
ingress:
  enabled: true # 開啟 Ingress
  ingressClassName: external-nginx
  annotations: 
    cert-manager.io/cluster-issuer: letsencrypt-demo
  labels: {}
  path: /
  pathType: Prefix
  hosts:
    - grafana.demoit.shop
  tls: 
    - secretName: grafana.demoit.shop-tls
      hosts:
      - grafana.demoit.shop
    
persistence:
  type: pvc
  enabled: true # 開啟 PVC
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  size: 10Gi

grafana.ini:
  server:
    root_url: https://grafana.demoit.shop #改成使用者的 Grafana 網址
  auth.google:
    enabled : true
    client_id : # Google OAuth 用戶端編號
    client_secret : # Google OAuth 用戶端密鑰
    scopes : https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
    auth_url : https://accounts.google.com/o/oauth2/auth
    token_url : https://accounts.google.com/o/oauth2/token
    api_url : https://openidconnect.googleapis.com/v1/userinfo
    allowed_domains : demoit.shop # 改成使用者的 Gmail 網域,需購買 Google Workspace
    hosted_domain : demoit.shop # 改成使用者的網域
    allow_sign_up : true
    use_pkce : true
    use_refresh_token : false
    allow_assign_grafana_admin : true
    auto_login : false
# 先將 assertNoLeakedSecrets 關閉,否則去檢查 auth.google.client_secret 會失敗
assertNoLeakedSecrets: false

以上有幾個部分需要注意:

  • grafana.ini.server.root_url:需要填入使用者的 grafana 網址
  • grafana.ini.auth.google.client_id:填入上個步驟核發的 Google OAuth 用戶端密鑰
  • grafana.ini.auth.google.client_secret:填入上個步驟核發的 Google OAuth 用戶端編號
  • grafana.ini.auth.google.allowed_domains:改成公司的 Gmail 網域,需購買 Google Workspace
  • grafana.ini.auth.google.hosted_domain:改成使用者的網域
  • grafana.ini.auth.google.auto_login:自動跳轉到 Google OAuth 驗證網頁
  • assertNoLeakedSecrets:會去檢查 auth.google.client_secret 是否有敏感資訊存
$ helm upgrade --install grafana -f values.yaml . -n grafana --create-namespace

開啟 Grafana 網頁,會發現多了一個 Sign in with Google 的選項,點擊 Sign in with Google。

https://ithelp.ithome.com.tw/upload/images/20241004/20169017nWjBU1Utpr.png

會跳轉到 Google OAuth 2.0 帳號驗證頁面,需要符合 Grafana 中設定的帳號才有資格登入。

https://ithelp.ithome.com.tw/upload/images/20241004/201690171lZaAMT5H6.png

接下來,使用 Admin 帳號登入(Admin 密碼可以去 Secret 物件查看),會發現剛剛使用 Google 登入的帳號已經記錄下來,可以調整其權限。

https://ithelp.ithome.com.tw/upload/images/20241004/20169017TihXFLwkLg.png

總結

本篇介紹 Grafana 結合 GCP OAuth 2.0 進行 Gmail 使用者認證登入,不再需要使用帳號密碼來管理 Grafana 使用者,針對 Gmail 網域進行限制,非常符合企業的需求,使 IT 帳密管理變得更為輕鬆,只需要針對 Google WorkSpace 進行使用者管理。

以 SRE 常使用的工具來說,例如 Gitlab, Argocd, ElasticSearch 等都可以進行 GCP OAuth 2.0 設定,設定的步驟和本篇的教學大同小異,使用者可以參考本篇教學,舉一反三,將 GCP OAuth 2.0 整合到更多系統中。 除了提升安全性之外,也簡化了使用者登入流程,提升使用體驗。

如果讀者需要 Grafana 更詳盡的介紹可以接著參考 Blueswen 寫的 Grafana Zero to Hero - Management:使用者管理,這裡是他今年寫的 Grafana Zero to Hero 鐵人賽系列文
另一個作者 mikehsu0618 今年寫的 後 Grafana 時代的自我修養鐵人賽系列文也很不錯,非常推薦給對 Grafana 有興趣的讀者。

參考文件


上一篇
Day19 GKE 共享的魔法卷軸(二):硬碟可以掛載的話,那 Cloud Storage 也可以嗎?
下一篇
Day21 資源不夠使用了,調用一些魔力給它吧! Kueue(一)
系列文
異世界生存戰記:30天煉成GKE大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言