Привет, Хабр!
Как-то раз в нашей работе встретилась необходимость провести интеграцию сканера безопасности 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.
Дальше я расскажу, как мы подключали чистый AD к Netsparker при помощи промежуточного инструмента Keycloak. Ниже будет представлен самый базовый вариант, так как в каждой организации процесс будет отличаться.
Общая схема выглядит так:
Существует как минимум два режима работы. В первом режиме база пользователей AD синхронизируется с базой пользователей Keycloak, и система аутентификации Keycloak используется для разрешения доступа пользователям в Netsparker. Во втором режиме Keycloak берет на себя непосредственно аутентификацию пользователя в AD без сохранения данных пользователей в своей базе. При этом, если необходимо, можно вести базу пользователей (например которых нет в AD) дополнительно и в Keycloak.
Для того чтобы аутентификация в Netsparker была возможна, необходимо чтобы именем пользователя являлся его email-адрес. Это связано с особенностями пользовательской базы данных Netsparker, где каждая учетная запись определяется ее email-адресом. Знание этой особенности нам потребуется дальше.
Приступим.
Экспорт конфигурации Netsparker SSO
Первый шаг. Чтобы включить Single Sign-On в Netsparker необходимо сделать следующее:
Войти в Netsparker под административным пользователем и открыть Settings → Single Sign-On.
Поставить флажок Enable для включения поддержки SSO.
(!) Опция Enforce to authenticate ... нужна для того, чтобы запретить пользователям без прав администратора вход напрямую в Netsparker с использованием пароля.
Остальные поля мы заполним чуть позже данными из Keycloak.
После включения функции SSO на странице входа в Netsparker появится дополнительная ссылка для доступа через внешний сервис.
Вот так это будет выглядеть для неаутентифицированного пользователя:Справа на закладке SAML скачиваем базовый XML с метаданными Netsparker.
Этот XML содержит настройки SAML-клиента (в нашем случае им является Netsparker), которые понадобятся для конфигурирования Keycloak, например Client Identifier, SAML Service URL.
На данном этапе с Netsparker'ом всё. Переходим в Keycloak.
Конфигурация Keycloak
Заходим в панель администратора Keycloak и создаем новый Realm с названием, например, «Netsparker».
Realm — это раздел, в котором будет храниться вся конфигурация, касающаяся конкретно нашего приложения (Netsparker), включая настройки синхронизации с AD, собственная база пользователей и т. п.Теперь необходимо в этом Realm прописать нашего клиента (Netsparker), который будет пользоваться услугами Keycloak.
Переходим на закладку Clients, нажимаем Create, импортируем XML, который сохранили из Netsparker.Данные формы подгрузятся из файла, поэтому нажимаем Save.
В открывшемся экране настроек клиента сразу сохраняем себе в блокнот данные сертификата (закладка SAML Keys).
Возвращаемся на закладку Settings и вносим следующие изменения:
Client Signature Required ставим в положение OFF, т. к. Netsparker пока не передает данные о своем алгоритме подписи, и поэтому SAML-запрос получается некорректным.
Valid Redirect URIs — модифицируем URL и заменяем часть строки адреса ?spid на *. Это поле задает шаблон для адресов, на которые Keycloak разрешено осуществлять перенаправление браузера. Это сделано для того, чтобы злоумышленник не мог подставить адрес подконтрольного ему сервиса.
Остальные параметры для тестовой интеграции пока можно не трогать. Мы к ним вернемся, когда будем конфигурировать авто-добавление пользователей.Нажимаем Save и возвращаемся в Netsparker.
Конфигурация Netsparker
Теперь на стороне сканера добавляем данные о провайдере аутентификационных данных (сокращенно IdP), в нашем случае это Keycloak.
Донастроим то, что мы начали настраивать на первых шагах.
Снова открываем страницу 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.Сохраняем конфигурацию, и на данный момент у нас уже есть базовая возможность пользоваться аутентификацией Keycloak.
При нажатии на Sign in via your Identity Provider открывается промежуточная форма ввода email пользователя из Netsparker, из которой уже осуществляется переход на форму входа Keycloak. Пользовательские данные, вводимые на этой форме либо проверяются в базе пользователей Keycloak, либо прокидываются дальше на AD (мы посмотрим оба варианта).
После успешного входа в Keycloak нас должно перенаправить обратно в Netsparker уже в аутентифицированном состоянии.
Но чтобы это произошло, надо сперва сконфигурировать пользователей.
Создание пользователей вручную
Netsparker
Для начала заведем тестового пользователя в Netsparker для проверки интеграции.
В Netsparker открываем Team → New Team Member, заполняем поля Name, Email и проставляем какие-нибудь разрешения (те, что на снимке, выбраны просто для примера):
Активируем пользователя, кликнув на код подтверждения на странице Invitations.
На открывшейся странице вводим пароль для созданного пользователя и нажимаем Create an account.
Этот пароль будет использоваться, только если пользователь решит войти в Netsparker не через SSO, а через обычную форму входа:
Keycloak
На данный момент войти в Netsparker через SSO не получится, т. к. в базе Keycloak в нашем Realm еще нет ни одного пользователя и Keycloak не сможет его аутентифицировать.
Исправим это:
Заходим в Keycloak → Manage → Users, нажимаем Add user, вводим данные пользователя и сохраняем:
Здесь важно указать Username в виде email-адреса и поставить Email Verified в положение On, чтобы можно было бесшовно перейти от Keycloak к Netsparker.
После сохранения появляется страница деталей пользователя. На ней в закладке Credentials необходимо установить пароль этому пользователю. Он при необходимости может отличаться от пароля в Netsparker:
Ставим Temporary в положение Off и устанавливаем пароль.
Промежуточная проверка интеграции
Теперь можем убедиться, что наша интеграция Netsparker+Keycloak работает:
Открываем страницу входа в Netsparker и выбираем Sign in via your Identity Provider.
Вводим почтовый адрес нашего тестового пользователя и попадаем на страницу входа в Keycloak.
Указываем аутентификационные данные созданного пользователя.
Если всё прошло успешно, Keycloak перенаправит нас на главную страницу Netsparker под нашим тестовым пользователем.
Промежуточный итог
Итак, на данный момент у нас есть возможность входить в Netsparker, вводя данные пользователя в Keycloak. Следующий шаг и реализация начальной цели — связать аутентификацию Netsparker c аутентификацией на AD. При необходимости мы также можем синхронизировать базу данных пользователей Keycloak с базой Active Directory.
Дорога в AD
Теперь сделаем следующий шаг и настроим аутентификацию пользователей Active Directory через Keycloak по LDAP. Для этого нам потребуется функция User Federation.
Открываем Keycloak → User Federation и в списке провайдеров выбираем ldap.
Дальше настройка может отличаться в зависимости от конкретной структуры 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, поэтому настройки должны выглядеть так, как представлено на экране в следующем шаге.
Дальше необходима небольшая манипуляция с данными из AD. Так как Netsparker требует в качестве имени пользователя его email-адрес (помните ремарку в начале?), нам надо убедиться, что во-первых из AD придут только пользователи с почтовым адресом и, во-вторых, что имя пользователя будет содержать этот адрес, а не иной параметр.
Поэтому следующим шагом мы прописываем фильтр пользователей AD, который выберет только сущности каталога с email. Дальше мы явно укажем, какой атрибут у нас будет служить именем пользователя:
Custom User LDAP Filter:
(&(objectCategory=person)(mail=*)(objectClass=user))
.
Username LDAP attribute:mail
.Сохраняем форму, и в итоге наш экран настройки должен выглядеть так:
Теперь сделаем так, чтобы при синхронизации пользователей AD они автоматически получали email в качестве имени пользователя. Для этого открываем закладку Mappers:
И в mapper’е Username заменяем атрибут «cn» на «mail».
Сохраняем настройки.
(!) Если мы настраивали синхронизацию базы Keycloak с AD, мы можем проверить эту настройку, нажав Synchronize all users. Если всё прошло успешно, то на вкладке Users у нас появятся наши пользователи из AD'a :)
Проверяем, что всё работает
Можем убедиться, что наша настройка верна, войдя под учётной записью из AD в Netsparker.
Проверяем, что в Netsparker есть пользователь с таким почтовым адресом (Manage Team). Какой у него пароль — неважно, так как аутентификация будет происходить на стороне AD.
Открываем страницу Netsparker SSO и вводим email-адрес пользователя AD.
На странице входа Keycloak вводим данные пользователя AD с паролем.
Нам должна открыться страница Netsparker для этого пользователя.
Настройка автоматического создания пользователей
Вручную заводить новых пользователей зачастую неудобно, поэтому в Netsparker есть возможность упростить заведение новых учётных записей, которая называется auto provisioning. С ее помощью устраняется необходимость вручную добавлять нового пользователя: если его нет в базе данных Netsparker, то такой пользователь будет создан автоматически при попытке входа с верными данными своей учётной записи AD.
Дальше нам будет необходимо сделать небольшие изменения в конфигурациях Keycloak и Netsparker. Так как auto provisioning требует, чтобы сессия инициировалась Identity Provider'ом, давайте его и настроим:
Keycloak
Открываем настройки нашего клиента Keycloak → Clients → наш клиент.
Нам потребуется внести изменения в три поля:
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.Сохраняем настройки.
Настройка mappers
Чтобы Keycloak формировал SAML-запрос в виде, необходимом Netsparker'у, необходимо добавить в него несколько обязательных полей (FirstName и LastName). В этом нам поможет mapper, который автоматически назначит полям SAML соответствующие поля из пользовательской записи.
Для этого открываем Keycloak → Clients → Mappers и создаем mapper, нажав на Create.
Содержимое полей mapper задаем как на картинке ниже:
Аналогично создаём mapper для фамилии:
Итоговый список должен выглядеть так:
Netsparker
Последнее, что нам нужно сделать — донастроить Netsparker, чтобы он создавал пользователей и принимал запросы на это действие от Keycloak.
Открываем Netsparker → Settings → Single Sign-On.
В поле SAML 2.0 Endpoint указываем URL из Keycloak из подсказки поля IDP Initiated SSO URL.
Выбираем опцию Enable Auto Provisioning и сохраняем настройки.
Финальная проверка
Теперь проверим как это всё работает.
Прежде всего теперь на странице Netsparker → Team можем удалить пользователя AD, которого мы создавали вручную.
В Keycloak завершаем все сессии, чтобы они нам не мешали: Keycloak → Manage → Sessions → Logout all.
Открываем страницу Keycloak для SSO (напомню, Target IDP initiated SSO URL — это ссылка вида:
https://yourdomain.com/auth/realms/netsparker/protocol/saml/clients/netsparker).Вводим данные пользователя из AD.
Если всё прошло успешно, в Netsparker будет создан соответствующий пользователь с минимальными правами и для него будет установлена новая сессия.
Что дальше?
Если был выбран вариант с синхронизацией баз AD и Keycloak — рекомендуется сразу же включить в настройках Keycloak периодическую синхронизацию, чтобы данные всегда были актуальны.
Если была выбрана опция auto provisioning, необходимо от имени административного пользователя выдать необходимые разрешения созданному пользователю, чтобы тот мог работать с Netsparker.
Для простоты лучше первый раз для создания пользователя входить через Target IDP initiated SSO URL и уже впоследствии аутентифицироваться либо по этому же URL, либо осуществлять вход через привычную страницу Netsparker Login.
Еще один нюанс — в данный момент выход пользователя из Netsparker не приводит к выходу пользователя из Keycloak. Поэтому, когда в следующий раз мы решим войти при помощи SSO, нас сразу перебросит в Netsparker под последним аутентифицированным пользователем. Это можно решить, например, уменьшив длительность сессии пользователя в Keycloak. Тогда его SSO-сессия будет автоматически уничтожена после указанного промежутка времени.
Настройка осуществляется в Realms → Netsparker → Tokens:
Также пользователь может вручную закончить свою сессию на собственной странице учётной записи Keycloak по ссылке вида: https://keycloak.yourcompany.com/auth/realms/netsparker/account
После этого для входа в Netsparker потребуется снова аутентифицироваться в Keycloak и можно будет осуществить вход под другим пользователем.
Заключение
Мы рассмотрели в деталях, как можно аутентифицировать пользователей Netsparker через Active Directory с использованием промежуточного решения Keycloak. В принципе, такой же процесс может быть применён и для других приложений, которые не работают с Active Directory напрямую, но поддерживают SAML для описания деталей аутентификации.
Keycloak позволяет достаточно гибко настраивать и дополнять систему аутентификации, комплексно закрывая этот аспект безопасности для приложений, используемых в организации.