В предыдущем посте 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
Редактируем ConfigMap argocd-cm
:
[simterm]
$ kubectl -n dev-1-18-devops-argocd-ns edit configmap argocd-cm
[/simterm]
Указываем:
- 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:
[simterm]
$ argocd login dev-1-18.argocd.example.com --sso --username [email protected] Opening browser for authentication ... Authentication successful '[email protected]' logged in successfully Context 'dev-1-18.argocd.example.com' updated
[/simterm]
Откроется браузер по-умолчанию, в котором будет выполнена аутентификация через 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">[email protected]</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">[email protected]</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>
Готово.