Перейти к содержанию

Настройка Keycloak

Система работает с провайдерами OpenID, которые используют HTTPS. Хотя можно настроить сервер Keycloak для работы по HTTP, Система может взаимодействовать только с сервером Keycloak, использующим HTTPS.

Настройте Keycloak на использование алгоритмов шифрования с открытым ключом (например, RSA256 или RSA512) вместо алгоритмов симметричного шифрования (например, HS256 или HS358) для подписи токенов. Алгоритмы шифрования с открытым ключом:

  • Проще настраивать.
  • Более безопасны, так как утечка закрытого ключа имеет серьезные последствия для безопасности.


  1. Откройте консоль администрирования Keycloak.

  2. Перейдите в Realm Settings > Tokens > Default Signature Algorithm.

  3. Настройте алгоритм подписи.

Пример блока конфигурации для установок Linux-пакета:

gitlab_rails['omniauth_providers'] = [
     {
          name: "openid_connect", # do not change this parameter
          label: "Keycloak", # optional label for login button, defaults to "Openid Connect"
          args: {
               name: "openid_connect",
               scope: ["openid", "profile", "email"],
               response_type: "code",
               issuer:  "https://keycloak.example.com/realms/myrealm",
               client_auth_method: "query",
               discovery: true,
               uid_field: "preferred_username",
               pkce: true,
               client_options: {
                    identifier: "<YOUR CLIENT ID>",
                    secret: "<YOUR CLIENT SECRET>",
                    redirect_uri: "https://gitlab.example.com/users/auth/openid_connect/callback"
                    }
          }
     }
]

Настройка Keycloak с использованием симметричного алгоритма шифрования

Примечание

Следующие инструкции приведены для полноты картины, но используйте симметричное шифрование только в случае крайней необходимости.

Для использования симметричного шифрования:

  1. Извлеките секретный ключ из базы данных Keycloak. Keycloak не предоставляет это значение через веб-интерфейс. Секрет клиента, видимый в веб-интерфейсе, является секретом клиента OAuth 2.0, который отличается от секрета, используемого для подписи JSON Web Token (JWT).

    Например, если вы используете PostgreSQL в качестве базы данных для Keycloak:

    • Войдите в консоль базы данных.
    • Выполните следующий SQL-запрос для извлечения ключа:

      $ psql -U keycloak
      psql (13.3 (Debian 13.3-1.pgdg100+1))
      Type "help" for help.
      
      keycloak=# SELECT c.name, value FROM component_config CC INNER JOIN component C ON(CC.component_id = C.id) WHERE C.realm_id = 'master' and provider_id = 'hmac-generated' AND CC.name = 'secret';
      -[ RECORD 1 ]---------------------------------------------------------------------------------
      name  | hmac-generated
      value | lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62-sqGc8drp3XW-wr93zru8PFsQokHZZuJJbaUXvmiOftCZM3C4KW3-g
      -[ RECORD 2 ]---------------------------------------------------------------------------------
      name  | fallback-HS384
      value | UfVqmIs--U61UYsRH-NYBH3_mlluLONpg_zN7CXEwkJcO9xdRNlzZfmfDLPtf2xSTMvqu08R2VhLr-8G-oZ47A
      

    В этом примере есть два закрытых ключа: один для HS256 (hmac-generated) и другой для HS384 (fallback-HS384). Мы используем первое значение value для настройки Системы.

  2. Преобразуйте значение value в стандарт base64. Значение должно быть закодировано в формате Base64 с использованием URL-безопасного алфавита. Следующий скрипт на Ruby выполняет это преобразование:

    require 'base64'
    
    value = "lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62-sqGc8drp3XW-wr93zru8PFsQokHZZuJJbaUXvmiOftCZM3C4KW3-g"
    Base64.encode64(Base64.urlsafe_decode64(value))
    

    Это приводит к следующему значению:

      lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62+sqGc8drp3XW+wr93zru8PFsQokH\nZZuJJbaUXvmiOftCZM3C4KW3+g==\n
    
  3. Укажите этот секрет, закодированный в base64, в параметре jwt_secret_base64. Например:

    gitlab_rails['omniauth_providers'] = [
         {
              name: "openid_connect", # do not change this parameter
              label: "Keycloak", # optional label for login button, defaults to "Openid Connect"
              args: {
                   name: "openid_connect",
                   scope: ["openid", "profile", "email"],
                   response_type: "code",
                   issuer:  "https://keycloak.example.com/auth/realms/myrealm",
                   client_auth_method: "query",
                   discovery: true,
                   uid_field: "preferred_username",
                   jwt_secret_base64: "<YOUR BASE64-ENCODED SECRET>",
                   pkce: true,
                   client_options: {
                        identifier: "<YOUR CLIENT ID>",
                        secret: "<YOUR CLIENT SECRET>",
                        redirect_uri: "https://gitlab.example.com/users/auth/openid_connect/callback"
                   }
              }
         }
    ]
    

    Если вы видите ошибку JSON::JWS::VerificationFailed, значит, был указан неверный секрет.