Skip to content

Аунтентификация в 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./realms/truedev/protocol/saml/descriptor.

Найдите тег и скопируйте его содержимое.

Создайте файл gitlab-sso.pem и вставьте туда скопированный сертификат:

-----BEGIN CERTIFICATE-----
MIICn.......BgF/UnSqfzANBg<OMIT_SECRET>
-----END CERTIFICATE-----
Используйте openssl для вычисления fingerprint, копируем fingerprint чтобы использовать ниже.
openssl x509 -sha1 -fingerprint -noout -in gitlab-sso.pem
SHA1 Fingerprint=<OMIT_SECRET>

Настройка 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

Alt text

References: