これは何
argo-workflowsでは2.12からSSO + RBACの機能が利用出来るようになった。ここではazureを用いたOIDC、及びRBACの設定方法について画像を用いて説明する。
What’s coming up in Argo Workflows v2.12? | by Alex Collins | Argo Project
argo-workflows SSO / RBAC の基本
argo-workflowsでは以下のページに記載している通り、server起動時の --auth-mode
としてssoを渡すことでsso機能が有効化される。さらに workflow-controller-configmap
で rbac: true
を設定すると、RBACの機能も利用出来るようになる。
Argo Server SSO - Argo Workflows - The workflow engine for Kubernetes
はじめに、argo-workflowsのSSOの機能としてはSAMLの実装はなく、OIDCのみが提供されている。関連するものとして、argo-cdにはdex用のcomponentがあるため、こちらでSAMLログインをした後に、そのdex componentとargoのSSOをつなげて利用することも出来る。
dexと繋げなくても、googleやazureのようなOIDC (OAuth2) 機能があれば、argoのみでSSOをすることも可能である。
argoとazureを用いた連携
argoとazureの連携をする際には、以下のことを順に行う必要がある。
azure applicationの作成
基本情報の取得。Directory IDは追々使うので控える。
callback用URLの設定。
idTokenの構成情報の変更。argoではidTokenのpayloadとして email
、groups
の情報を利用するので、 Token Configuration
-> Add optional claims
から双方の値を含めるように変更する
clientId / clientSecret の発行
argo側の設定
fix(argo): Add RBAC permissions for v2.12. by vladlosev · Pull Request #541 · argoproj/argo-helm · GitHub の変更により、helmからも設定が出来るようになったのでこちらを利用した例を記述する。
はじめに、ssoで利用するclientIdとclientSecretをSecretとして作成する。
apiVersion: v1 kind: Secret metadata: name: argo-server-sso type: Opaque data: client-id: ${azure側で取得したclientId} client-secret: ${azure側で取得したclientSecret}
argo-helmへ渡すvaluesへは、以下のような設定を行う。idTokenの設定でemail/groups等の情報を含めているため、追加でscopes等を付与する必要は無いと思われる。
argo: server: secure: true extraArgs: ["--auth-mode=sso"] sso: issuer: https://sts.windows.net/${azure側で取得したDirectory ID}/ clientId: name: argo-server-sso key: client-id clientSecret: name: argo-server-sso key: client-secret redirectUrl: https://localhost:2746/oauth2/callback rbac: enabled: true
最後に、RBACの設定を行う。例えばazureの特定のgroupIdに対してreadonlyな権限を付与したい場合は以下のような設定をする。
--- apiVersion: v1 kind: ServiceAccount metadata: name: some-group annotations: workflows.argoproj.io/rbac-rule: "'ここにgroupId' in groups" workflows.argoproj.io/rbac-rule-precedence: "100" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: readonly rules: - apiGroups: - "" resources: - pods - pods/log - events verbs: - get - list - watch - apiGroups: - argoproj.io resources: - workflows - workfloweventbindings - workflowtemplates - cronworkflows - cronworkflows/finalizers - clusterworkflowtemplates verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: argo-readonly roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: readonly subjects: - kind: ServiceAccount name: some-group namespace: argo-namespace
また、特定のnamespaceにおけるworkflowのみsubmit/createしたい場合は、上記の設定に加えて、そのnamespaceにおいて以下のような設定をすればよい。ポイントはUI上などでは argo-namespace
のSAが利用されるので、そのSAに対して、このnamespaceのworkflow実行権限を付与することである。
--- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: argo-workflow-submit rules: - apiGroups: - argoproj.io resources: - workflows verbs: - create - submit --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: some-group-argo-workflow-submit roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: argo-workflow-submit subjects: - kind: ServiceAccount name: some-group namespace: argo-namespace
これにより、特定のnamespace毎にworkflow実行権限を絞ったRBAC設定等を、azure連携で行えるようになった。