ArgoCD: интеграция с Okta и группы пользователей

Автор: | 05/14/2021
 

В предыдущем посте ArgoCD: пользователи, доступы и RBAC разобрались с пользователями и RBAC в целом, теперь настроим ArgoCD SSO.

Идея заключается в том, что мы не заводим локальных пользователей в ArgoCD, а используем базу Okta, и она же выполняет их аутентификацию. На стороне же ArgoCD мы будем выполнять авторизацию, т.е. проверять уровни доступа.

Плюс, используя SSO можно будет создать группы пользователей, которым назначим различные роли и привяжем к определённым проектам.

Использовать будем SAML, документация — SAML (with Dex), и см. также What is: SAML — обзор, структура и трассировка запросов на примере Jenkins и Okta SAML SSO.

Настройка Okta

Переходим в Окту, создаём SAML-приложение:

Для лого использовал вот эту картинку:

На следующей странице указываем:

  • Single sign on URL и в виде argourl.com/api/dex/callback
  • в Attribute Statements: name — email, формат Basic, Value — user.email
  • в Group Attribute Statements: name — group, формат Basic, в Filter можно использовать regex, как показано в примере в документации — тогда будут фильроваться группы Okta, которые будут передаваться в ArgoCD во время аутентификации в Authentication context, либо не фильтровать ничего, задав в Match regex значение «.*» — тогда в Argo будут передаваться все группы

Либо отфильтровать группы через |:

На следующей странице указываем I’m an Okta customer adding an internal app, и жмём Finish:

Подключаем приложение пользователю или группе:

Переключаемся на вкладку Sign On, кликаем View Setup Instructions:

Переходим к ArgoCD.

Настройка ArgoCD

Редактируем ConfigMap argocd-cm:

kubectl -n dev-1-18-devops-argocd-ns edit configmap argocd-cm

Указываем:

  • url: (уже может быть задан, просто проверьте значение) — адрес ArgoCD
  • ssoURL: Identity Provider Single Sign-On URL со страницы, открывшейся после клика на View Setup Instructions
  • caData: берём сертификат оттуда же, енкодим в base64, например на сайте https://www.base64encode.org

Получается такой конфиг:

apiVersion: v1
data:
  url: https://dev-1-18.argocd.example.com
  dex.config: |
    logger:
      level: debug
      format: json
    connectors:
    - type: saml
      id: okta
      name: Okta
      config:
        ssoURL: https://okta.example.com/app/appname/exk9f6o07dKjN0huC357/sso/saml
        caData: |
          LS0tLS***FLS0tLS0=
        usernameAttr: email
        emailAttr: email
        groupsAttr: group
...

Роли и группы пользователей в ArgoCD

Редактируем argocd-rbac-cm ConfigMap, добавляем маппинг группы DevOps, которая получена из Okta, на роль role:admin:

g, DevOps, role:admin

Также, можно отключить пользователя admin, и добавить бидинги групп Backend и Web к приложениям в их проектах:

...
data:
  admin.enabled: "false"
  policy.csv: |
    p, role:backend-app-admin, applications, *, Backend/*, allow
    p, role:web-app-admin, applications, *, Web/*, allow
    g, DevOps, role:admin
  policy.default: role:''
  scopes: '[email,groups]'
...

Имейте ввиду, что RBAC чувствителен к регистру — DevOps != devops. Т.е. группу тут надо указывать так, как она задана пользователю в самой Okta.

Сохраняем, и пробуем залогиниться:

ArgoCD CLI login

Для логина из консоли — добавляем --sso, а в --username — указываем свой логин от Okta:

argocd login dev-1-18.argocd.example.com --sso --username arseniy@example.com
Opening browser for authentication
...
Authentication successful
'arseniy@example.com' logged in successfully
Context 'dev-1-18.argocd.example.com' updated

Откроется браузер по-умолчанию, в котором будет выполнена аутентификация через Okta.

Ошибки и проблемы

Bad Request — User session error

При использовании Dex имейте ввиду, что он не поддерживает Provider-initated login, т.е. из Okta в ArgoCD залогиниться нельзя — будем получать ошибку 400:

Поэтому, имеет смысл скрыть приложение в списке у пользователей:

Failed to authenticate: no attribute with name «group»: [email]

В случае ошибки вида «Failed to authenticate: no attribute with name «group»: [email]«:

Используем saml-chrome-panel, и проверяем, какие аттрибуты в AttributeStatement передала Okta в ArgoCD:

<saml2:AttributeStatement xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
    <saml2:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">arseniy@example.com</saml2:AttributeValue>
    </saml2:Attribute>
</saml2:AttributeStatement>

В этом случае нет аттрибута <saml2:Attribute Name="group" из-за опечатки в настройках Okta.

Полностью должно выглядет так:

<saml2:AttributeStatement xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
    <saml2:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">arseniy@example.com</saml2:AttributeValue>
    </saml2:Attribute>
    <saml2:Attribute Name="group" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
        <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">DevOps</saml2:AttributeValue>
    </saml2:Attribute>
</saml2:AttributeStatement>

Готово.