Синхронизируйте данные LDAP с учетной записью GitHub для управления правами доступа пользователей
Github — это провайдер интернет-хостинга для разработки программного обеспечения и контроля версий с использованием Git. Это позволяет нам размещать репозитории git в облаке и управлять контролем доступа к этим репозиториям. К сожалению, нет встроенной интеграции с сервером LDAP в качестве источника авторизационных данных.
В этом посте я представлю некоторые доступные варианты синхронизации данных LDAP с учетной записью GitHub.
Первый вариант: использование существующих инструментов
К счастью, Github опубликовал инструмент для управления синхронизацией данных LDAP. Вы можете установить этот инструмент на организационном уровне как приложение Github. Ниже приведено краткое описание шагов, которые необходимо выполнить, чтобы настроить приложение для успешной синхронизации данных.
- Инструмент должен быть размещен и развернут в вашей инфраструктуре и иметь доступ к вашему серверу LDAP.
- Вам необходимо публично раскрыть API инструмента, чтобы Github мог вызывать URL-адреса веб-перехватчиков.
- Вам нужно создать приложение GitHub.
- Настройте инструмент с помощью параметров приложения Github (идентификатор и закрытый ключ).
- Наконец, вы должны установить созданные приложения в организациях GitHub.
Дополнительную информацию о процессе развертывания приложения можно найти в репозитории GitHub. Это приложение можно развернуть как док-контейнер или модуль Kubernetes. Однако вам необходимо создать собственные образы Docker, чтобы включить закрытый ключ приложения или сопоставить его с помощью тома Docker.
Этот вариант сводит к минимуму усилия, необходимые для синхронизации данных между организациями LDAP и GitHub. Однако у него есть пара недостатков:
- API инструмента должен быть общедоступным.
- Приложение имеет некоторые ограничения. Например, он не отправляет приглашения пользователям.
По этим причинам я решил изучить создание собственного скрипта для синхронизации данных LDAP с Github.
Второй вариант: использование самодельного приложения
Я хотел изучить сложность написания скрипта для синхронизации данных на данном этапе. Ниже приведено краткое описание исходных требований приложения.
- Сценарий должен отправлять приглашения пользователей как организациям, так и командам.
- Сценарий должен удалять пользователей из организаций, если они не существуют в LDAP.
- Скрипт должен управлять командами и членами команды.
- Пользователи структурированы в LDAP с использованием организационных единиц, как показано ниже.
Первый шаг. Разверните сервер LDAP.
Источником правды для команд и разрешений является сервер LDAP. Поэтому нам нужно развернуть сервер LDAP с ожидаемой структурой. Мы можем быстро решить эту задачу с помощью docker-контейнеров и docker-compose. Вы можете следовать приведенным ниже инструкциям, чтобы развернуть сервер локально.
В этом сообщении блога содержится дополнительная информация о создании образов докеров LDAP.
Сначала сохраните приведенный ниже фрагмент в файле docker-compose с именем. docker-compose.yaml
Затем разверните сервер LDAP локально с помощью следующей команды:
$> docker-compose up -d
После развертывания служб сервер LDAP будет доступен по следующему URL-адресу: https://127.0.0.1:389
.
Кроме того, вы сможете просматривать сервер LDAP, просматривать его ресурсы и создавать новые, подключившись к следующему URL-адресу https://127.0.0.1:8090
.
- Имя пользователя:
cn=admin,dc=shihadeh,dc=intern
. - Пароль:
test1234
.
Второй шаг, связь с сервером LDAP
Поскольку сервер LDAP является источником информации, нам необходимо связаться с сервером и получить от него необходимые данные. Большинство языков программирования имеют клиентские библиотеки LDAP, упрощающие взаимодействие разработчиков с LDAP.
Я начал искать клиентскую библиотеку LDAP, написанную на Ruby (поскольку я планирую написать приложение на Ruby), и нашел пару жемчужин Ruby:
NET::LDAP
: Клиентский доступ LDAP для LDAP. Он предоставляет низкоуровневый интерфейс для сервера LDAP.Activeldap
: Ruby-библиотека для объектно-ориентированного интерфейса LDAP. Он использует theNET::LDAP
gem для предоставления объектно-ориентированного интерфейса для сервера LDAP.
Я решил использовать гем Activeldap
, потому что он проще.
После установки библиотеки мне нужно было начать писать код, чтобы использовать библиотеку для подключения к LDAP. Есть три основных раздела, которые мне нужно было реализовать
- Включите все необходимые зависимости для библиотеки. В данном случае это только
NET::LDAP
иActiveldap
. Я включил библиотекуNET::LDAP
, так как она зависит от библиотекиActiveldap
. - Для связи с сервером LDAP нам необходимо создать объект подключения, используемый моделями для запроса данных LDAP. Вам необходимо указать конфигурацию LDAP для метода
ActiveLdap::Base.setup_connection
, чтобы иметь возможность установить соединение. - Определите необходимые модели данных LDAP. Библиотека
Activeldap
позволяет нам определять модели данных, а затем использовать определенные модели для запросов к LDAP объектно-ориентированным способом.
Чтобы определить модель данных, вам нужно создать класс из базового класса ActiveLdap::Base
. Затем вам нужно указать следующие элементы в классе модели.
ldap_mapping
: Это единственный обязательный метод, который необходимо определить для каждого класса модели. Вы можете использовать этот метод, чтобы указать, как класс модели относится к связанному объекту LDAP.has_many
: Этот метод можно использовать для определения связи между классами модели, когда один класс имеет множество объектов из другого класса. Например, объект командного класса будет иметь больше пользовательских объектов.belongs_to
:Этот метод можно использовать для определения связи между классами модели в обратном порядке. Например, пользователь принадлежит к одной или нескольким командам.
Вы можете найти больше информации о том, как определить модули данных на официальной странице для Activeldap.
Ниже приведен полный сценарий, который я написал для определения моделей данных и связи с сервером LDAP.
Третий шаг, обновление организации GitHub
Как и LDAP, Github API имеет клиентские библиотеки ruby, которые разработчики могут использовать для взаимодействия с API. Библиотека Octokit — одна из лучших клиентских библиотек Github API.
К сожалению, эта библиотека не поддерживает отправку приглашений для организации. Однако, поскольку я использую Ruby, существующие библиотеки легко расширить. Поэтому моей первой задачей было расширить библиотеку Октокит, поддерживая создание приглашений организаций. К счастью, Github API предоставляет метод POST для приглашения пользователей в организацию. Я реализовал приведенную ниже функцию для расширения функционала библиотеки Octokit и поддержки отправки приглашений пользователям.
Далее мне нужно было создать личный токен в учетной записи Github и настроить библиотеку Octokit для использования токена для связи с Github. Фрагмент ниже показывает, как настроить библиотеку Octokit с токеном Github и создать клиентский объект.
На этом этапе мне удалось определить модели LDAP для создания клиента Github API, и пришло время приступить к реализации бизнес-логики для приложения синхронизации.
Первая функция, которую я хотел реализовать, — это синхронизация пользователей во всех организациях из LDAP в учетную запись GitHub. Я выполнил эту задачу, выполнив следующий алгоритм.
- Перебрать все организации LDAP.
- Получить всех пользователей, определенных в LDAP, и всех пользователей, указанных в учетной записи GitHub для каждой организации.
- Сравните пользователей LDAP и пользователей GitHub.
- Отправьте приглашение организации для пользователей LDAP, которые еще не являются пользователями GitHub.
- Удалите пользователей Github, у которых больше нет учетной записи LDAP.
В приведенном ниже фрагменте показан код ruby, используемый для реализации алгоритма синхронизации.
Следующая функция — синхронизировать команды GitHub и их участников. Эта задача более сложная, чем первая, поскольку для ее выполнения необходимо выполнить следующие действия:
- Создавайте команды на Github для каждой команды, определенной в LDAP.
- Удалите команды Github, если у них больше нет связанного объекта команды LDAP.
- Обновите команды Github на основе данных LDAP.
Я написал приведенный ниже фрагмент кода, чтобы реализовать необходимые функции синхронизации. Код следует приведенным ниже шагам для синхронизации LDAP и GitHub.
- Перебрать все организации, определенные в LDAP.
- Подсчитайте команды, которые необходимо добавить на GitHub, и команды, которые необходимо удалить.
- Обновите команды GitHub.
- Перебрать все команды Github для выбранной организации.
- Подсчитайте участников, которых необходимо добавить в команду, и тех, кого необходимо удалить.
- Обновите членов команды GitHub.
Заключение
Хотя Github не поддерживает встроенную интеграцию с серверами LDAP в качестве источника членов и команд организации, можно синхронизировать LDAP и Github.
Вы можете либо использовать одно из существующих на рынке приложений, например G itHub Team Sync, либо внедрить новое приложение для синхронизации данных с использованием клиентских библиотек LDAP и GitHub.