Аунтентификация в Gitlab через Keycloak SAML¶
Настройка SAML в Keycloak¶
Для интеграции Keycloak и Gitlab через SAML необходимо сначала настроить LDAP Federation. Это позволяет Keycloak взаимодействовать с LDAP-сервером для поиска и обновления пользователей.
Шаги по настройке LDAP Federation:
- Перейдите в
User Federation
и выберите LDAP. - Установите режим Edit Mode в значение Writable, чтобы избежать ошибок вида Federated storage is not writable. (https://keycloak.discourse.group/t/saml-identity-provider/1884/4)
Создание Client Scope в Keycloak¶
Для корректной передачи атрибутов пользователей из Keycloak в Gitlab создаем Client Scope:
Client scopes - Create client scope:
Settings:
name: gitlab-saml
Mappers:
email:
Mapper type : User Property
Name * : email
Property : Email
Friendly Name : Email
SAML Attribute Name : email
SAML Attribute NameFormat : Basic
last_name:
Mapper type : User Property
Name * : last_name
Property : LastName
Friendly Name : LastName
SAML Attribute Name : last_name
SAML Attribute NameFormat : Basic
name:
Mapper type : User Property
Name * : name
Property : Username
Friendly Name : Username
SAML Attribute Name : name
SAML Attribute NameFormat : Basic
first_name:
Mapper type : User Property
Name * : first_name
Property : FirstName
Friendly Name : FirstName
SAML Attribute Name : first_name
SAML Attribute NameFormat : Basic
roles:
Mapper type : Role list
Name * : roles
Role attribute name : roles
Friendly Name : Roles
SAML Attribute NameFormat : Basic
Single Role Attribute : On
groups:
Mapper type : Group list
Name * : groups
Group attribute name : member (используем в gitlab для groups_attribute)
Friendly Name : Groups
SAML Attribute NameFormat : Basic
Single Role Attribute : On
Full group path : On
Настройка клиента Gitlab в Keycloak¶
Clients - 'Create' new client Gitlab (see previous post for basic setup):
Settings:
Client ID * : gitlab-saml (такой же как issuer в gitlab настройках SAML)
Root URL : https://gitlab.<domain>
Valid redirect URIs : https://gitlab.<domain>/users/auth/saml/callback
IDP-Initiated SSO URL name : gitlab.<domain>
Master SAML Processing URL : https://gitlab.<domain>/users/auth/saml/callback
Name ID format : persistent
Include AuthnStatement : On
Sign documents : On
Sign assertions : On
saml signature key name: NONE
Client Scopes:
Add client scope: gitlab-saml Default
Advanced:
Assertion Consumer Service POST Binding URL : https://gitlab.<domain>/users/auth/saml/callback
Roles:
Create role: gitlab:external
Groups:
Create group: gitlab:external
Users :
Username: freelancer1
Email: freelancer1@domain.com
Credentials: set password
Role Mapping
Assign Role: gitlab:external
Groups:
Join group: gitlab:external
Получение Fingerprint для поля idp_cert_fingerprint¶
Откройте браузер и перейдите по адресу https://keycloak.
Найдите тег
Создайте файл gitlab-sso.pem и вставьте туда скопированный сертификат:
Используйте openssl для вычисления fingerprint, копируем fingerprint чтобы использовать ниже.Настройка Gitlab¶
Добавьте следующие настройки в конфигурационный файл Gitlab:
gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = true
gitlab_rails['omniauth_providers'] = [
{
name: "saml",
groups_attribute: 'member',
admin_groups: ['/admins'],
required_groups: ['/admins', '/gitlab', 'gitlab:external'],
external_groups: ['/gitlab:external'],
args: {
assertion_consumer_service_url: "https://gitlab.<domain>/users/auth/saml/callback",
idp_cert_fingerprint: "DE:07:9F:9F:A2:0D:EB:85:6D:B4:95:7D:07:D7:84:43:45:E3:27:22",
idp_sso_target_url: "https://kc.<domain>/realms/truedev/protocol/saml/clients/gitlab.<domain>",
issuer: "gitlab-saml",
name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
},
label: 'SAML LOGIN'
}
]
важные параметры тут:
groups_attribute: 'member' - то что мы задали в clients scope->gitlab saml->Mappers->groups->Group attribute name
admin_groups: ['/admins'] - какие группы будут админами
required_groups: ['/admins', '/gitlab', 'gitlab:external'] - группы, которым разрешен доступ
external_groups: ['/gitlab:external'] - внешние группы, созданные в keycloak напрямую
Чтобы при входе через SSO учитывалось присутствие пользователя в группе gitlab во freeipa:
- нужен mapper для групп из ldap в keycloak
- нужен scope groups, чтобы группы подставлялись в user token
Заходим в группу gitlab - Role mapping - Assign role - filter by clients - gitlab:external во вкладке Members мы можем увидеть пользователей из freeipa которые состоят в группе gitlab во freeipa
Нужно иметь ввиду: если включен LDAP, OIDC, SAML, то для gitlab EE free , привязка групп(Administrators, Maintainers,..) будут доступна только для SAML, то есть может возникнуть коллизия когда например пользователь был в группе Админ и входил через SAML потом его исключили из группы Админ, но если доступен вход через LDAP или OIDC то при входе туда - он будет все еще в Админ группе, потому что только при входе через SAML группы назначались и Убирались
Решение возможных проблем¶
Если при входе через SSO возникает ошибка "Signing in using your SSO account without a pre-existing GitLab account is not allowed.", добавьте следующую строку в конфигурацию Gitlab:
gitlab_rails['omniauth_auto_link_saml_user'] = true
References:¶
- https://docs.gitlab.com/ee/integration/saml.html
- https://docs.gitlab.com/ee/integration/omniauth.html
- https://docs.gitlab.com/ee/administration/auth/oidc.html#configure-users-based-on-oidc-group-membership
- https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html
- https://support.ringcentral.com/article-v2/How-to-get-SAML-trace-in-Google-Chrome.html?brand=RingCentral&product=MVP&language=en_US
- https://medium.com/@panda1100/gitlab-sso-using-keycloak-as-saml-2-0-idp-86b75abadaab
- https://dheeruthedeployer.medium.com/gitlab-integration-with-keycloak-e1b2ff11a177
- Adding external users to Gitlab using SAML
- Что такое SAML аутентификация?
- SAML простыми словами
- Gitlab: move from LDAP to SAML