Настройка Keycloak¶
Система работает с провайдерами OpenID, которые используют HTTPS. Хотя можно настроить сервер Keycloak для работы по HTTP, Система может взаимодействовать только с сервером Keycloak, использующим HTTPS.
Настройте Keycloak на использование алгоритмов шифрования с открытым ключом (например, RSA256 или RSA512) вместо алгоритмов симметричного шифрования (например, HS256 или HS358) для подписи токенов. Алгоритмы шифрования с открытым ключом:
- Проще настраивать.
- Более безопасны, так как утечка закрытого ключа имеет серьезные последствия для безопасности.
-
Откройте консоль администрирования Keycloak.
-
Перейдите в Realm Settings > Tokens > Default Signature Algorithm.
-
Настройте алгоритм подписи.
Пример блока конфигурации для установок 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 с использованием симметричного алгоритма шифрования¶
Примечание
Следующие инструкции приведены для полноты картины, но используйте симметричное шифрование только в случае крайней необходимости.
Для использования симметричного шифрования:
-
Извлеките секретный ключ из базы данных 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
для настройки Системы. -
Преобразуйте значение
value
в стандарт base64. Значение должно быть закодировано в формате Base64 с использованием URL-безопасного алфавита. Следующий скрипт на Ruby выполняет это преобразование:require 'base64' value = "lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62-sqGc8drp3XW-wr93zru8PFsQokHZZuJJbaUXvmiOftCZM3C4KW3-g" Base64.encode64(Base64.urlsafe_decode64(value))
Это приводит к следующему значению:
lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62+sqGc8drp3XW+wr93zru8PFsQokH\nZZuJJbaUXvmiOftCZM3C4KW3+g==\n
-
Укажите этот секрет, закодированный в 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
, значит, был указан неверный секрет.