Перейти до основного вмісту

Jenkins OIDC, Gitea OIDC and Grafana SSO with Casdoor: One Login for a Self-Hosted DevOps Stack

· Читання за 9 хв
Yang Luo
Casdoor Maintainer

Every tool in a typical self-hosted DevOps stack can act as an OpenID Connect client: Gitea and Argo CD speak OIDC natively, Jenkins does through the oic-auth plugin, Grafana and Portainer through generic OAuth 2.0, and MinIO, Harbor and GitLab through their OIDC settings. Point all of them at one Casdoor instance, give each tool its own Casdoor application, and put your people in Casdoor groups. Each tool then reads the groups claim and decides who is an administrator. This post lists the callback URL, the config keys and the group mapping for each tool, then covers the parts they share.

Огляд стека​

Усі шляхи нижче є відносними до публічного URL самого інструменту. Зареєструйте їх у Redirect URLs додатку Casdoor для цього інструменту.

ДодатокПротоколCallback URLВідображення групи/ролі в адміністратораДокументація Casdoor
GiteaOIDC (джерело автентифікації OAuth2)/user/oauth2/<source-name>/callbackТак: група адміністраторів, обмежена група, маппінг командGitea
JenkinsOIDC (плагін oic-auth)/securityRealm/finishLogin, logout /OicLogoutТак: твердження groups плюс безпека на основі MatrixJenkins (OIDC)
GrafanaGeneric OAuth 2.0/login/generic_oauthТак: role_attribute_pathGrafana
Argo CDOIDC/auth/callback, CLI http://localhost:8085/auth/callbackТак: argocd-rbac-cmArgo CD
MinIOOIDCConsole /oauth_callbackПолітики з одного твердження (claim_name)MinIO
PortainerOAuth 2.0 (Custom)Базовий URL PortainerТільки Business EditionPortainer
HarborOIDC/c/oidc/callbackТак: OIDC Admin Groupще немає
GitLabOIDC (OmniAuth)/users/auth/openid_connect/callbackPremium та Ultimate: admin_groupsGitLab

Документ discovery, необхідний кожному OIDC-клієнту, знаходиться за адресою https://<casdoor-host>/.well-known/openid-configuration. Якщо ви раніше не підключали OIDC-клієнт до Casdoor, стаття Connect a standard OIDC client пояснює кінцеві точки.

Підготовка Casdoor один раз​

Перш ніж торкатися інструментів, налаштуйте три речі в Casdoor.

Groups. Створіть групи, такі як devops-admins і devops-users, в дереві організації та додайте до них користувачів. Див. Groups.

Token group format. За замовчуванням твердження groups називає кожну групу як <organization>/<group>. Більшість інструментів порівнюють твердження з простим рядком, який ви вводите, тому встановіть Token group format на вкладці OIDC/OAuth кожного додатку значення Name (group). Твердження тоді буде містити devops-admins. Опції описані в розділі Group format.

Token format. Залиште Token format зі значенням JWT, що є стандартним. У цьому форматі ID token містить groups, roles та tag. Формати JWT-Empty та JWT-Standard виключають усі три з токена, а JWT-Custom містить їх лише якщо ви оберете їх у Token fields. Відповідь /api/userinfo повертає groups та імена ролей, коли надано scope profile, тому інструменти, які читають userinfo, все одно їх побачать.

Ролі також працюють. У форматі JWT твердження roles є масивом об'єктів ролей, тому здійснюйте зіставлення за roles[*].name. У /api/userinfo це простий масив імен. Див. User roles.

Gitea​

У Site Administration, додайте джерело автентифікації типу OAuth2 з провайдером OpenID Connect, client ID та secret, а також discovery URL Casdoor. Ім'я, яке ви даєте джерелу, є частиною callback URL: джерело з ім'ям casdoor використовує https://gitea.example.com/user/oauth2/casdoor/callback.

Для відображення груп заповніть поле Claim name providing group names значенням groups, потім поле Group Claim value for administrator users значенням devops-admins. У Gitea також є поля Group Claim value for restricted users та Map claimed groups to Organization teams. Те саме джерело через CLI:

gitea admin auth add-oauth \
--name casdoor \
--provider openidConnect \
--key <client-id> \
--secret <client-secret> \
--auto-discover-url https://door.example.com/.well-known/openid-configuration \
--group-claim-name groups \
--admin-group devops-admins

Jenkins​

Jenkins не має власної підтримки OIDC. Встановіть плагін OpenId Connect Authentication, оберіть його як realm безпеки та використовуйте well-known configuration. Callback для входу — /securityRealm/finishLogin, а для виходу — /OicLogout; додайте обидва до Casdoor. У JCasC:

jenkins:
securityRealm:
oic:
serverConfiguration:
wellKnown:
wellKnownOpenIDConfigurationUrl: https://door.example.com/.well-known/openid-configuration
clientId: <client-id>
clientSecret: <client-secret>
userNameField: name
fullNameFieldName: displayName
emailFieldName: email
groupsFieldName: groups
logoutFromOpenidProvider: true
properties:
- "pkce"

Плагін лише передає групи в Jenkins. Права надаються стратегією авторизації: при використанні безпеки на основі Matrix, кожен рядок таблиці є користувачем або групою, тому додайте рядок для devops-admins і надайте йому Overall/Administer. Вибір плагіна як realm безпеки вимикає інші методи входу, тому налаштуйте властивість escapeHatch плагіна (резервне ім'я користувача та секрет) перед збереженням. Casdoor також має власний плагін для Jenkins, описаний у Jenkins plugin, але цей пост передбачає використання загального OIDC-плагіна.

Grafana​

Grafana використовує generic OAuth. Її callback — /login/generic_oauth. Стандартне значення scopes у Grafana — user:email, тому явно встановіть OIDC scopes:

[auth.generic_oauth]
enabled = true
name = Casdoor
client_id = <client-id>
client_secret = <client-secret>
scopes = openid profile email
auth_url = https://door.example.com/login/oauth/authorize
token_url = https://door.example.com/api/login/oauth/access_token
api_url = https://door.example.com/api/userinfo
use_pkce = true
groups_attribute_path = groups
role_attribute_path = contains(groups[*], 'devops-admins') && 'Admin' || contains(groups[*], 'devops-users') && 'Editor' || 'Viewer'
role_attribute_strict = true

Grafana спочатку обчислює role_attribute_path відносно ID-токена, потім відповіді userinfo, а потім токена доступу. Допустимі значення: None, Viewer, Editor, Admin та GrafanaAdmin; для останнього потрібно встановити allow_assign_grafana_admin = true. allowed_groups обмежує вхід зазначеними групами та потребує groups_attribute_path. Синхронізація команд є функцією Grafana Enterprise та Grafana Cloud.

Argo CD​

Argo CD безпосередньо взаємодіє з Casdoor, не використовуючи інтегрований Dex. Зворотний виклик браузера — /auth/callback. Команда argocd login --sso за замовчуванням запускає локальний сервер на порту 8085 і використовує http://localhost:8085/auth/callback, тому зареєструйте також цю URL-адресу.

Встановіть url та oidc.config (з name, issuer, clientID, clientSecret, requestedScopes) у argocd-cm. За замовчуванням requestedScopes Argo CD додає область groups. Casdoor не потребує цього, оскільки ID-токен формату JWT завжди містить groups, тому наш посібник запитує ["openid", "profile", "email"]. Групи налаштовуються у argocd-rbac-cm, де scopes за замовчуванням дорівнює [groups]:

data:
policy.default: role:readonly
policy.csv: |
g, devops-admins, role:admin

Повний покроковий посібник, включаючи секрет клієнта в argocd-secret, наведено в посібнику Argo CD.

MinIO​

MinIO читає політики з одного твердження (claim), яке встановлюється через claim_name (за замовчуванням policy). Він не мапить групи. Швидкий старт Casdoor у документації MinIO та наш посібник використовують твердження tag Casdoor: помістіть назву політики MinIO, наприклад readwrite, у поле Tag користувача, а потім:

mc admin config set myminio identity_openid \
config_url="https://door.example.com/.well-known/openid-configuration" \
client_id=<client-id> client_secret=<client-secret> claim_name="tag"

role_policy є альтернативою: кожен користувач, який увійшов через цей провайдер, отримує зазначені політики, і його не можна поєднувати з claim_name. Зворотний виклик Console — <console-url>/oauth_callback. За проксі встановіть MINIO_BROWSER_REDIRECT_URL; старий ключ redirect_uri застарів. Зверніть увагу, що репозиторій GitHub minio/minio архівований, і його README вказує, що він більше не підтримується, тому перевірте, яку збірку MinIO ви використовуєте, перш ніж покладатися на ці налаштування.

Portainer​

Portainer використовує провайдера Custom OAuth. Заповніть поля Authorization URL (/login/oauth/authorize), Access token URL (/api/login/oauth/access_token) та Resource URL (/api/userinfo) на вашому хості Casdoor і встановіть Redirect URL як базову URL-адресу Portainer. Також є поле Logout URL. У Portainer CE опція Automatic team membership позначена як функція Business Edition, а налаштування надання прав адміністратора групам доступне лише в Business Edition. У CE користувачі, створені автоматичним забезпеченням, отримують стандартну роль користувача, і вам потрібно вручну підвищувати права адміністраторів.

Harbor і GitLab​

Harbor показує свою URI переспрямування внизу сторінки налаштувань OIDC: <harbor-url>/c/oidc/callback. Встановіть OIDC Provider Endpoint на URL-адресу Casdoor, Group Claim Name на groups та OIDC Admin Group на devops-admins. Harbor читає твердження про групи з ID-токена, який надає формат JWT. Перемкнути Harbor з автентифікації через базу даних на OIDC можна лише до того, як будуть створені будь-які локальні користувачі.

Документація OIDC GitLab має розділ про Casdoor і вимагає, щоб Casdoor працював через HTTPS. Зворотний виклик — /users/auth/openid_connect/callback. Ролі на основі груп (groups_attribute, admin_groups, required_groups, external_groups) потребують GitLab Premium або Ultimate.

Інструменти без OIDC​

Для внутрішніх панелей моніторингу, які не мають власного входу, розмістіть їх за плагіном openid-connect Apache APISIX (discovery, client_id, client_secret, redirect_uri, bearer_only), як описано в посібнику APISIX, або за nginx, як описано в статті Nginx SSO authentication.

Один додаток на інструмент чи спільний​

Єдиний додаток Casdoor з усіма зворотними викликами інструментів у його Redirect URLs працює, але один додаток на інструмент простіше в експлуатації:

  • Кожен інструмент має свій власний секрет клієнта, тому витік секрету Jenkins не компрометує Grafana.
  • Token group format, Token format та термін дії токенів налаштовуються для кожного додатка окремо, тому ви можете задати для Argo CD формат Name (group), не змінюючи твердження інших інструментів.
  • Casdoor перевіряє post_logout_redirect_uri відносно Redirect URLs додатка, тому кожен список залишається коротким і конкретним.

Користувачі все одно входять лише один раз: після першого входу cookie сесії Casdoor дозволяє завершити переспрямування наступного інструменту без запиту пароля.

Вийти​

Endpoint завершення сесії Casdoor — це /api/logout, зазначений як end_session_endpoint у документі discovery. Він приймає параметри id_token_hint, post_logout_redirect_uri, client_id та state і переспрямовує лише на URL-адресу, зазначену в Redirect URLs додатка. Вихід із Casdoor завершує сесію Casdoor та токени цієї сесії, але кожен інструмент також зберігає власну cookie сесії. Налаштуйте вихід у кожному інструменті:

  • Jenkins: logoutFromOpenidProvider, з зареєстрованим /OicLogout.
  • Grafana: signout_redirect_url.
  • Argo CD: logoutURL у oidc.config, наприклад https://door.example.com/api/logout?id_token_hint={{token}}&post_logout_redirect_uri={{logoutRedirectURL}}.
  • Harbor: OIDC Session Logout.
  • Portainer: Logout URL.

Деталі endpoint описані у RP-initiated logout.

Посилання​