Большинство аспектов защиты COM может быть сконфигурировано путем помещения в реестр нужной информации. Программа DCOMCNFG.ЕХЕ позволяет администраторам настраивать большинство установок (но не все), относящихся к защите COM. Для большинства этих установок (но не для всех) программист приложения может предпочесть употребление явных API-функций вместо установок в реестре. В целом большинство приложений используют комбинацию установок DCOMCNFG.EXE с явными API-функциями. Первый вариант проще для отладки системными администраторами, в то время как второй предполагает большую гибкость без риска неправильного обращения с DCOMCNFG.EXE.
Защита COM использует основные средства RPC для аутентификации и заимствования прав (impersonation). Напомним, что RPC использует загружаемые транспортные модули для того, чтобы после их загрузки в систему были добавлены новые сетевые протоколы. Транспортные модули именуются при помощи последовательностей протоколов (protocol sequences) (например, «ncadg_ip_udp»), которые преобразуются в реестре в специальную транспортную библиотеку DLL. Это позволяет третьим участникам устанавливать поддержку новых транспортных протоколов без модифицирования библиотеки COM. Подобным же образом RPC поддерживает загружаемые модули защиты, позволяя добавлять в систему новые протоколы защиты. Модули защиты именуются при помощи целых чисел, которые преобразуются в реестре в специальные DLL модулей защиты. Эти DLL должны соответствовать требованиям SSPI (Security Support Provider Interface – интерфейс провайдера поддержки безопасности), который является производным от Internet Draft Standard GSSAPI.
В системных заголовочных файлах определено несколько констант для известных модулей защиты. Ниже приведен текущий список известных на момент написания этого текста модулей защиты:
enum {
RPC_C_AUTHN_NONE = 0, // no authentication package
// модуля аутентификации нет
RPC_C_AUTHN_DCE_PRIVATE = 1, // DCE private key (not used)
// закрытый ключ DCE (не используется)
RPC_C_AUTHN_DCE_PUBLIC = 2, // DCE public key (not used)
// открытый ключ DCE (не используется)
RPC_C_AUTHN_DEC_PUBLIC = 4, // Digital Equip, (not used)
// цифровое оборудование (не используется)
RPC_C_AUTHN_WINNT = 10, // NT Lan Manager
// администратор локальной сети NT
RPC_C_AUTHN_GSS_KERBEROS,
RPC_C_AUTHN_MQ = 100, // MS Message Queue package
// модуль MS Message Queue (очереди сообщений Microsoft)
RPC_C_AUTHN_DEFAULT = 0xFFFFFFFFL
};
RPC_C_AUTHN_WINNT показывает, что должен использоваться протокол аутентификации Администратора локальной сети (NT LAN (local area network) Manager – NTLM). RPC_C_AUTHN_GSS_KERBEROS показывает, что будет использован протокол аутентификации Kerberos. Под Windows NT 4.0 поддерживается только протокол NTLM, если не установлена SSP третьего участника. Windows NT 5.0 будет выпущена с поддержкой как минимум NTLM и Kerberos. По вопросам получения других модулей защиты обращайтесь к соответствующей документации.
Каждый интерфейсный заместитель может быть сконфигурирован независимо, что дает возможность использовать различные модули защиты. Если интерфейсный заместитель сконфигурирован для использования протокола защиты, в клиентский процесс загружается соответствующая SSP DLL. Для того чтобы запрос на соединение с защитой был принят, серверный процесс должен зарегистрировать и загрузить соответствующую библиотеку SSP DLL до получения от клиента первого вызова ORPC. Если соединение сконфигурировано для использования модуля защиты, то соответствующая SSP DLL работает в связке с динамическим уровнем иерархии RPC и имеет возможность видеть каждый пакет, передаваемый или получаемый в рамках конкретного соединения. Библиотеки SSP DLL могут посылать в каждом пакете дополнительную информацию, специфическую для защиты, а также модифицировать маршалированное состояние параметра в целях шифрования. DCE RPC (и COM) предусматривают шесть уровней аутентификационной защиты, которые варьируются от отсутствия защиты до полного шифрования состояния всех параметров:
enum {
RPC_C_AUTHN_LEVEL_DEFAULT, // use default level for pkg
// используем для модуля уровень, принятый по умолчанию
RPC_C_AUTHN_LEVEL_NONE, // по authentication
// без аутентификации
RPC_C_AUTHN_LEVEL_CONNECT, // only authenticate credentials
// только аутентификация мандата
RPC_C_AUTHN_LEVEL_CALL, // protect message headers
// защищаем заголовки сообщений
RPC_C_AUTHN_LEVEL_PKT, // protect packet headers
// защищаем заголовки пакетов
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, // protect parameter state
// защищаем состояние параметров
RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // encrypt parameter state
// зашифровываем состояние параметров
};