В предыдущем посте 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>
Готово.













