- •7.5.2. Трехфазное подтверждение
- •7.6. Восстановление
- •7.6.1. Основные понятия
- •7.6.2. Создание контрольных точек
- •7.6.3. Протоколирование сообщений
- •7.7. Итоги
- •Глава 8
- •8.1. Общие вопросы защиты
- •8.1.1. Угрозы, правила и механизмы
- •8.1.2. Вопросы разработки
- •8.1.3. Криптография
- •8.2. Защищенные каналы
- •8.2.1. Аутентификация
- •8.2.2. Целостность и конфиденциальность сообщений
- •8.2.3. Защищенное групповое взаимодействие
- •8.3. Контроль доступа
- •8.3.1. Общие вопросы контроля доступа
- •8.3.2. Брандмауэры
- •8.3.3. Защита мобильного кода
- •8.4. Управление защитой
- •8.4.1. Управление ключами
- •8.4.2. Управление защищенными группами
- •8.4.3. Управление авторизацией
- •8.5. Пример — Kerberos
- •8.6. Пример — sesame
- •8.6.1. Компоненты системы sesame
- •8.6.2. Сертификаты атрибутов привилегий
- •8.7. Пример — электронные платежные системы
- •8.7.1. Электронные платежные системы
- •8.7.2. Защита в электронных платежных системах
- •8.7.3. Примеры протоколов
- •8.8. Итоги
- •Глава 9
- •9.1. Corba
- •9.1.1. Обзор
- •9.1.2. Связь
- •9.1.3. Процессы
- •9.1.4. Именование
- •9.1.5. Синхронизация
- •9.1.6. Кэширование и репликация
- •9.1.7. Отказоустойчивость
- •9.1.8. Защита
- •9.2. Dcom
- •9.2.1. Обзор
- •9.2.2. Связь
- •9.2.3. Процессы
- •9.2.4. Именование
- •Синхронизация
- •Репликация
- •Отказоустойчивость
- •9.2.8. Защита
- •9.3. Globe
- •9.3.1. Обзор
- •9.3.2. Связь
- •9.3.3. Процессы
- •9.3.4. Именование
- •9.3.5. Синхронизация
- •9.3.6. Репликация
- •Отказоустойчивость
- •9.4. Сравнение систем corba, dcom и Globe
- •9.4.1. Философия
- •Процессы
- •9.4.4. Именование
- •Синхронизация
- •Кэширование и репликация
- •Отказоустойчивость
9.1.4. Именование
CORBA поддерживает различные типы имен. Имена самого низкого уровня — это ссылки на объекты и символьные имена, поддерживаемые службой именования CORBA. Кроме того, существует несколько расширенных механизмов именования, при помощи которых можно находить объекты по их свойствам. Далее мы рассмотрим базовую службу именования CORBA, особенно внимательно изучая ссылки на объекты. Что касается расширенных механизмов именования, доступных через службу обмена CORBA, мы отсылаем читателя к [326, 330].
Ссылки на объекты
Основа CORBA — это способ организации ссылок на объекты. Когда клиент получает ссылку на объект, он может обращаться к методам, реализованным внутри этого объекта. Важно отличать ссылку на объект, которую использует клиентский процесс для обращения к методу, от реализации ссылки в базовом брокере ORB.
Процесс (будь то клиент или сервер) может использовать только такую реализацию ссылки на объект, которая характерна для текущего языка программирования. В большинстве случаев она принимает вид указателя на локальное представление объекта. Эта ссылка не может быть передана из процесса А в процесс В, поскольку имеет смысл только в адресном пространстве процесса А. Чтобы передать ссылку в другой процесс, процесс А должен сначала выполнить маршалинг указателя, чтобы его вид не зависел от процесса. Эта операция осуществляется брокером ORB. После завершения маршалинга ссылка может быть передана в процесс В, который путем демаршалинга извлечет ее из сообщения. Отметим, что процессы А и В могут быть исполняемыми программами, написанными на разных языках программирования.
В противоположность этим процессам обслуживающий их брокер ORB имеет свое, не связанное с языками программирования представление ссылки на объект. Это представление может отличаться и от той версии, которую он путем маршалинга передает процессу при обмене ссылками. Важно отметить, что когда процесс использует ссылку на объект, обслуживающий его брокер ORB неявно передает полный набор информации, необходимой для того, чтобы узнать, к какому объекту на самом деле происходит обращение. Эта информация обычно передается клиентской и серверной заглушками, сгенерированными из спецификаций объекта на языке IDL.
Одна из проблем ранних версий CORBA состояла в том, что каждый брокер ORB сам решал, как представлять ссылку на объект. Таким образом, если процесс А хотел, как описывалось выше, послать ссылку процессу В, это успешно получалось только в том случае, если оба процесса работали поверх одного и того же брокера ORB. В противном случае версия ссылки после маршалинга, которую посылал процесс А, была непонятна брокеру ORB, обслуживающему процесс В.
В
се
современные системы CORBA
поддерживают одинаковое, не зависящее
от языка программирования представление
ссылок на объекты, которое называется
межоперационной
ссылкой па объект (Interoperable
Object
Reference,
IOR).
He
так уж важно, использует или нет ORB
формат IOR
для своих внутренних нужд. Однако при
передаче ссылки на объект другому
брокеру ORB
он делает это в формате IOR.
Ссылка IOR
содержит всю информацию, необходимую
для идентификации объекта. Общий вид
IOR
представлен на рис. 9.10 вместе со
специфичной информацией для протокола
НОР, которую мы далее рассмотрим в
деталях.
Каждая ссылка IOR начинается с идентификатора хранилища. Как мы говорили, этот идентификатор назначается интерфейсу в момент его помещения в хранилище интерфейсов, используется для поиска информации об интерфейсе во время исполнения и может применяться, например, для проверки типов или создания обращения к интерфейсу во время исполнения. Отметим, что благодаря этому идентификатору и клиент, и сервер получают доступ в одно и то же хранилище интерфейсов или как минимум идентифицируют интерфейсы по одному и тому же идентификатору.
Наиболее важная часть каждой ссылки IOR — так называемый теговый про-филъ (tagged profile). Каждый теговый профиль содержит всю информацию, необходимую для обращения к объекту. Если сервер объектов поддерживает несколько протоколов, информация о каждом из них будет содержаться в отдельном теговом профиле. Детали профиля для ПОР также представлены на рис. 9.10.
Профиль для ПОР идентифицируется соответствующим полем тегового профиля и состоит, в свою очередь, из пяти полей.
Поле версии ПОР определяет версию протокола ПОР, использованную в данном профиле.
Поле хоста — это строка, идентифицирующая хост, на котором находится объект. Хост может быть задан либо в виде полного доменного DNS-име-ни (например, soling.csvu.nl), либо в виде IP-адреса хоста (например, 130.37.24.11).
Поле порта содержит номер порта, с которого сервер объекта ожидает входящих сообщений.
Поле ключа объекта содержит информацию, необходимую серверу для выделения запросов, предназначенных для данного объекта. Так, например, частью этого ключа, как правило, является созданный РОА идентификатор объекта. Этот ключ будет также идентифицировать РОА.
И, наконец, поле компонентов может содержать дополнительную информацию, необходимую для правильного обращения к объекту, к которому относится ссылка. Это может быть, например, информация по защите, показывающая, как должна обрабатываться ссылка или что делать, если указанный в ссылке сервер временно недоступен. Ниже мы еще вернемся к этим вопросам.
Теперь, когда мы детально рассмотрели ссылки на объекты, будет несложно понять, как клиент связывается с объектом для последующего вызова его методов. Вспомним, что в главе 2 мы говорили, что привязка клиента к объекту — это процесс организации соединения с объектом, выполнив который клиент может обращаться к методам объекта. Привязка возможна только в том случае, если у клиента есть ссылка на объект.
Предваряя обсуждение службы именования CORBA, предположим, что клиент запросил службу именования разрешить некое осмысленное (для человека) имя. В ответ служба именования вернет хранимую ею и зависящую от языка программирования реализацию ссылки IOR. Подобная реализация может быть возвращена только в том случае, если клиентский брокер ORB полностью завершил процесс привязки. Это происходит следующим образом.
ORB клиента получает ссылку IOR, возвращенную ему службой именования, и для проверки идентификатора хранилища, содержащегося в IOR, может поместить заместитель на клиента и вернуть указатель р на этот заместитель. Внутри себя ORB сохраняет сведения о том, что р соответствует IOR объекта.
Разные брокеры ORB имеют разную реализацию, но одинаковый сценарий работы. До передачи р клиенту клиентский брокер ORB проверяет теговые профили, входящие в IOR. Предположим, что объект вызывается по протоколу НОР. В этом случае клиентский брокер ORB может, используя адрес хоста и номер порта, найденные в IOR, установить с сервером объектов соединение по протоколу TCP. В этот момент он и передает р клиенту.
Когда клиент обращается к одному из методов объекта, ORB клиента выполняет маршалинг запроса в сообщение Request протокола НОР. Это сообщение содержит ключ объекта для данного сервера, который также хранится в IOR.
Сообщение через соединение TCP передается на сервер, где пересылается адаптеру РОА, ассоциированному с ключом объекта. Далее РОА передаст запрос нужному слуге, где путем демаршалинга он будет преобразован в реальный вызов метода.
Согласно этому сценарию IOR непосредственно ссылается на объект, что приводит к так называемой прямой привязке (direct binding). Альтернативой прямой привязке является непрямая привязка (indirect binding), при которой построенный запрос сначала пересылается в хранилище реализаций. Хранилище реализаций — это еще один процесс, идентифицируемый в IOR объекта. Он служит реестром, в котором может находиться и активизироваться перед получением запроса указанный объект. На практике непрямая привязка используется в первую очередь для сохранных объектов, то есть объектов, управляемых РОА и соблюдающих правила, обязательные для объектов длительного хранения.
Когда клиентский брокер ORB использует ссылки IOR, основанные на непрямой привязке, он просто начинает процедуру привязки с хранилища реализаций. Хранилище уведомляет, что запрос на самом деле предназначен для другого сервера, и просматривает свои таблицы в поисках работающего сервера и его местоположения. Если соответствующий сервер в данный момент не запущен, хранилище реализаций может запустить его, если он поддерживает возможность автоматического запуска.
Когда клиент впервые обращается к объекту по ссылке, запрос передается хранилищу реализаций, которое отвечает за предоставление информации о том, где на самом деле находится сервер объектов (рис. 9.11). После этого запрос пересылается соответствующему серверу.
Служба именования CORBA
Как и другие распределенные системы, CORBA имеет службу именования, которая позволяет клиентам находить ссылки на объекты по символьным именам. Формально имя в CORBA — это последовательность компонентов имени, каждый из которых имеет вид пары (идентификатор, сорт), где идентификатор и сорт — строки. Обычно идентификатор используется для именования объекта строкой символов, например «steen» или «elke». Атрибут сорт — это просто индикатор именованного объекта, похожий на расширение в именах файлов. Так, например, объект, названный «steen», может иметь сорт «dir», указывающий на то, что это объект каталога.
Не существует способа представить путь и имя в виде одной строки. Другими словами, CORBA не определяет разделитель между компонентами имени. Вместо этого имена можно передавать просто как последовательность компонентов имени. Представление последовательности зависит от используемого языка программирования, но для клиента, пользующегося услугами службы именования, оно остается непрозрачным.
На структуру графа именования не существует ограничений. Каждый из узлов графа именования трактуется как объект. Контекст именования (naming context) — это объект, хранящий таблицу отображения компонентов имен в ссылки на объекты. Контекст именования, таким образом, это то, что в главе 4 мы называли направляющим узлом. Отметим, что ссылка на объект в контексте именования может ссылаться на другой контекст именования.
Граф именования не имеет корневого контекста. Однако каждый брокер ORB имеет исходный контекст именования, который в данных условиях представляет собой корень графа именования. Имена всегда разрешаются в соответствии с данным контекстом именования. Другими словами, если клиент хочет разрешить имя, он должен вызвать метод resolve конкретного контекста именования. Если разрешение имени произошло успешно, он всегда возвращает ссылку либо на контекст именования, либо на именованный объект. В этом смысле разрешение имен происходит именно так, как было описано в главе 4, и здесь мы не будем повторно приводить всю эту информацию.
