Argo WorkflowsのSSOをAzure使って設定

Argo WorkflowsでSSOを設定するのにAzureを使って行ってみました。

# Argo Workflowsのセットアップ
Argo Workflows自体はHelmを使って設定します。

https://github.com/argoproj/argo-helm

```bash
# Helm
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

# Deploy Argo workflow
helm upgrade my-workflow argo/argo-workflows -n argo --create-namespace --install -f values.yaml
```

Helm Chartの詳細はこちらを参考にしました。

https://github.com/argoproj/argo-helm/tree/main/charts/argo-workflows

# SSOのためのシークレット
Microsoft EntraをIdpとして使用するために、App RegistrationのシークレットをKubernetesに作成します。
まずAzureのApp Registrationなどでシークレットを設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799224/36a0ed0a-664b-3840-708a-77a6db5fff55.png)

発行したシークレットをKubernetesのシークレットとして作成。
```yaml
apiVersion: v1
kind: Secret
metadata:
  name: argo-sso
  namespace: argo
type: Opaque
stringData:
  client-id: "12345678-111b-11aa-ab56-123456789ad"
  client-secret: "**********************"
```

# 特定のAzure Groupがアクセスできるためのサービスアカウントの設定
AzureのGroupID`123456`に所属するユーザがArgoの管理者権限を持つサービスアカウントを使えるように設定。
サービスアカウントとTokenの作成。

```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-argo-admin
  namespace: argo
  annotations:
    # The rule is an expression used to determine if this service account
    # should be used.
    # * `groups` - an array of the OIDC groups
    # * `iss` - the issuer ("argo-server")
    # * `sub` - the subject (typically the username)
    # Must evaluate to a boolean.
    # If you want an account to be the default to use, this rule can be "true".
    # Details of the expression language are available in
    # https://expr-lang.org/docs/language-definition.
    workflows.argoproj.io/rbac-rule: "'123456' in groups"
    # The precedence is used to determine which service account to use whe
    # Precedence is an integer. It may be negative. If omitted, it defaults to "0".
    # Numerically higher values have higher precedence (not lower, which maybe
    # counter-intuitive to you).
    # If two rules match and have the same precedence, then which one used will
    # be arbitrary.
    workflows.argoproj.io/rbac-rule-precedence: "1"
---
apiVersion: v1
kind: Secret
metadata:
  name: my-argo-admin.service-account-token
  namespace: argo
  annotations:
    kubernetes.io/service-account.name: my-argo-admin
type: kubernetes.io/service-account-token
---
```
サービスアカウントを既存のClusterRoleとClusterRoleBinding。
```yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-argo-admin-access
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: my-workflow-argo-workflows-admin # ClusterRoleはArgo Workflowsセットアップ時に作成される
subjects:
- kind: ServiceAccount
  name: my-argo-admin
  namespace: argo

```
これにより、AzureのGroupID`123456`に所属するユーザがサービスアカウント`my-argo-admin`をつかって`my-workflow-argo-workflows-admin`で設定してる権限を取得します。

# AzureのApp Registration設定
AzureのApp RegistrationでAuthenticationの設定をします。

Redirect URIsにセットアップしたArgoのCallback URLを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799224/71bcf729-6571-230f-da04-1a19ae0e24d2.png)

SSOのあとGroup IDとemailをArgo Workflowsで使用するのでTokenの設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799224/2dd648ed-9a1f-2f5e-53b9-0b429cc7b119.png)

# ArgoでSSOを設定
Helmのvalueを変更してSSOを設定します。AzureのGroupID`123456`に所属するユーザがSSOできるように設定しています。

```yaml
server:
  authModes: ["sso"] 
  sso:
    clientId:
      name: "argo-sso"
      key: "client-id"
    clientSecret:
      name: "argo-sso"
      key: "client-secret"
    enabled: true
    filterGroupsRegex:
    - "123456" # AzureのGroup ID
    issuer: "https://login.microsoftonline.com/<tenand id>/v2.0"
    redirectUrl: "https://myargo.name.company/oauth2/callback"
    rbac:
      enabled: true
```
`filterGroupsRegex`を使って、必要のあるGroup IDのみ取得します。

# Argo WorkflowsにSSO

Argo WorkflowsのGUIからsingle sign-onでLOGINすると、AzureにリダイレクトされてAzureで認証を行いそのあとArgo Workflowsにリダイレクトされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799224/82ca407a-c892-640c-c6b9-6681a10ae8ca.png)

認証後はUserから所属のGroup IDやemailが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799224/2c33cb72-f571-a29d-0d2f-e8b46d49fee9.png)