В последние пару лет мне приходилось «время от времени» работать с Heimdal / MIT Gssapi для аутентификации kerberos. Мне нужно было создать приложение, которое должно было использоваться в качестве веб-службы, работающей на компьютере под управлением Linux, и обслуживать клиентские приложения, такие как браузеры, работающие на настольных компьютерах и рабочих станциях под управлением Windows и / или Linux. Конечно, не самый простой из прирученных зверей. В конце концов, подводя итоги своей работы, я мог заметить, что трудности возникли из-за проблем во многих измерениях. Начало работы с gssapi-программированием — действительно сложная задача только из-за плохой документации и практически несуществующих учебников. В основном поиск в Google приводит либо к теоретической дискуссии о том, что такое kerberos, либо к содержанию, написанному с предположением, что вы уже знаете все, кроме какой-то конкретной семантической проблемы.
Несколько действительно хороших хаков здесь помогли мне, поэтому я полагаю, что было бы неплохо обобщить материал с точки зрения разработчика и поделиться им здесь как своего рода вики, чтобы что-то вернуть этому фантастическому месту, и коллеги программисты.
Раньше я еще не делал подобную вики, и я, конечно, не имею права ни в GSSAPI, ни в Kerberos, так что, пожалуйста, будьте добры, но более того, пожалуйста, внесите свой вклад и исправьте мои ошибки. Редакторы сайта, я рассчитываю на вас, чтобы творить чудеса;)
Успешное завершение вашего проекта потребует 3 конкретных действий, которые будут выполнены правильно:
Как я уже сказал, такие проекты — звери, просто потому что все три не были нигде не объединены на одной странице.
Итак, давайте начнем с самого начала.
Неизбежная теория для новичка
GSSAPI помогает клиентскому приложению предоставлять учетные данные для сервера, чтобы достоверно идентифицировать пользователя. Чрезвычайно полезно, потому что серверные приложения могут модулировать свои обслуживаемые ответы, если они этого хотят, согласно пользователю. Поэтому вполне естественно, что и клиентские, и серверные приложения должны быть керберизованы, или, как некоторые из них заявили бы, что они поддерживают Kerberos.
Проверка подлинности на основе Kerberos требует, чтобы клиентские и серверные приложения были членами Kerberos Realm. KDC (Kerberos Domain Controller) — назначенный орган, который управляет областью. AD-серверы Microsoft являются одним из наиболее популярных примеров KDC, хотя вы, конечно, можете использовать KDC на базе * NIX. Но, безусловно, без KDC вообще не может быть никакого бизнеса Kerberos. Десктопы, серверы & рабочие станции, подключенные к домену, идентифицируют друг друга до тех пор, пока все они остаются подключенными к домену.
Для ваших первоначальных экспериментов настройте клиент & серверные приложения в одной области.
Хотя проверку подлинности Kerberos можно также использовать в разных областях, создавая доверительные отношения между KDC этих областей или даже объединяя таблицы ключей из разных KDC, которые не доверяют друг другу. Ваш код на самом деле не нуждается в каких-либо изменениях, чтобы приспособиться к таким разным и сложным сценариям.
Аутентификация Kerberos в основном работает через «тикеты (или токены)». Когда участник присоединяется к царству, KDC «выдает жетоны» каждому из них. Эти токены уникальны; время и полное доменное имя являются существенными факторами для этих билетов.
Прежде чем вы подумаете о самой первой строке вашего кода, убедитесь, что вы правильно поняли эти две строки:
Касаемо № 1 Когда вы настраиваете свою среду разработки и тестирования, убедитесь, что все проверено и адресовано как FQDN. Например, если вы хотите проверить подключение, отправьте эхо-запрос, используя FQDN, а не IP. Излишне говорить, что они должны обязательно иметь одинаковую конфигурацию службы DNS.
Ловушка № 2 Убедитесь, что все хост-системы, на которых работает KDC, клиентское программное обеспечение, серверное программное обеспечение, имеют один и тот же сервер времени. Синхронизация времени — это то, что забывают и понимают, что после многих стрижек и ударов головой все идет не так!
Как клиентские, так и серверные приложения НУЖНЫ ключевые таблицы Kerberos. Поэтому, если ваше приложение будет работать на хосте * NIX и входить в состав домена Microsoft, вам необходимо сгенерировать таблицу ключей Kerberos, прежде чем мы начнем рассматривать оставшиеся подготовительные шаги для программирования gss.
Пошаговое руководство по взаимодействию Kerberos 5 (krb5 1.0) это абсолютно необходимо прочитать.
Руководство по программированию GSS-API отличная закладка
В зависимости от вашего * NIX дистрибутива вы можете установить заголовки & библиотеки для сборки вашего кода. Однако я предлагаю скачать исходный код и собрать его самостоятельно. Да, вы можете не понять это сразу, но это, безусловно, стоит того.
Касаемо № 3 Убедитесь, что ваше приложение работает в среде, поддерживающей Kerberos.
Я действительно научился этому нелегко, но, возможно, потому что я не такой умный. На самых ранних этапах борьбы с программированием на gssapi я обнаружил, что ключевые таблицы Kerberos абсолютно необходимы для того, чтобы приложение поддерживало Kerberos. Но я просто не мог найти что-нибудь о том, как загрузить эти ярлыки клавиш в моем приложении. Ты знаешь почему?!! Потому что такого API не существует !!!
Потому что: приложение должно быть запущено в среде, которая осведомлена о клавишах.
Хорошо, позвольте мне сделать это просто: ваше приложение, которое должно выполнять GSSAPI / Kerberos, должно работать после того, как вы установили переменную среды KRB5_KTNAME
на путь, где вы сохранили ярлыки клавиш. Так что либо вы делаете что-то вроде:
export KRB5_KTNAME=<path/to/your/keytab>
или использовать setenv
установить KRB5_KTNAME
в вашем приложении достаточно, прежде чем будет запущена самая первая строка вашего кода, которая использует gssapi.
Теперь мы готовы сделать необходимые вещи в коде приложения.
Я понимаю, что есть довольно много других аспектов, которые должны быть рассмотрены разработчиком приложения, чтобы написать и протестировать приложение. Я знаю несколько переменных среды, которые могут быть важны.
Кто-нибудь может пролить немного света на это?
Задача ещё не решена.
Других решений пока нет …