- •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. Именование
- •Синхронизация
- •Кэширование и репликация
- •Отказоустойчивость
8.2.3. Защищенное групповое взаимодействие
До сих пор наше внимание было сосредоточено на вопросе организации защищенных каналов связи между двумя сторонами. В распределенных системах, однако, часто необходимо поддерживать защищенную связь между большим количеством сторон. Типичный пример этого — реплицируемый сервер, для которого все связи между репликами следует защищать от изменения, подделки и перехвата так же, как защищенный канал между двумя пользователями. В этом подразделе мы поближе познакомимся с вопросами защищенного группового взаимодействия.
Конфиденциальное групповое взаимодействие
Для начала обсудим проблему защиты взаимодействия в группе из N пользователей от подслушивания. Простейшей схемой обеспечения конфиденциальности будет совместное использование всей группой одного секретного ключа для шифрования и расшифровки сообщений, передаваемых членами группы друг другу. Поскольку секретный ключ в этой схеме совместно используется всеми членами группы, необходимо, чтобы все участники верили, что ключ действительно секретный. Это требование само по себе делает использование одного общего секретного ключа при групповом взаимодействии значительно более уязвимым для атак по сравнению с двухсторонним защищенным каналом.
Альтернативное решение — каждая пара членов группы совместно использует отдельные ключи. Как только один из членов начнет допускать потерю информации, другие члены группы просто прекращают посылать ему сообщения, но продолжают применять для связи друг с другом старые ключи. Однако в отличие от предыдущего случая с поддержкой одного ключа теперь нужно поддерживать N(N- 1)/2 ключей, что уже само по себе может быть непросто.
Облегчить положение может помочь криптосистема с открытым ключом. Тогда каждый член группы будет иметь собственную пару (открытый ключ, закрытый ключ), в которой открытый ключ будет использоваться всеми членами группы для посылки конфиденциальных сообщений. В этом случае требуется всего ЛГпар ключей. Если один из членов группы перестает внушать доверие, он просто удаляется из группы, при этом другие ключи не затрагиваются.
Защищенная репликация серверов
Теперь обсудим совсем другую проблему: клиента, посылающего запрос группе реплицируемых серверов. Серверы могут реплицироваться по разным причинам: для защиты от сбоев, для повышения производительности. Но в любом случае клиент ожидает, что ответ будет заслуживать доверия. Другими словами, независимо от того, подвержена ли группа серверов византийским ошибкам, которые мы обсуждали в предыдущей главе, клиент ожидает, что защите возвращенного ему результата ничто не будет угрожать. Подобные атаки могут произойти в случае успешного взлома злоумышленником одного или нескольких серверов.
Способом защиты клиента от подобных атак является сбор ответов всех серверов с идентификацией каждого из них. Если ответы невзломанных (то есть аутен-тифицированных) серверов составляют большинство, клиент может считать, что ответ корректен. К сожалению, подобный подход нарушает прозрачность репликации серверов.
В [376] было предложено решение для защищенного реплицируемого сервера, позволяющее сохранить прозрачность репликации. Достоинство такого подхода состоит в том, что клиенты остаются в неведении о реальных репликах и поэтому значительно проще скрытно добавлять и удалять реплики. Мы вернемся к вопросу управления защищенными группами ниже, при обсуждении вопросов управления ключами.
Смысл защищенных и прозрачно реплицируемых серверов кроется в том, что называется разделением секрета (secret sharing). При разделении секрета ни один из нескольких пользователей (или процессов) не знает секрета целиком, секрет может быть открыт только в случае их совместной работы. Такие схемы могут быть очень удобными. Рассмотрим, например, запуск ракеты с ядерной боеголовкой. Это действие требует подтверждения как минимум двумя людьми. Каждый из них имеет собственный закрытый ключ, причем для пуска он должен использоваться в паре с другим. Попытка пуска с помощью единственного ключа ни к чему не приведет.
В случае защищенных реплицируемых серверов при поиске ответа максимум k из N серверов могут дать неверный ответ, а из этих k максимум с < k серверов могут быть действительно взломаны злоумышленником. Отметим, что это требование предполагает, что служба устойчива к k ошибкам. Этот вопрос мы обсуждали в предыдущей главе. Разница состоит в том, что сейчас серверы, которые работают ошибочно, взломаны намеренно.
Теперь рассмотрим ситуацию, когда серверы активно реплицируются. Другими словами, запрос рассылается всем серверам одновременно, после чего обрабатывается каждым из них. Каждый сервер генерирует ответ, который возвращается клиенту. В случае защищенной реплицируемой группы серверов предполагается, что каждый сервер сопровождает свой ответ цифровой подписью. Если г,- — ответ сервера 5„ то пусть md(r{) обозначает дайджест сообщения, вычисленный сервером 5,-. Этот дайджест подписан закрытым ключом KJ сервера 5,-.
Представим себе, что мы хотим защитить клиента от максимум с взломанных серверов. Другими словами, группа серверов должна быть в состоянии скрыть последствия взлома максимум с серверов, оставаясь при этом в состоянии сгенерировать ответ, которому клиент сможет доверять. Если подписи отдельных серверов можно скомбинировать таким образом, чтобы построение правильной подписи для результата требовало минимум с + 1 подписей, это решает проблему. Другими словами, мы хотим, чтобы реплицируемые серверы создавали секретную правильную подпись так, чтобы с взломанных серверов были не в состоянии собрать эту подпись без помощи минимум одного «честного» сервера.
В качестве примера рассмотрим группу из пяти реплицируемых серверов, которые должны быть в состоянии выдержать взлом двух из них и давать при этом
результат, которому сможет доверять клиент. Каждый сервер 5, посылает ответ гг вместе со своей подписью sig(Si, г,) = Kj(md(ri)) клиенту. Соответственно, клиент последовательно получает пять триплетов <r„ md(ri), sig(Si} г,)>, из которых он должен выделить правильные. Эту ситуацию иллюстрирует рис. 8.21.
Рис. 8.21. Разделяемая секретная подпись группы реплицируемых серверов
Каждый дайджест md{r^) вычисляется также и на клиенте. Если ответ г, неверен, это обычно можно определить, вычислив K+j(Kj(md(ri))), однако, поскольку мы не можем доверять ни одному серверу в отдельности, этот метод применять нельзя. Вместо него клиент использует специальную открытую функцию расшифровки Д которая в качестве исходных данных получает набор из трех сигнатур V= { sig(S, г), sig(S', г'), sig(S", г")}, а в качестве результата генерирует единственный дайджест:
dout = D(V) = D(sig(S, г), sig(S\ г'), sig(S", г")).
Детали о функции расшифровки D можно найти в [376]. Существует 5!/(3!2!) = 10 комбинаций трех подписей, которые клиент может получить в качестве результата D. Если одна из этих комбинаций даст правильный дайджест md(ji) для некоторого результата г„ клиент может считать ответ г, правильным. В частности, он может считать, что этот результат дан как минимум тремя правильно работающими серверами.
Для повышения прозрачности репликации в [376] предлагается, чтобы каждый сервер Si рассылал свой результат г, остальным серверам вместе с соответствующей подписью sig(Su г,). Когда сервер получит как минимум с + 1 подобных сообщений, включая его собственное, он сможет вычислить правильную подпись для одного из ответов. Если, например, это вычисление для ответа г и набора V из с + 1 подписей будет успешным, он пересылает г и У клиенту одним сообщением. Клиент после этого проверяет корректность г путем проверки подписи, то есть того, что md(r) = D( V).
Описанный нами алгоритм известен как т,п-пороговая схема (m,n-threshold scheme), где, в случае нашего примера, m = c + l,a??=N (число серверов). В 7?2,я-порого-вой схеме сообщение делится на п частей, известных под названием теней (shadows). Для воссоздания исходного сообщения могут быть использованы любые т теней, но любых т - 1 теней для этого будет недостаточно. Существует несколько способов построения т,я-пороговых схем. Подробности можно найти в [404].
