Привет, Хабр!

Как-то раз в нашей работе встретилась необходимость провести интеграцию сканера безопасности Netsparker и службы каталогов Active Directory. В этой статье я поделюсь инструкцией о том, как можно это сделать и на что стоит обратить внимание при настройке.

Забегая вперед, стоит отметить, что аналогичные шаги помогут настроить интеграцию с AD не только Netsparker, но и иных приложений, которые не имеют собственных средств взаимодействия с Active Directory.

Netsparker — это коммерческий динамический сканер веб-приложений, который позволяет обнаруживать большое количество уязвимостей в реальном времени и при этом располагает широким набором средств для интеграции с различными инструментами разработки и сборки. Это позволяет осуществлять поиск уязвимостей еще до того, как приложение выходит в производственную среду.
Подробнее: https://www.netsparker.com/

Keycloak — решение с открытым кодом, которое способно выступать промежуточным звеном между приложением и сторонним аутентификационным сервисом. Это часто необходимо в случаях, если требования к аутентификации превосходят возможности приложения или имеющаяся инфраструктура позволяет сделать бесшовную аутентификацию между всеми используемыми сервисами (SSO).
Keycloak позволяет интегрировать ваши приложения с внешними системами аутентификации пользователей, может выступать в качестве посредника для использования social login сервисов и многое другое.
Подробнее: https://www.keycloak.org/

Проблема

По умолчанию в Netsparker есть несколько вариантов внедрения Single Sign-On: с Google Cloud, PingIdentity, Okta, Azure AD, ADFS, а также базовая интеграция при помощи SAML2.0.

В случаях, когда нет возможности использования вышеприведенных вариантов (например не разрешается применять ADFS, но тем не менее требуется интеграция с AD) можно использовать базовый вариант с SAML.

Проблема: Netsparker не работает напрямую с AD
Проблема: Netsparker не работает напрямую с AD

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

Общая схема выглядит так:

Схема интеграции Netsparker с AD через Keycloak
Схема интеграции Netsparker с AD через Keycloak

Существует как минимум два режима работы. В первом режиме база пользователей AD синхронизируется с базой пользователей Keycloak, и система аутентификации Keycloak используется для разрешения доступа пользователям в Netsparker. Во втором режиме Keycloak берет на себя непосредственно аутентификацию пользователя в AD без сохранения данных пользователей в своей базе. При этом, если необходимо, можно вести базу пользователей (например которых нет в AD) дополнительно и в Keycloak.

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

Приступим.

Экспорт конфигурации Netsparker SSO

Первый шаг. Чтобы включить Single Sign-On в Netsparker необходимо сделать следующее:

  1. Войти в Netsparker под административным пользователем и открыть Settings > Single Sign-On.

  2. Поставить флажок Enable для включения поддержки SSO.
    (!) Опция Enforce to authenticate ... нужна для того, чтобы запретить пользователям без прав администратора вход напрямую в Netsparker с использованием пароля.
    Остальные поля мы заполним чуть позже данными из Keycloak.

    Экран настройки Netsparker SSO
    Экран настройки Netsparker SSO


    После включения функции SSO на странице входа в Netsparker появится дополнительная ссылка для доступа через внешний сервис.
    Вот так это будет выглядеть для неаутентифицированного пользователя:

    Экран входа в Netsparker для неаутентифицированного пользователя
    Экран входа в Netsparker для неаутентифицированного пользователя

     

  3. Справа на закладке SAML скачиваем базовый XML с метаданными Netsparker.
    Этот XML содержит настройки SAML-клиента (в нашем случае им является Netsparker), которые понадобятся для конфигурирования Keycloak, например Client Identifier, SAML Service URL.

    Сохранение SAML мета-данных Netsparker
    Сохранение SAML мета-данных Netsparker

На данном этапе с Netsparker'ом всё. Переходим в Keycloak.

Конфигурация Keycloak

  1. Заходим в панель администратора Keycloak и создаем новый Realm с названием, например, «Netsparker».
    Realm — это раздел, в котором будет храниться вся конфигурация, касающаяся конкретно нашего приложения (Netsparker), включая настройки синхронизации с AD, собственная база пользователей и т. п.

    Экран добавления Realm'а
    Экран добавления Realm'а
  2. Теперь необходимо в этом Realm прописать нашего клиента (Netsparker), который будет пользоваться услугами Keycloak.
    Переходим на закладку Clients, нажимаем Create, импортируем XML, который сохранили из Netsparker.

    Экран добавления клиента Keycloak
    Экран добавления клиента Keycloak

    Данные формы подгрузятся из файла, поэтому нажимаем Save.

  3. В открывшемся экране настроек клиента сразу сохраняем себе в блокнот данные сертификата (закладка SAML Keys).

    Данные сертификата клиента Keycloak
    Данные сертификата клиента Keycloak
  4. Возвращаемся на закладку Settings и вносим следующие изменения:

    Client Signature Required ставим в положение OFF, т. к. Netsparker пока не передает данные о своем алгоритме подписи, и поэтому SAML-запрос получается некорректным.
    Valid Redirect URIs — модифицируем URL и заменяем часть строки адреса ?spid на *. Это поле задает шаблон для адресов, на которые Keycloak разрешено осуществлять перенаправление браузера. Это сделано для того, чтобы злоумышленник не мог подставить адрес подконтрольного ему сервиса.

    Настройки клиента Keycloak
    Настройки клиента Keycloak


    Остальные параметры для тестовой интеграции пока можно не трогать. Мы к ним вернемся, когда будем конфигурировать авто-добавление пользователей.

  5. Нажимаем Save и возвращаемся в Netsparker.

Конфигурация Netsparker

Теперь на стороне сканера добавляем данные о провайдере аутентификационных данных (сокращенно IdP), в нашем случае это Keycloak.

  1. Донастроим то, что мы начали настраивать на первых шагах.
    Снова открываем страницу Netsparker > Settings > Single Sign-On и прописываем идентификатор IdP и URL для SAML-запросов.

    У Keycloak эти значения стандартные:
    IdP Identifier:
    https://<домен-где-установлен-Keycloak>/auth/realm/<наш-Realm>
    SAML Endpoint:
    https://<домен-где-установлен-Keycloak>>/auth/realms/<наш-Realm>/protocol/saml
    X.509 Certificate:
    Сертификат в base64, который мы сохранили из Keycloak.

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

    При нажатии на Sign in via your Identity Provider открывается промежуточная форма ввода email пользователя из Netsparker, из которой уже осуществляется переход на форму входа Keycloak. Пользовательские данные, вводимые на этой форме либо проверяются в базе пользователей Keycloak, либо прокидываются дальше на AD (мы посмотрим оба варианта).

    После успешного входа в Keycloak нас должно перенаправить обратно в Netsparker уже в аутентифицированном состоянии.

    Процесс входа в Netsparker
    Процесс входа в Netsparker


    Но чтобы это произошло, надо сперва сконфигурировать пользователей.

Создание пользователей вручную

Netsparker

Для начала заведем тестового пользователя в Netsparker для проверки интеграции.

  1. В Netsparker открываем Team > New Team Member, заполняем поля Name, Email и проставляем какие-нибудь разрешения (те, что на снимке, выбраны просто для примера):

    Экран создания пользователей в Netsparker
    Экран создания пользователей в Netsparker

     

  2. Активируем пользователя, кликнув на код подтверждения на странице Invitations.

    Список "приглашенных" пользователей
    Список "приглашенных" пользователей

     

  3. На открывшейся странице вводим пароль для созданного пользователя и нажимаем Create an account.
    Этот пароль будет использоваться, только если пользователь решит войти в Netsparker не через SSO, а через обычную форму входа:

    Экран регистрации нового пользователя Netsparker
    Экран регистрации нового пользователя Netsparker

Keycloak

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

Исправим это:

  1. Заходим в Keycloak > Manage > Users, нажимаем Add user, вводим данные пользователя и сохраняем:

    Экран добавления пользователя в Keycloak
    Экран добавления пользователя в Keycloak

    Здесь важно указать Username в виде email-адреса и поставить Email Verified в положение On, чтобы можно было бесшовно перейти от Keycloak к Netsparker.

  2. После сохранения появляется страница деталей пользователя. На ней в закладке Credentials необходимо установить пароль этому пользователю. Он при необходимости может отличаться от пароля в Netsparker:

    Создание пароля для пользователя Keycloak
    Создание пароля для пользователя Keycloak

    Ставим Temporary в положение Off и устанавливаем пароль.

Промежуточная проверка интеграции

Теперь можем убедиться, что наша интеграция Netsparker+Keycloak работает:

  1. Открываем страницу входа в Netsparker и выбираем Sign in via your Identity Provider.

  2. Вводим почтовый адрес нашего тестового пользователя и попадаем на страницу входа в Keycloak.

  3. Указываем аутентификационные данные созданного пользователя.

    Экран входа в Keycloak
    Экран входа в Keycloak
  4. Если всё прошло успешно, Keycloak перенаправит нас на главную страницу Netsparker под нашим тестовым пользователем.

    Перенаправление из Keycloak в Netsparker
    Перенаправление из Keycloak в Netsparker
    Основной экран сканера Netsparker
    Основной экран сканера Netsparker

     

Промежуточный итог
Итак, на данный момент у нас есть возможность входить в Netsparker, вводя данные пользователя в Keycloak. Следующий шаг и реализация начальной цели — связать аутентификацию Netsparker c аутентификацией на AD. При необходимости мы также можем синхронизировать базу данных пользователей Keycloak с базой Active Directory.

Следующий этап настройки: Keycloak + AD
Следующий этап настройки: Keycloak + AD

Дорога в AD

Теперь сделаем следующий шаг и настроим аутентификацию пользователей Active Directory через Keycloak по LDAP. Для этого нам потребуется функция User Federation.

  1. Открываем Keycloak > User Federation и в списке провайдеров выбираем ldap.

    Выбор провайдера аутентификации в Keycloak
    Выбор провайдера аутентификации в Keycloak
  2. Дальше настройка может отличаться в зависимости от конкретной структуры AD, но я опишу на базовом примере, что нам потребуется.

    В окне Add user federation provider заполняем поля:
    Vendor: Active Directory.
    Connection URL: путь к вашему серверу.
    Например ldap://172.16.2.23:389.
    Users DN: путь навигации к записям пользователя.
    Например CN=Users,DC=cx,DC=local.
    Bind DN: путь к записи администратора AD.
    Например cn=cxadmin,cn=users,dc=cx,dc=local.
    Bind Credential: пароль учетной записи администратора.
    Например ваш валидный пароль :)

    (!) Если мы хотим, чтобы данные из AD сперва синхронизировались в локальную базу Keycloak, ставим переключатель Import User в положение On.

    Опция импортирования пользователей
    Опция импортирования пользователей

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

  3. Дальше необходима небольшая манипуляция с данными из AD. Так как Netsparker требует в качестве имени пользователя его email-адрес (помните ремарку в начале?), нам надо убедиться, что во-первых из AD придут только пользователи с почтовым адресом и, во-вторых, что имя пользователя будет содержать этот адрес, а не иной параметр.

    Поэтому следующим шагом мы прописываем фильтр пользователей AD, который выберет только сущности каталога с email. Дальше мы явно укажем, какой атрибут у нас будет служить именем пользователя:

    Custom User LDAP Filter: (&(objectCategory=person)(mail=*)(objectClass=user)).
    Username LDAP attribute: mail.

    Сохраняем форму, и в итоге наш экран настройки должен выглядеть так:

    Сводная страница настроек LDAP провайдера
    Сводная страница настроек LDAP провайдера
  4. Теперь сделаем так, чтобы при синхронизации пользователей AD они автоматически получали email в качестве имени пользователя. Для этого открываем закладку Mappers:

    Настройка mapper'ов
    Настройка mapper'ов

    И в mapper’е Username заменяем атрибут «cn» на «mail».

    Настройка отображения email адреса на имя пользователя
    Настройка отображения email адреса на имя пользователя
  5. Сохраняем настройки.

(!) Если мы настраивали синхронизацию базы Keycloak с AD, мы можем проверить эту настройку, нажав Synchronize all users. Если всё прошло успешно, то на вкладке Users у нас появятся наши пользователи из AD'a :)

Проверяем, что всё работает

Можем убедиться, что наша настройка верна, войдя под учётной записью из AD в Netsparker.

  1. Проверяем, что в Netsparker есть пользователь с таким почтовым адресом (Manage Team). Какой у него пароль — неважно, так как аутентификация будет происходить на стороне AD.

    Искомый пользователь Netsparker
    Искомый пользователь Netsparker
  2. Открываем страницу Netsparker SSO и вводим email-адрес пользователя AD.

    Промежуточный экран входа в Netsparker SSO
    Промежуточный экран входа в Netsparker SSO
  3. На странице входа Keycloak вводим данные пользователя AD с паролем.

    Экран входа в Keycloak
    Экран входа в Keycloak
  4. Нам должна открыться страница Netsparker для этого пользователя.

    Основной экран Netsparker для аутентифицированного AD-пользователя Alex
    Основной экран Netsparker для аутентифицированного AD-пользователя Alex

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

Вручную заводить новых пользователей зачастую неудобно, поэтому в Netsparker есть возможность упростить заведение новых учётных записей, которая называется auto provisioning. С ее помощью устраняется необходимость вручную добавлять нового пользователя: если его нет в базе данных Netsparker, то такой пользователь будет создан автоматически при попытке входа с верными данными своей учётной записи AD.

Дальше нам будет необходимо сделать небольшие изменения в конфигурациях Keycloak и Netsparker. Так как auto provisioning требует, чтобы сессия инициировалась Identity Provider'ом, давайте его и настроим:

Keycloak

  1. Открываем настройки нашего клиента Keycloak > Clients > наш клиент.

  2. Нам потребуется внести изменения в три поля:
    Valid Redirect URIs (опционально): можно оставить как было, а можно ограничить перенаправление конкретным клиентом (который задаётся параметром spid). Для этого копируем из настроек SSO Netsparke'а полный URL SAML 2.0 Service URL.
    IDP Initiated SSO URL: необходимо задать URL, который мы хотим использовать для нашего конкретного клиента (Netsparker), чтобы явно указать, что должно использоваться SSO, вызываемое со стороны IdP. Например netsparker. После этого пользователи смогут входить конкретно в Netsparker, используя URL из подсказки.
    Assertion Consumer Service POST Binding URL: URL, куда Keycloak будет отправлять SAML-данные для входа в Netsparker. Указываем здесь SAML 2.0 Service URL из настроек Netsparker'a.

    Дополнительная настройка клиента Keycloak
    Дополнительная настройка клиента Keycloak
  3. Сохраняем настройки.

Настройка mappers

Чтобы Keycloak формировал SAML-запрос в виде, необходимом Netsparker'у, необходимо добавить в него несколько обязательных полей (FirstName и LastName). В этом нам поможет mapper, который автоматически назначит полям SAML соответствующие поля из пользовательской записи.

Для этого открываем Keycloak > Clients > Mappers и создаем mapper, нажав на Create.

Дополнительная настройка mapper'ов
Дополнительная настройка mapper'ов

Содержимое полей mapper задаем как на картинке ниже:

Настройка SAML-mapper'а для имени пользователя
Настройка SAML-mapper'а для имени пользователя

Аналогично создаём mapper для фамилии:

Настройка SAML-mapper'а для фамилии пользователя
Настройка SAML-mapper'а для фамилии пользователя

Итоговый список должен выглядеть так:

Список mapper'ов
Список mapper'ов

Netsparker

Последнее, что нам нужно сделать — донастроить Netsparker, чтобы он создавал пользователей и принимал запросы на это действие от Keycloak.

  1. Открываем Netsparker > Settings > Single Sign-On.

  2. В поле SAML 2.0 Endpoint указываем URL из Keycloak из подсказки поля IDP Initiated SSO URL.

  3. Выбираем опцию Enable Auto Provisioning и сохраняем настройки.

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

Финальная проверка

Теперь проверим как это всё работает.

  1. Прежде всего теперь на странице Netsparker > Team можем удалить пользователя AD, которого мы создавали вручную.

    Удаление пользователя
    Удаление пользователя

     

  2. В Keycloak завершаем все сессии, чтобы они нам не мешали: Keycloak > Manage > Sessions > Logout all.

  3. Открываем страницу Keycloak для SSO (напомню, Target IDP initiated SSO URL — это ссылка вида:
    https://yourdomain.com/auth/realms/netsparker/protocol/saml/clients/netsparker).

  4. Вводим данные пользователя из AD.

  5. Если всё прошло успешно, в Netsparker будет создан соответствующий пользователь с минимальными правами и для него будет установлена новая сессия.

    Основной экран Netsparker для пользователя, автоматически созданного при входе через AD
    Основной экран Netsparker для пользователя, автоматически созданного при входе через AD

Что дальше?

Если был выбран вариант с синхронизацией баз AD и Keycloak — рекомендуется сразу же включить в настройках Keycloak периодическую синхронизацию, чтобы данные всегда были актуальны.

Если была выбрана опция auto provisioning, необходимо от имени административного пользователя выдать необходимые разрешения созданному пользователю, чтобы тот мог работать с Netsparker.

Для простоты лучше первый раз для создания пользователя входить через Target IDP initiated SSO URL и уже впоследствии аутентифицироваться либо по этому же URL, либо осуществлять вход через привычную страницу Netsparker Login.

Еще один нюанс — в данный момент выход пользователя из Netsparker не приводит к выходу пользователя из Keycloak. Поэтому, когда в следующий раз мы решим войти при помощи SSO, нас сразу перебросит в Netsparker под последним аутентифицированным пользователем. Это можно решить, например, уменьшив длительность сессии пользователя в Keycloak. Тогда его SSO-сессия будет автоматически уничтожена после указанного промежутка времени.
Настройка осуществляется в Realms > Netsparker > Tokens:

Настройка длительности SSO сессии
Настройка длительности SSO сессии

Также пользователь может вручную закончить свою сессию на собственной странице учётной записи Keycloak по ссылке вида: https://keycloak.yourcompany.com/auth/realms/netsparker/account
После этого для входа в Netsparker потребуется снова аутентифицироваться в Keycloak и можно будет осуществить вход под другим пользователем.

Заключение

Мы рассмотрели в деталях, как можно аутентифицировать пользователей Netsparker через Active Directory с использованием промежуточного решения Keycloak. В принципе, такой же процесс может быть применён и для других приложений, которые не работают с Active Directory напрямую, но поддерживают SAML для описания деталей аутентификации.
Keycloak позволяет достаточно гибко настраивать и дополнять систему аутентификации, комплексно закрывая этот аспект безопасности для приложений, используемых в организации.