Keycloak: сервисные учетные записи получают 403 ответы на вновь созданном королевстве

Вопрос или проблема

Я пытаюсь создать новые сферы с ролями, пользователями и другой конфигурацией, используя Java-клиент. Для этой цели я настроил сервисный аккаунт в сфере master, используя OIDC и прикрепив к нему все роли сферы, которые я смог найти:
введите описание изображения здесь

Затем я использую этот аккаунт для подключения к Keycloak через Java API из приложения Quarkus. Код пытается создать новую сферу, затем добавить роли, пользователей, клиентов и т. д. к ней.

На моей локальной конфигурации для разработки этот процесс полностью работает. Но я попытался воспроизвести его на сервере, и там клиент может создавать сферы, но попытка добавить роль (первый шаг после создания сферы) завершается неудачей с ошибкой доступа (HTTP 403).

Пока я попробовал:

  • убедиться, что обе конфигурации используют одну и ту же версию Keycloak. Они обе используют Docker-образ quay.io/keycloak/keycloak:25.0.6.
  • проверить конфигурацию запуска на предмет того, что могло бы вызвать проблему. У удаленной конфигурации есть дополнительные настройки для использования производственной базы данных и работы за обратным прокси, но ничего из этого не кажется связанным.
  • сравнить настройки клиента в моей локальной, работающей конфигурации с удаленной, неработающей, щелкая по всем экранам, которые казались релевантными. Я не заметил никакой разницы, кроме порядка ролей или подобных элементов, которые, как мне кажется, имеют заданную семантику.
  • запустить Keycloak с включенным журналированием отладки и просмотреть логи. Я вижу, что он неудачно завершает выполнение в org.keycloak.services.resources.admin.permissions.RolePermissions.requireManage(RolePermissions.java:370), но это, похоже, не сообщает мне ничего нового, и ничего другого в логах также не кажется релевантным (логов довольно много, так что я мог что-то пропустить).
  • сначала загрузить экспорты сферы master в обеих конфигурациях и несколько нормализовать их, смотря на различия (заменить UUID на жестко закодированную строку, удалить сферы, которые не общие, переупорядочить некоторые списки) – на данный момент я не нашел никаких различий, но нормализовать порядок довольно утомительно, поэтому я не сделал все и, возможно, допустил ошибки.

Одно отличие заключается в том, что моя локальная конфигурация не находится за обратным прокси, а на удаленной стороне доступ немного сложнее: публичный обратный прокси использует другое имя хоста (установлено как KC_HOSTNAME), чем доступ к API, так как API не доступен публично. Программное обеспечение управления аккаунтами, которое я написал, использует сетевую мостовую сеть Docker, где экземпляр Keycloak просто известен под именем keycloak. KC_HOSTNAME_STRICT установлено в false.

Вот полные параметры окружения для контейнера:

KEYCLOAK_ADMIN=...
KEYCLOAK_ADMIN_PASSWORD=...
KC_DB=postgres
KC_DB_URL=jdbc:postgresql://host.docker.internal:5432/keycloak
KC_DB_USERNAME=keycloak
KC_DB_PASSWORD=...
KC_HTTP_ENABLED=true
KC_PROXY_HEADERS=forwarded
KC_HOSTNAME=https://...external.location...
KC_HOSTNAME_STRICT=false
KC_LOG_LEVEL=DEBUG

Что может вызывать 403 на сфере, которую клиент только что смог создать самостоятельно?

Ответ или решение

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

1. Проверка прав доступа сервисной учетной записи

Одной из первых вещей, которую необходимо проверить, является соответствие прав доступа сервисной учетной записи, с помощью которой вы выполняете запросы на сервере. Хотя вы указали, что привязали все доступные роли к сервисной учетной записи, важно убедиться, что эти роли действительно наделяют права на управление ролями, Users и Realm.

Проверьте, есть ли у вашей сервисной учетной записи роль типа manage-realm, которая необходима для управления ролями и пользователями в конкретном царстве. Убедитесь, что вся необходимая настройка ролей и привилегий актуальна и правильно сконфигурирована на сервере.

2. Проверка настроек конфигурации Keycloak

Разница в конфигурациях может оказать значительное влияние на работу Keycloak. Например, ваш локальный экземпляр работает без обратного прокси, тогда как удаленный экземпляр использует более сложную конфигурацию. Убедитесь, что настройки KC_PROXY_HEADERS, KC_HOSTNAME и KC_HOSTNAME_STRICT корректны и соответствуют документации Keycloak.

Ваша настройка KC_PROXY_HEADERS=forwarded указывает на использование заголовка Forwarded, что может потребовать дополнительной настройки на уровне вашего обратного прокси. Также стоит проверить, корректно ли настроены правила маршрутизации и разрешены все необходимые HTTP-методы через прокси.

3. Логи Keycloak

Вы упомянули, что включили отладку логирования. Однако стоит обратить внимание на дополнительные логи, которые могут указывать на конкретные проблемы с правами доступа. При включенном отладочном режиме ищите записи, относящиеся к запросам, в которых возникает ошибка 403. Это может предоставить ценную информацию о том, какая именно часть проверки доступа не выполняется.

4. Сравнение экспорта Realm

Поскольку вы уже загрузили экспорт master realm и проводили сравнение, стоит проанализировать это еще раз с акцентом на объекты, имеющие отношение к правам доступа и ролям. Часто неожиданное поведение может быть связано с настройками, не попадающими под регулярное сравнение.

Проверьте, чтобы роли и разрешения были настроены одинаково. Также можно попробовать создать новую сервисную учетную запись с минимально необходимыми правами и поэкспериментировать, добавляя только нужные роли, чтобы выяснить, какая именно из настроек и дает сбой.

5. Эксплуатационные моменты

Если у вас есть возможность, рекомендуется использовать инструмент мониторинга для отслеживания запросов и ответов между вашим приложением и Keycloak. Это может помочь выявить, где именно возникает проблема. Само по себе отсутствие успешного создания ролей может указывать на то, что служебный доступ был ограничен из-за сетевых вопросов или некорректной конфигурации.

Заключение

Ошибка 403 в Keycloak может быть вызвана множеством факторов, начиная от несанкционированного доступа до конфигурационных вопросов. Методично проверяйте настройки прав доступа, конфигурацию окружения, а также логи Keycloak, чтобы выявить причину проблемы. Использование вышеперечисленных подходов позволит вам диагностировать и решить возникшую проблему, обеспечив корректное функционирование вашего сервиса.

Оцените материал
Добавить комментарий

Капча загружается...