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 已被調整,在過期後會自動登出:
