
Программирование Active Directory с помощью Python - Flask API
Введение
В современном мире Active Directory широко используется в ИТ-индустрии для безопасного связывания людей с такими ресурсами, как компьютеры в организации. В этом документе я собираюсь подробно описать свои эксперименты с Active Directory с точки зрения программиста и администратора Active Directory. Я играл роль администратора Active Directory, выполняя многочисленные настройки для тестирования написанных мной API для доступа к Active Directory.
Задача
Active Directory - это продукт Microsoft, доступ к которому обычно осуществляется и который программируется с использованием технологий Microsoft. Однако мы хотели подключиться и запросить Active Directory, используя технологии с открытым исходным кодом, такие как Python - Flask API в Ubuntu 18.04. Это был несколько необычный путь развития, а значит, более интересный!
Для тестирования работы мы решили использовать инстансы AWS - облако оказалось наиболее экономичным и наименее затратным по времени вариантом, когда требовалось выполнить настройку по принципу «тестируй и ломай». По мере того, как вы продолжаете читать, вы можете видеть ценность этого решения. Мы сделали несколько настроек для тестирования, которые вы увидите по мере прочтения.
Топология Active Directory
Active Directory существенно помогает в управлении ресурсами организации, такими как пользователи, группы, компьютеры, устройства, конференц-залы и т. Д.
Active Directory - это абстракция организационной структуры и иерархии. У него есть корневой домен и поддомены, если это необходимо. Домен далее делится на организационные единицы (OU), которые соответствуют организационной структуре. Организация может иметь географически обособленные офисы. Каждому филиалу требуется собственный контроллер домена для аутентификации.
На следующей диаграмме показана типичная топология Active Directory вместе с типичными ресурсами, которыми управляет Active Directory.
API Active Directory
Нам потребовались API-интерфейсы для извлечения следующей информации из Active Directory.
1) Информация о группе:
Информация о группе состоит из имени группы, членов группы, членства в группе, категории группы и т. Д.
2) Информация о пользователе:
Информация о пользователе состоит из имени пользователя, членства в пользователе, адреса электронной почты, категории пользователя и т. Д.
3) API аутентификации:
Этот API аутентифицирует пользователя и возвращает ответ аутентификации.
Библиотеки, используемые для создания API:
1) Фляга:
Flask очень простой и легкий по сравнению с другими фреймворками Python, такими как Django REST framework. В отличие от Django, Flask предоставляет вам контроль над компонентами, например, какую базу данных использовать, если это необходимо.
Flask предлагает маршрутизацию URL-адресов, обработку запросов и ошибок, создание шаблонов, файлы cookie, поддержку модульного тестирования, отладчик и готовый сервер разработки. Этого достаточно для веб-службы, а для остальных требований можно выбрать больше библиотек и фреймворков. В результате каркас веб-службы готов, а разработчик приложения имеет полную гибкость в выборе других компонентов для ORM, аутентификации и пользовательского интерфейса по мере необходимости.
Django, с другой стороны, верит в подход «с включенными батареями», который, в свою очередь, принимает решения о других компонентах заранее и возлагает ответственность на дизайнера.
Для текущих требований мы выбрали Flask, поскольку многие компоненты из пакета Django, такие как ORM и Auth, не были необходимы. API-интерфейсы, необходимые для подключения к Active Directory, а не к базе данных, а также для аутентификации была необходима сама Active Directory.
2) OpenAPI (ранее Swagger)
OpenAPI обеспечивает простой интерфейс для служб API. Это помогает в тестировании API с использованием любого браузера, и никаких специальных клиентских инструментов не требуется. Этот интерфейс также может использоваться администраторами для реальных случаев использования.
Установка:
$ pip install Flask $ pip install connexion
3) Python-Ldap
Python-ldap - это модуль, который предоставляет объектно-ориентированный API для доступа к серверам Active Directory из программ Python. Python-ldap - это библиотека с открытым исходным кодом, работающая по лицензии Python Software Foundation License (стиль Python), исходный код которой также доступен на Git.
Установка:
$ python -m pip install python-ldap
Пример подключения и аутентификации с использованием Python-ldap.
conn = ldap.initialize(‘ldap://’ + BIND_ADDRESS:389) conn.simple_bind_s(USERNAME, PASSWORD)
Для безопасного соединения я использовал python-ldaps с действующими сертификатами.
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_DEMAND) ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, Constants.CACERTFILE) conn = ldap.initialize(‘ldaps://’ + BIND_ADDRESS:636) conn.simple_bind_s(USERNAME, PASSWORD)
Фильтр группы образцов
“(&(objectClass=Group)(cn={<GROUP_NAME>}))”
Пример пользовательского фильтра
“(&(objectCategory=User)(cn={<USER_NAME>}))”
Проблемы тестирования
Тестирование API было довольно сложной задачей по следующим причинам:
- «Настоящие» подробности установки, в которых должны были использоваться API, были неизвестны.
- Active Directory имеет множество функций и различных типов топологий, что приводит к многочисленным требованиям к настройке.
- Установка всего этого на реальном оборудовании будет обременительной, трудоемкой и дорогостоящей!
- Помимо настройки домена Active Directory, имя домена необходимо зарегистрировать в органе управления доменными именами, чтобы оно было доступно через Интернет. Так обстоит дело с большинством реальных доменов. Однако для тестовых доменов этап регистрации имени нужно пропустить, и нам нужно было найти жизнеспособную альтернативу.
Стратегия тестирования
Чтобы преодолеть вышеуказанные проблемы, мы решили использовать следующую стратегию тестирования:
- Перечислите различные топологии и типы контроллеров домена.
- Настройте их на инстансах AWS EC2.
- Изучите управляемую AWS службу каталогов
- Используйте общедоступный IP-адрес сервера Active Directory, который настроен на экземпляре EC2, в качестве альтернативы зарегистрированному доменному имени.
- Настройте Active Directory, присоедините экземпляр Ubuntu к домену Active Directory. Запустите API из экземпляра, присоединенного к домену, используя доменное имя.
Сценарии тестирования
Ниже приведены сценарии, необходимые для тестирования API Active Directory.
1) Один домен:
Самый простой дизайн домена - это один домен. В дизайне с одним доменом вся информация реплицируется на все контроллеры домена. Этот домен является корневым доменом леса и содержит все учетные записи пользователей и групп в лесу. Эта модель также вызывает наибольший трафик репликации, сводя к минимуму административные издержки.
2) Контроллер домена только для чтения:
Контроллер домена только для чтения (RODC) - это контроллер домена с репликой только для чтения базы данных доменных служб Active Directory.
Он используется в удаленных филиалах, где размещение полного контроллера домена физически небезопасно. Это помогает пользователям филиалов входить в систему локально без подключения к удаленному серверу AD. Однако любое изменение свойств пользователя будет выполнено на главном контроллере домена, а затем реплицировано на RODC.
Настройка включает сначала настройку сайта AD, а затем RODC.
В RODC мы не можем создавать пользователей или группы, потому что у нас нет прав на изменение чего-либо в RODC. Мы можем создать объекты на главном контроллере домена, а затем репликация извлечет данные на контроллер домена только для чтения.
3) Дерево доменов:
Дерево доменов состоит из одного родительского домена и двух или более дочерних доменов. На корневом уровне леса есть только один домен.
4) Лес с 2 доменами, объединенными доверительными отношениями:
Доверительные отношения между доменами - это логическая связь между двумя доменами. Эта ссылка позволяет аутентифицированным пользователям одного домена получать доступ к ресурсам в другом домене. Доверие может быть односторонним или двусторонним между «доверяющим» доменом и «доверенным» доменом. Доверительные отношения транзитивны.
Домены могут находиться в одном или разных лесах. Доменное имя домена должно разрешаться из другого домена, если он находится в другом лесу.
Доверие между двумя доменами корневого уровня разных лесов называется «доверием леса».
5) AWS Directory Service:
Сервис каталогов AWS - это управляемый сервис для Microsoft Active Directory, который упрощает интеграцию Active Directory с другими сервисами AWS.
Служба каталогов помогает размещать Active Directory в облаке или интегрироваться с локальной службой Active Directory.
6) Субдомены:
Поддомен - это домен, который является частью более крупного домена. Домен, который не является субдоменом, должен быть корневым доменом.
7) Безопасный LDAP:
По умолчанию обмен данными LDAP между клиентом и сервером не зашифрован. Это проблематично, особенно потому, что учетные данные отправляются в виде обычного текста по сети при использовании простого связывания LDAP. Таким образом, учетные данные могут быть легко скомпрометированы. Secure LDAP или LDAPS устраняет эту уязвимость, шифруя данные по сети с помощью SSL / TLS.
Чтобы включить безопасный LDAP на контроллере домена, были предприняты следующие шаги:
- Установите корневой ЦС предприятия на контроллер домена.
- Добавьте цифровой сертификат на каждый контроллер домена.
Пример ввода и вывода API
API ИНФОРМАЦИИ О ГРУППЕ
Пример ввода: Конечная точка: http: // localhost: 8085 / v1 / group / demogroup
{
“bind_address”: “<EC2 IPv4 ADDRESS>”,
“FQDN”: “subdomain.domain.com”,
“password”: “<passwd>”,
“username”: “[email protected]”,
“issecure” : false
}
Ответ:
{
“instanceType” : [
“4”
],
“member”: [
“CN=FirstName LastName,OU=demoteam,DC=domain,DC=com”
],
“memberOf”: [
“CN=localgroup,OU=demoteam,DC=domain,DC=com”
],
“name”: [
“demogroup”
],
“objectCategory”: [
“CN=Group,CN=Schema,CN=configuration,DC=domain,DC=com”
]
}
ИНФОРМАЦИЯ ПОЛЬЗОВАТЕЛЯ API
Пример ввода: Конечная точка: http: // localhost: 8085 / v1 / user / username
{
“bind_address”: “<EC2 IPv4 ADDRESS>”,
“FQDN”: “subdomain.domain.com”,
“password”: “<password>”,
“username”: “[email protected]”,
“issecure” : false
}
Ответ:
{
“mail” : [
“[email protected]”
],
“memberOf”: [
“CN=demogroup,OU=demoteam,DC=domain,DC=com”,
“CN=localgroup,OU=demoteam,DC=domain,DC=com”
],
“name”: [
“FirstName LastName”
],
“objectCategory”: [
“CN=Person,CN=Schema,CN=configuration,DC=domain,DC=com”
]
}
Вывод:
Active Directory - это надежная технология, которая позволяет управлять всеми пользователями и ресурсами организации.
AWS предоставляет удобную инфраструктуру и хорошо документированную процедуру для настройки всех различных топологий Active Directory.
AWS Directory Service - это вишенка на пироге, которая обеспечивает интеграцию локальной Active Directory с сервисами AWS или настройку Active Directory в самом облаке.
Уровень API на основе Python-Flask для запросов Active Directory работал отлично благодаря выбранным конструктивным решениям, Active Directory как технологии и AWS !!
Автор:
Самикша Чепе и Прадип Котавале
Изображение предоставлено - ссылка на него