Создание и уничтожение контекстов безопасности
Создание контекста безопасности предшествует всем операциям по обмену сообщениями между потенциальными партнерами. В процессе его формирования партнеры могут убедиться в подлинности друг друга, а также договориться о степени защищенности коммуникаций. Впрочем, обычно, в силу асимметричности отношения клиент/сервер, аутентификация носит односторонний характер - сервер убеждается в подлинности клиента.
Для работы с контекстами обобщенный интерфейс безопасности GSS-API предоставляет следующие функции:
- GSS_Init_sec_context - формирование "исходящего" контекста, т. е. части контекста, относящейся к инициатору общения;
- GSS_Accept_sec_context - формирование "входящего" контекста, т. е. части контекста, относящейся к вызываемому партнеру;
- GSS_Delete_sec_context - отказ от контекста, ставшего ненужным;
- GSS_Process_context_token - обработка полученного контекстного токена;
- GSS_Context_time - выяснение срока годности контекста;
- GSS_Inquire_context - получение информации о контексте;
- GSS_Wrap_size_limit - выяснение максимального размера сообщения, которое можно зашифровать в рамках заданного контекста безопасности;
- GSS_Export_sec_context - передача контекста другому процессу;
- GSS_Import_sec_context - прием контекста, переданного другим процессом.
Инициатор общения вызывает функцию GSS_Init_sec_context, передавая ей свое удостоверение - явно полученное или подразумеваемое. Кроме того, инициатор специфицирует запрашиваемую процедуру взаимной аутентификации и уровень защиты сообщений. В ответ ему возвращается токен, который следует переслать партнеру.
Партнер, получив токен, передает его функции GSS_Accept_sec_context (вместе со своим удостоверением). Как правило, на этом формирование контекста заканчивается. Партнеры должны проанализировать флаги, ассоциированные с контекстом, чтобы узнать, каков реально предоставленный уровень защиты.
Если инициатор общения (обычно это клиент) желает убедиться в подлинности партнера, он передает функции GSS_Init_sec_context флаг mutual_req_flag (требуется взаимная аутентификация).
В таком случае вызов GSS_Init_sec_context возвращает в качестве основного кода значение GSS_S_CONTINUE_NEEDED (а не GSS_S_COMPLETE). Соответствующим образом меняется и генерируемый контекстный токен. Партнер, приняв и обработав (с помощью функции GSS_Accept_sec_context) присланную информацию, получит на выходе установленный флаг mutual_state и новый контекстный токен, который следует вернуть инициатору. Последний должен повторно обратиться к функции GSS_Init_sec_context с полученным токеном. При отсутствии ошибок GSS_Init_sec_context вернет, наконец, основной код GSS_S_COMPLETE, и формирование контекста на этом завершится.
При формировании контекста служба безопасности может требовать обмена несколькими токенами (даже без взаимной аутентификации). Тогда инициатору придется несколько раз вызывать функцию GSS_Init_sec_context, а его партнеру - функцию GSS_Accept_sec_context. Все вызовы, кроме последнего, вернут основной код GSS_S_CONTINUE_NEEDED. Последний вызов, завершающий формирование контекста на соответствующей стороне, в нормальном случае выдаст основной код GSS_S_COMPLETE.
Партнеры должны сами определять (способами, внешними по отношению к GSS-API), что именно из пересылаемой информации представляет собой контекстный токен и какой функции его следует передать. При отказе от контекста, ставшего ненужным, функция GSS_Delete_sec_context может передать управляющий токен, подлежащий пересылке партнеру. Партнер, приняв токен, должен вызвать функцию GSS_Process_context_token, которая проанализирует управляющую информацию и удалит вторую половину сбрасываемого контекста.
Как правило, в процессе формирования контекста партнер получает информацию о его инициаторе. Инициатор может запросить формирование "анонимного" контекста посредством флага anon_req_flag. Это имеет смысл при пользовании общедоступными услугами (получение свободно распространяемой информации и т.п.). Партнер вправе принять или отвергнуть анонимный контекст.
Функция GSS_Inquire_context позволяет получить информацию о контексте - имена инициатора общения и его партнера, срок годности, тип задействованного механизма безопасности, а также ассоциированные флаги (replay_det_state - обеспечивается отслеживание продублированных сообщений, conf_avail - предоставляется возможность шифровать сообщения и т.п.).
Функция GSS_Export_sec_context предоставляет токен, пригодный для передачи контекста безопасности другому процессу в пределах одной вычислительной системы. Передавать можно только полностью сформированный контекст. Вообще говоря, экспортировав контекст, процесс теряет право на его использование.
Для приема (импорта) контекста безопасности служит функция GSS_Import_sec_context.