Samba AD и MIT Kerberos (Александр Боковой, OSSDEVCONF-2017)
- Докладчик
- Александр Боковой
Samba 4.7 — первая версия Samba AD, которая поддерживает работу с MIT Kerberos вместо Heimdal.
Доклад расскажет о том, почему потребовалось более пяти лет, чтобы реализовать поддержку MIT Kerberos и что из этого вышло.
Содержание
Видео
Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.
Презентация
Thesis
Впервые поддержкой режима контроллера домена Microsoft Active Directory в рамках проекта Samba занялись в 2002 году. Архитектура контроллера домена Active Directory подразумевает одновременную доступность к информации об учетных записях и их состоянии средствами разных протоколов. Изменения, вносимые посредством вызовов DCE RPC, моментально отражаются и в LDAP, и в Kerberos. Это фактически означало, что контроллер домена на основе Samba должен интегрировать LDAP и Kerberos так, чтобы контекст обработки данных был единым между тремя разными системами.
На тот момент этого можно было достичь только тесно интегрировав между собой все компоненты. К тому же, многие из расширений протоколов LDAP и Kerberos, внесенные Microsoft в Active Directory, не были реализованы в свободных проектах (OpenLDAP, Heimdal или MIT Kerberos). Тесная интеграция означала не просто исполнение кода с доступом к единой базе данных, требовалось изменить и код серверов LDAP и Kerberos единым образом. Фактически, на какое-то время нужно было трем проектам (Samba, OpenLDAP и какой-то из свободным реализаций Kerberos) стать единым целым с точки зрения координации изменений и выпуска версий. Этот подход оказался крайне сложным, поскольку все проекты преследовали свои цели и не были готовы к такой плотной координации.
В результате, Эндрю Триджелл, автор Samba, в тот момент работавший в IBM Research, принял решение написать свою реализацию сервера LDAP (и базы данных для него), а также интегрировать в Samba реализацию Kerberos из проекта Heimdal. Последнее решение было обосновано тем, что Heimdal позволял интегрировать сервер ключей Kerberos (KDC) как библиотеку уже в существующую программу. MIT Kerberos такой возможностью не обладал и не обладает до сих пор.
Версия Samba, поддерживающая работу контроллера домена Active Directory, была интегрирована в основную ветку проекта Samba и выпущена в эксплуатацию как Samba 4.0.0 в 2012 году. Она активно использовалась в различных организациях и поставлялась в дистрибутивах на основе Debian и Ubuntu, однако отсутствовала в Fedora / CentOS / Red Hat Enterprise Linux и openSUSE / SUSE Linux Enterprise Server. Эти дистрибутивы использовали MIT Kerberos вместо Heimdal. Оба проекта совместимы на уровне сетевого протокола, но внутренние структуры в предоставляемых библиотеках организованы по-разному и не могут быть использованы одновременно.
Когда в 2012 году встал вопрос о поддержке MIT Kerberos в Samba AD DC, стало ясно, что требуется дополнительно решить целый ряд задач совместимости. Как уже говорилось, функционал KDC в MIT Kerberos нельзя было интегрировать в существующее приложение. Heimdal Kerberos предоставлял ряд внутренних функций, которые отсутствовали в MIT Kerberos и за десятилетие развития Samba AD DC стали неотъемлемой частью кода Samba. К тому же, необходимо было добиться полного покрытия тестами среды исполнения контроллера домена Active Directory при использовании группы процессов.
Реализация этих задач потребовала создания новых системных компонент. Поскольку контейнеризация процессов на момент слияния ветки Samba AD DC с основной веткой разработки Samba в 2005 году была еще неразвитой, Samba Team пошла по пути создания среды, которая симулировала пересылку данных по сети (socket_wrapper, Йелмер Верноой, 2005 год), чтение информации о пользователях и доменных именах через системные API (nss_wrapper, Стефан Метцмахер, 2007 год), изоляцию приложений (uid_wrapper, Эндрю Триджелл, 2008 год), прямые вызовы DNS (resolv_wrapper, Андреас Шнайдер, 2014 год), а также аутентификацию приложений (pam_wrapper). Все эти компоненты стали частью проекта CWrap ([1]) и успешно используются при тестировании многих других проектов.
Работа по поддержке MIT Kerberos была сложной. Во-первых, необходимость понимания двух независимых реализаций не самого простого протокола существенно сужала круг возможных исполнителей. Во вторых, эта работа требовала времени и финансирования. Андреас Шнайдер и Гюнтер Дечнер из Red Hat фактически оказались единственными, кто сумел сосредоточиться на переносе на годы. К маю 2014 стало возможным вручную запустить сервер KDC из MIT Kerberos как часть Samba.
Вся эта работа сопровождалась обнаружением различных недостатков как в компонентах CWrap, так и ошибках или отсутствию необходимых вызовов в MIT Kerberos. Параллельно разработка Samba AD DC не стояла на месте и всё больше функций Heimdal Kerberos, несовместимых с MIT Kerberos, обнаруживалось в различных компонентах Samba.
К лету 2015 года набор исправлений для поддержки MIT Kerberos в Samba AD DC состоял из более чем 140 патчей. Все их предстояло рассмотреть и включить в основной код Samba. К этому моменту еще не работали 69 тестовых конфигураций. Забегая вперед, к лету 2017 в режиме сборки с MIT Kerberos в тестировании Samba AD DC исполнялось 14658 тестов из 2030 тестируемых сценариев, это полный набор тестов в Samba 4.7.
В августе 2015 половина исправлений уже была интегрирована в основной код Samba. Samba научилась запускать внутри себя KDC и сервис управления учетными записями (kadmind). В этот момент пришло осознание, что изменение свойств учетных записей в протоколе kadmin не поддерживает динамическое разграничение доступа (access control lists). Работа над соответствующим API в MIT Kerberos ведется до сих пор — катализатором этой работы выступает проект FreeIPA. В Samba Team было принятно решение реализовать собственную версию протокола kadmin, чтобы интегрировать со внутренней моделью безопасности, совместимой с ACL в Active Directory.
Active Directory позволяет реплицировать данные между контроллерами в рамках домена. Для этого, в частности, необходимо извлекать данные ключей Kerberos, правильно их шифровать в соответствии с протоколом MS-BKRP и пересылать между системами. Чтобы сделать эту часть функционала независимой от реализации Kerberos, код обработки ключей был переписан на использование GnuTLS. Выяснилось, что GnuTLS содержит ошибки и не содержит некоторые необходимые для MS-BKRP алгоритмы, в частности, RC4. Их поддержка была добавлена в GnuTLS в конце 2015.
Работа над поддержкой MIT Kerberos была заморожена в конце 2015 до середины весны 2016 из-за серии уязвимостей Badlock. Когда же работа возобновилась летом 2016, выяснилось, что Samba неверно рассчитывает хэши для паролей при установке доверительных отношений между доменами. Всё это потребовало полное переписывание механизма передачи клиентских паролей и ключей внутри libsmb. Вдобавок, поведение некоторых общих для MIT Kerberos и Heimdal функций инициализации данных из хранилищ ключей различалось, а некоторые функции GSSAPI, позволяющие изолировать эту разницу, отсутствовали в Heimdal.
В декабре 2016 года MIT Kerberos выпустил версию 1.15, которая должа была содержать практически все исправления, необходимые для Samba. Увы, эта версия также убрала функцию, позволявшую модулям базы данных в KDC создавать свои структуры данных и уничтожать их при уничтожении данных о принципалах внутри KDC. Эта ошибка была исправлена в версии 1.15.1, где необходимый деструктор данных был снова добавлен.
Все оставшиеся патчи и исправления в различных компонентах Samba были добавлены в основную ветку разработки 30 апреля 2017 года. Samba AD DC с MIT Kerberos поддерживает работу как контроллер домена, доверительные отношения уровня леса предприятия и внешние доверительные отношения с доменами NT. Еще предстоит реализовать целый пласт функционала:
- поддержка PKINIT и смарткарт
- поддержка имперсонификации на уровне Kerberos (S4U2Self, S4U2Proxy), в том числе и между доменами
- поддержка контроллера домена в режиме только для чтения (для этого и нужна библиотека KDC)
Пять лет были потрачены на итеративное обнаружение ошибок, недоработок и отсутствие интеграции между различными свободными проектами. Многие из этих недоработок были критичными для полного покрытия кода функциональными тестами. Можно ли было бы добиться этого взаимодействия между проектами в 2002-2012? Наверное да, но были и сдерживающие факторы, в первую очередь отсутствие эффективных средств ведения распределенной разработки. Проект Git появился в 2005 году как реакция на разногласия между Эндрю Триджеллом (Samba, Rsync) и Ларри МакВоем (BitKeeper). Фактически, ошибка Торвальдса в оценке ситуации с анализом сетевого протокола BitKeeper, выполненным Эндрю Триджеллом, породила git как систему распределенной разработки и навсегда изменила подход к взаимодействию между многими открытыми проектами. В 2002-2012 тот процесс, который занял у Андреаса Шнайдера и Гюнтера Дечнера пять лет, мог легко растянуться на восемь и больше лет. К тому же, в тот период не нашлось желающих эту работу профинансировать.
Примечания и ссылки
Plays:461 Comments:5