Очередной пост о том, что мы делаем. В этот раз расскажу вам о том, как мы обеспечили безопасность информационных баз 1С с использованием сервиса аутентификации Keycloak через протокол OpenID Connect и настройку двухфакторной аутентификации с помощью OTP-кода.
Немного о задаче и почему выбрали Keycloak?
В проекте миграции 1С в «облако» у нашего заказчика было требование по обеспечению 2FA при авторизации пользователей в 1С. При этом технической возможности использовать в качестве первого фактора имеющуюся инфраструктуру заказчика не было. Причины описать не можем, так как они находились вне рамок проекта.
Было необходимо предложить реализацию, которая:
-
использует централизованное хранилище информации о пользователях (логинах, паролях и втором факторе);
-
не требует вмешательства в конфигурацию информационных баз 1С;
-
предполагает минимальную настройку пользователей на стороне баз данных.
Решили использовать сервис аутентификации, который взаимодействует с 1С по протоколу OpenID Connect. Как вариант максимально соответствующий предъявленным требованиям. На ИТС в инструкции «Совместное использование провайдеров маркеров доступа учетных данных и платформы 1С:Предприятие» упоминались следующие провайдеры: Azure AD, AD FS, Google, ЕСИА и Keycloak.
При всём «богатстве выбора» в качестве провайдера аутентификации решено было использовать решение на базе Keycloak. Во-первых, Keycloak продукт с открытым кодом для реализации single sign-on, во-вторых, в нём существует возможность управления доступом, в-третьих, продукт сфокусирован на современных приложениях и сервисах. Кроме того, Keycloak «из коробки» предлагает возможность использования в качестве второго фактора OTP-код и поддерживает работу со следующими приложениями:
-
FreeOTP
-
Google Authenticator
-
Microsoft Authenticator
Как настраивали Keycloak?
Для авторизации пользователей 1С создали сервер Keycloak. Чтобы хранить данные сервиса, создали один кластер Yandex Managed Service for PostgreSQL.
Настройка Keycloak включала следующие этапы:
-
Установили и запустили сервер в соответствии с документацией Keycloak.
-
Сгенерировали реалм (realm) нашего проекта и провели конфигурирование основных параметров: имя, настройка событий, политики паролей и т. д.
-
Создали клиентов (client) для каждой информационной базы 1С и настроили: имя, тип, секрет, конечные точки, редиректы и т.д.
-
Создали пользователей для реалма и настроили их параметры, такие как имя, пароль, 2fa, атрибуты и т.д.
Как настроили 1С?
Для настройки 1С мы выполнили следующие шаги:
-
Установили и запустили серверы приложений 1С и серверы веб-публикации 1С согласно документации.
-
Создали и опубликовали информационные базы 1С, согласно официальной документации.
-
Настроили параметры подключения к Keycloak для каждой информационной базы 1С в файле default.vrd, указав адрес, идентификатор и секрет клиента, созданного в Keycloak.
-
Настроили параметры пользователей 1С, указав тип аутентификации (OpenID Connect) и адрес электронной почты в качестве имени пользователя.
Как работает решение?
После настройки Keycloak и 1С получили такой процесс авторизации пользователей 1С:
-
Пользователь подключается тонким клиентом 1С к информационной базе на веб‑сервере.
-
Перенаправляется на страницу входа Keycloak.
-
Вводит имя и пароль. Если пользователь входит впервые, ему предлагается выполнить смену пароля.
-
Перенаправляется на страницу подтверждения f2a, где он должен ввести OTP‑код, полученный в OTP‑приложении на мобильном устройстве. Если пользователь входит впервые, ему предлагается привязать новое устройство с приложением для генерации OTP‑кода.
-
Вводит OTP‑код и нажимает кнопку «Подтвердить».
-
Тонкий клиент 1С получает (незаметно для пользователя) access token от Keycloak, который содержит информацию о его идентификации.
-
Перенаправляется обратно в информационную базу 1С, к которой он хочет получить доступ, и передает свой маркер доступа.
-
Сервер 1С проверяет подлинность и валидность токена, используя ключи и конечные точки, предоставленные Keycloak.
-
Сервер 1С сопоставляет имя пользователя из маркера доступа с именем пользователя в базе 1С и предоставляет пользователю доступ к ней в соответствии с его правами.
-
Пользователь может работать с базой 1С пока его токен не истечет или не будет отозван.
Преимущества решения
-
Безопасность доступа к 1С, защита от несанкционированного входа с помощью двухфакторной аутентификации.
-
Упрощение управления пользователями, централизация данных авторизации пользователей (логин, пароль, 2fa) в Keycloak. Администратор 1С не сможет отключить использование второго фактора какому‑то пользователю, если ему захочется.
-
Не требуется вносить изменения в конфигурацию информационной базы 1С, использовать внешние обработки и т. п.
-
Совместимость с различными конфигурациями информационных баз 1С. OpenID Connect — это штатный функционал платформы 1С.
-
Применение разных OTP‑приложений на выбор пользователя.
Особенности
-
Требуются дополнительные ресурсы для развертывания и поддержки серверов Keycloak и базы данных PostgreSQL.
-
Дополнительные действия пользователей для ввода OTP‑кода при каждом входе в 1С.
-
Нет поддержки «из коробки» других типов двухфакторной аутентификации, кроме OTP‑кода (SMS, электронная почта, push‑уведомления и т. д.)
-
1С не поддерживает другие протоколы аутентификации, кроме OpenID Connect, такие как SAML, OAuth и т. д.
-
На данный момент (февраль 2024) использование данного сценария возможно, только если клиентские лицензии выдаются кластером 1С (установлены на сервере 1С). Если же клиентская лицензия установлена у пользователя локально, то тонкий клиент не сможет подключиться и получит от сервера сообщение «Невозможно установить сеанс пользователя».(подробнее — в следующей части).
-
По этому поводу зарегистрирована ошибка 70 076 754: https://bugboard.v8.1c.ru/error/000151413. Надеемся, что ее скоро исправят.
Решение проблемы с клиентскими лицензиями 1С при аутентификации через OpenID Connect
При реализации столкнулись с проблемой: если в кластере 1С отсутствуют клиентские лицензии, при попытке авторизации через OpenID Connect возникает ошибка «Невозможно установить сеанс пользователя». Это происходит даже если клиентская лицензия установлена локально и для подключения используется тонкий клиент 1С.
Заказчик использует следующую схему размещения лицензий:
Серверная лицензия 1С размещена на сервере лицензирования, который является выделенным сервером в кластере с сервисом лицензирования. Клиентские лицензии на сервере лицензирования отсутствуют. Клиентские лицензии 1С установлены локально на рабочих местах пользователей.
Пользователи подключаются к информационным базам, опубликованным на веб‑сервере (ws=»https://server/ib»), используя тонкий клиент. При использовании типа «Аутентификация 1С:Предприятия» проблем с подключением не возникало, а на сервере успешно создавались сессии пользователей с клиентской лицензией. При попытке аутентификации через OpenID Connect возникает ошибка «Невозможно установить сеанс пользователя», так как сервер не мог отыскать лицензию.
Мы обратились в поддержку 1С и, как я уже упоминал, проблема была зарегистрирована как ошибка (https://bugboard.v8.1c.ru/error/000 151 413). Временное решение — использовать достаточное количество клиентских лицензий на сервере и в кластере 1С.
Эта ситуация подчеркивает важность наличия клиентских лицензий на сервере для успешной аутентификации через OpenID Connect и может служить уроком для других компаний, сталкивающихся с подобными задачами.
Заключение
Надеемся, что наш опыт будет полезен коллегам, если они столкнутся с подобной задачей в своих проектах, а потенциальные клиенты узнали достаточно о наших способностях и компетенциях в интеграции систем 2FA. Если у вас остались вопросы или вы готовы дополнить материал, мы будем рады вашей обратной связи в комментах.
ссылка на оригинал статьи https://habr.com/ru/articles/799961/
Добавить комментарий