decadence

個人のメモ帳

argo-workflowsのSSO+RBACをazure連携させる

これは何

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-configmaprbac: 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は追々使うので控える。

f:id:krrrr:20210120181748p:plain

callback用URLの設定。

f:id:krrrr:20210120181902p:plain

idTokenの構成情報の変更。argoではidTokenのpayloadとして emailgroups の情報を利用するので、 Token Configuration -> Add optional claims から双方の値を含めるように変更する

f:id:krrrr:20210120181310p:plain

clientId / clientSecret の発行 f:id:krrrr:20210120182407p:plain

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連携で行えるようになった。