Dex Expiration Time on Openshift Gitops
ArgoCD 頁面自動登出設定
本文介紹如何在 ArgoCD 中設置自動登出功能。這有助於提高安全性,避免未經授權的存取。
ArgoCD 認證機制:
修改流程:
環境描述
近期由於客戶需要導入 ArgoCD 管理 CRDs,因此在客戶的 Openshift 4.x 上安裝 GitOps Operator。安裝後發現了一個問題,ArgoCD 的 Web 介面需要約 24 小時後才會自動登出,客戶希望調整登出時間。
從上圖可得知,ArgoCD 的 web 會再登入後產生一把 token 並放到 cookie 內,名為 argocd.token
,我們可以透過 jwt.io 解析這把 token,查看 expiration date:
在沒有做任何設定的情況下,透過 Openshift 帳密使用 SSO 登入機制進入 ArgoCD 畫面,所產生的 token 過期時間應該是 24h
後,這是因為 ArgoCD 在 SSO 認證上是交給 Dex Server 控制,而 Dex Server
的預設過期時間是 24h
:
可以從 ArgoCD 的 Security 文章查看 Dex Server
的說明:
尋找方法
ArgoCD Operator 會透過 Kind: ArgoCD
的 CRD ,名為 openshift-gitops
,產生需要的 components,如 server、applicationSet、grafana…:
而 ArgoCD Operator 會將 CRD 上的設定轉換成 configmap,名為 argocd-cm
:
可以從 argocd-cm
看到有關 Dex Server
的設定,其中的 connector
是透過 openshift-gitops
內的 sso.dex.openShiftOAuth
參數產生的:
connectors:
- config:
clientID: system:serviceaccount:openshift-gitops:openshift-gitops-argocd-dex-server
clientSecret: $oidc.dex.clientSecret
groups: []
insecureCA: true
issuer: https://kubernetes.default.svc
redirectURI: https://openshift-gitops-server-openshift-gitops.apps.ocp.olg.online.com/api/dex/callback
id: openshift
name: OpenShift
type: openshift
在 ArgoCD Operator 的文件上有寫道 Dex Options 可以設定的值,我們可以將將設定放在 openshift-gitops
的 dex.config
,但這個會導致 sso.dex.openShiftOAuth
的設定失效:
修改設定
參考在 Dex Server 的 github 上的 example/config-dev.yaml:
在 Dex 的官網中有針對 expiry
參數的說明,可以看到只需要調整 idTokens
,便可以修改 token 過期時間:
複製原本的 connector
的內容,並加入 expiry
的設定,一同寫入 sso.dex.config
上 (需自行新增):
sso:
dex:
config: |
expiry:
idTokens: "10h"
connectors:
- config:
clientID: system:serviceaccount:openshift-gitops:openshift-gitops-argocd-dex-server
clientSecret: $oidc.dex.clientSecret
groups: []
insecureCA: true
issuer: https://kubernetes.default.svc
redirectURI: https://openshift-gitops-server-openshift-gitops.apps.ocp.olg.online.com/api/dex/callback
id: openshift
name: OpenShift
type: openshift
...
結果
儲存設定後,會看到 Managed resource 的警告,無須理會,修改 ArgoCD 的 CRD 並不會被 overwrite:
ArgoCD Operator 會更新 argocd-cm
的 dex.config
:
等待 Dex Server
的 pod 重啟後再次登入 Web 介面,可以看到 jwt token 的 expiration date 已被調整,在過期後會自動登出: