Как правильно настроить аутентификацию и маскировку в DCOM для Delphi-приложений
Вопрос аутентификации и маскировки в DCOM является важным аспектом при разработке Delphi-приложений, особенно когда речь идет о взаимодействии с процессами, выполняющимися вне текущего процесса. В данной статье мы рассмотрим, как настроить процесс-широкое аутентификацию с использованием функции CoInitializeSecurity и как применить маскировку для изменения идентичности клиента в специальных ситуациях.
Настройка аутентификации
Для настройки аутентификации в DCOM используется функция CoInitializeSecurity. Она позволяет установить параметры безопасности для COM-интерфейсов, включая аутентификацию и уровень делегирования. Параметры аутентификации задаются через структуру SOLE_AUTHENTICATION_LIST, которая содержит один или несколько элементов SOLE_AUTHENTICATION_INFO. Каждый элемент содержит информацию об аутентификации и делегировании, а также указатель на структуру, содержащую конкретные данные аутентификации.
var
authList: SOLE_AUTHENTICATION_LIST;
authIdentity: SEC_WINNT_AUTH_IDENTITY_W;
authInfo: array[0..1] of SOLE_AUTHENTICATION_INFO;
// ... другие переменные ...
begin
// ... инициализация authIdentity и authInfo ...
authList.cAuthInfo := Length(authInfo);
authList.aAuthInfo := @authInfo;
OleCheck(CoInitializeSecurity(
NULL, // Указатель на дескриптор безопасности
-1, // Количество элементов в массиве asAuthSvc
NULL, // Указатель на массив asAuthSvc
NULL, // Резерв для будущего использования
RPC_C_AUTHN_LEVEL_CONNECT, // Уровень аутентификации
RPC_C_IMP_LEVEL_IMPERSONATE, // Уровень делегирования
@authList, // Информация об аутентификации
EOAC_NONE, // Дополнительные возможности
NULL // Резерв
));
end;
Использование маскировки
Маскировка в DCOM позволяет изменить идентичность клиента для специальных ситуаций. Это может быть полезно, например, при выполнении операций от имени другого пользователя. Маскировка настраивается с помощью флага EOAC_DYNAMIC_CLOAKING, который передается в функцию CoInitializeSecurity.
В контексте вашего запроса, вы столкнулись с тем, что информация об аутентификации, установленная с помощью CoInitializeSecurity, не использовалась для новых COM-вызовов. Вместо этого, использовалась идентичность процесса. Также вы отметили, что ручная имитация идентичности не работала.
Подтвержденный ответ
Проблема с использованием информацией об аутентификации из CoInitializeSecurity для всех новых COM-вызовов связана с тем, как работает делегирование аутентификации. В случае использования NTLM, делегирование работает только в определенных условиях, например, в доменных средах Kerberos, где идентичность процесса должна быть "доверена для делегирования". Также важно отметить, что для двухэтапного запроса (например, если клиент обращается к одному серверу, который, в свою очередь, обращается к другому серверу), NTLM аутентификация не позволит делегирование.
Согласно комментариям, проблема с использованием флага EOAC_DYNAMIC_CLOAKING была связана с неправильным определением константы, и после исправления код начал работать корректно, но только в случае использования Kerberos и при условии, что идентичность процесса "доверена для делегирования".
Альтернативный ответ
В качестве альтернативного ответа можно рассмотреть использование уровня аутентификации RPC_C_AUTHN_LEVEL_CALL, вместо RPC_C_AUTHN_LEVEL_CONNECT, в функции CoInitializeSecurity. Это может быть полезно в случаях, когда требуется более строгая аутентификация для каждого вызова.
Также рекомендуется использовать CoSetProxyBlanket для изменения параметров аутентификации для прокси. Это позволит более тонко настроить аутентификацию и делегирование для каждого интерфейса.
var
// ... другие переменные ...
begin
// ... инициализация и настройка прокси ...
OleCheck(CoSetProxyBlanket(
InterfacePointer, // Указатель на интерфейс
RPC_C_AUTHN_LEVEL_CALL, // Уровень аутентификации
RPC_C_IMP_LEVEL_IDENTIFY, // Уровень делегирования
NULL, NULL, // Указатели на дескрипторы безопасности
RPC_C_AUTHN_WINNT, // Тип аутентификации
RPC_C_AUTHZ_NONE, // Тип авторизации
NULL, // Указатель на дополнительную информацию об аутентификации
EOAC_DEFAULT // Флаги дополнительных возможностей
));
end;
Заключение
Настройка аутентификации и маскировки в DCOM для Delphi-приложений требует тщательного понимания механизмов аутентификации и делегирования в Windows. Использование CoInitializeSecurity для настройки аутентификации и маскировки может быть сложным, но необходимым шагом для обеспечения безопасности в распределенных приложениях. Применение рекомендаций из данной статьи поможет вам избежать распространенных ошибок и успешно настроить DCOM для вашего Delphi-приложения.
Настройка аутентификации и маскировки в DCOM для Delphi-приложений включает использование функции `CoInitializeSecurity` и возможностей маскировки для обеспечения безопасного взаимодействия с компонентами COM.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.