- •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. Защищенные каналы
В предыдущих главах в качестве стандартного способа организации распределенных систем мы часто упоминали модель клиент-сервер. В этой модели серверы могут быть распределенными, реплицироваться, а также выступать в качестве клиентов по отношению к другим серверам. При обсуждении вопросов защиты в распределенных системах можно вновь вести разговор на примере клиентов и серверов. В частности, построение защищенной распределенной системы на практике сводится к двум основным моментам. Первый из них — построение защищенной связи между клиентом и сервером. Защищенная связь требует аутентификации сообщающихся сторон, кроме того, она гарантирует целостность сообщений, а возможно, и их конфиденциальность. Связь серверов внутри группы также можно рассматривать в качестве частного случая этой задачи.
Второй момент — способ авторизации. Как серверу, получившему запрос от клиента, распознать факт авторизации клиента для передачи этого запроса на обработку? Авторизация связана с проблемой управляемого доступа к ресурсам, который мы будем углубленно рассматривать в следующем разделе. Здесь мы сосредоточимся на защите связи в распределенных системах.
Идею о защите связи между клиентами и серверами можно изложить в понятиях организации между сообщающимися сторонами защищенного канала (secure channel) [479]. Защищенные каналы оберегают отправителя и получателя от перехвата, модификации и подделки сообщения. Обычно нет необходимости вводить защиту от прерывания связи. Защита сообщений от перехвата выполняется путем гарантированной конфиденциальности: защищенные каналы гарантируют, что сообщения в них не могут быть подсмотрены злоумышленниками. Защита сообщений от модификации или поделки производится при помощи протоколов взаимной аутентификации и целостности сообщений. Далее мы сначала обсудим различные протоколы аутентификации на основе криптосистем как с симметричными, так и с открытыми ключами. Детальный разбор логических построений, лежащих в основе аутентификации, можно найти в [254]. Мы рассмотрим отдельно вопросы конфиденциальности сообщений и их целостности.
8.2.1. Аутентификация
Перед тем как мы углубимся в детали различных протоколов аутентификации, следует заметить, что аутентификация и целостность сообщений не существуют отдельно друг от друга. Рассмотрим, например, распределенную систему, которая поддерживает аутентификацию двух общающихся между собой агентов, но не предоставляет механизмов проверки целостности сообщений. В такой системе
Боб может быть уверен, что сообщение т отправила Алиса. Однако, если Боб не может получить гарантии, что сообщение т в ходе пересылки не изменялось, что ему толку в знании того факта, что исходную версию сообщения отправила именно Алиса?
Представим таким же образом поддержку одной только целостности сообщений без механизма аутентификации. Когда Боб получает сообщение, в котором говорится, что он выиграл 1 ООО ООО долларов в лотерею, стоит ли ему радоваться, если он не в состоянии проверить, действительно ли это письмо прислано организаторами лотереи?
Таким образом, аутентификация и целостность сообщений должны идти «рука об руку». Во многих протоколах их комбинация работает примерно следующим образом. Предположим, что Алисе и Бобу снова не терпится пообщаться и Алиса берет инициативу по организации канала в свои руки. Она начинает этот процесс с посылки сообщения Бобу или доверенному третьему лицу, которое поможет устанавливать канал. Когда канал установлен, Алиса уверена, что она общается с Бобом, а Боб уверен, что общается с Алисой. Теперь они могут начать обмениваться сообщениями.
Чтобы в дальнейшем обеспечить целостность сообщений, которыми они будут обмениваться после аутентификации, обычно используется криптография с секретным ключом с использованием сеансовых ключей. Сеансовый ключ (session key) — это общий ключ, используемый для шифрования сообщений с целью соблюдения их целостности, а также, возможно, конфиденциальности. Этот ключ обычно требуется только в течение времени существования канала. После закрытия канала соответствующий сеансовый ключ отменяется (или уничтожается с соблюдением мер защиты). Позже мы еще вернемся к сеансовым ключам.
Аутентификация на основе общего секретного ключа
Начнем с того, что рассмотрим протокол аутентификации на основе секретного ключа, который используется Алисой и Бобом постоянно. Как эти двое могут в реальности безопасным образом получить общий ключ, мы обсудим чуть позже. В описании протокола мы сократим Алису и Боба соответственно до А и 5, а совместно используемый ими ключ обозначим как Клв. Обычно запрос одной из сторон вызывает ответ другой, который будет верен только в том случае, если эта другая сторона знает общий секретный ключ. Такие решения известны под названием протоколов запрос-ответ (challenge-response protocols).
В случае аутентификации на базе общего секретного ключа протокол работает так, как показано на рис. 8.11. Сначала Алиса посылает Бобу свой идентификатор (сообщение 1), показывая, что она хочет установить между ними канал связи. После этого Боб посылает Алисе запрос RB, обозначенный как сообщение 2. От Алисы требуется зашифровать запрос секретным ключом КЛ>В, который она использует совместно с Бобом, и вернуть этот запрос Бобу. Ответ, показанный на рисунке в виде сообщения 3, содержит KAB(RB).
Когда Боб получит ответ KA>B(RB) на свой запрос RB} он должен расшифровать сообщение, снова применяя общий ключ, чтобы убедиться, что в сообщении содержится запрос RB. Если это так, то он считает, что на другой стороне канала
находится Алиса, иначе кто же еще мог зашифровать запрос Rg с использованием ключа КА>в? Другими словами, Боб теперь уверен, что действительно общается с Алисой. Однако отметим, что Алиса пока еще не уверена в том, что на другой стороне канала действительно Боб. Поэтому она посылает запрос RA (сообщение 4), на который Боб отвечает, возвращая Ka,b(Ra), сообщение 5. Когда Алиса расшифрует его при помощи ключа Ка,в и обнаружит в нем запрос Ra, она поймет, что общается с Бобом.
Один из наиболее сложных моментов в обеспечении защиты — создание действительно работающих протоколов. Чтобы показать, как простые решения могут привести к ошибке, рассмотрим «оптимизацию» протокола аутентификации, в которой число сообщений сокращено с пяти до трех, как показано на рис. 8.12. Основная идея состоит в том, что если Алиса, в конце концов, все равно захочет отправить Бобу запрос, она вполне может отправить его вместе со своим уведомлением при создании канала. Точно так же и Боб, возвращая свой ответ на этот запрос, объединяет его в одно сообщение с собственным запросом.
Рис. 8.12. Аутентификация на базе общего секретного ключа с тремя, а не пятью сообщениями
К сожалению, долго этот протокол не проработает. Он с легкостью будет вскрыт при помощи так называемой атаки на отражении (reflection attack). Чтобы понять, что представляет из себя эта атака, предположим, что злоумышленника зовут Чак, мы будем обозначать его в нашем протоколе как С. Цель Чака — установить канал связи с Бобом и сделать так, чтобы Боб поверил, что разговаривает с Алисой. Чак может сделать это, если ему удастся правильно ответить на запрос Боба, например, вернув зашифрованную версию числа, присланного Бобом.
Поскольку он не знает ключа KAtB, это шифрование может произвести только сам Боб, и это именно то, на чем Чак должен надуть Боба.
Атаку иллюстрирует рис. 8.13. Чак начинает с посылки сообщения, содержащего уведомление А якобы от Алисы вместе с запросом R& Боб возвращает свой запрос Rg и ответ KA>B(Rc) в одном сообщении. После этого Чак должен показать, что он знает секретный ключ, вернув Бобу Ka,b(Rb)- К сожалению, у него нет ключа КА>в. Но он может установить второй канал связи с Бобом, чтобы тот сам зашифровал ему свой запрос.
Рис. 8.13. Атака на отражении
Таким образом, Чак отсылает А и RB в одном сообщении, как и раньше, но теперь притворяется, что ему нужен второй канал. На рис. 8.13 этому соответствует сообщение 3. Боб, не понимая, что он сам использовал ранее RB в качестве запроса, отвечает, посылая Ka>b(Rb) и другой запрос, RB2, как это показано в сообщении 4. В этот момент Чак получает KAB(RB) и заканчивает первый сеанс посылкой сообщения 5, содержащего отклик Ka>b(Rb), который и является ответом на запрос, присланный ему в сообщении 2.
Как было показано в [228], одна из ошибок, сделанных при адаптации оригинального протокола, состояла в том, что две стороны в новой версии протокола могут использовать одинаковые запросы в двух разных версиях протокола. Лучше было бы, если бы инициатор и его корреспондент использовали разные запросы. Так, например, если Алиса всегда использует нечетные числа, а Боб — четные, Боб смог бы догадаться, что задумал какой-то хитрец, приславший ему в качестве запроса в сообщении 3 RB (см. рис. 8.13). К сожалению, как показано в [404], такое решение неустойчиво к другим типам атак, например, так называемым атакам посредника. Вообще, позволять двум сторонам, вовлеченным в организацию защищенного канала, проделывать какие-то вещи одинаковым образом — не лучшая идея.
Другой момент, который делает адаптированный протокол непригодным, — то, что Боб отправляет важную информацию в виде отклика, KAb(Rb), не будучи уверенным в том, кому он ее посылает. Этот момент в исходном протоколе отсутствует, ведь Алиса должна сначала подтвердить себя, и только после этого Боб пошлет ей зашифрованную информацию.
Существуют и другие принципы, к пониманию которых постепенно, за много лет, пришли разработчики криптографических систем. Мы рассмотрим некоторые из них при обсуждении других протоколов. Один из важных уроков состоит в том, что разрабатывать протоколы защиты, которые делают то, на что они рассчитаны, часто значительно труднее, чем кажется. Итак, как мы только что видели, упрощая существующие протоколы с целью поднятия их производительности, можно легко сделать эти протоколы непригодными. Дополнительную информацию о принципах разработки протоколов можно получить из [1].
Аутентификация с использованием центра распространения ключей
Одна из проблем, возникающих при работе с общим секретным ключом, — это проблема масштабируемости. Если распределенная система включает в себя N хостов и каждый хост должен использовать секретный ключ совместно с другими N- 1 хостами, система в целом вынуждена содержать N(N- 1)/2 ключей, а каждый хост — поддерживать N - 1 из них. При больших N это становится проблемой. Альтернативой является подход с использованием центра распространения ключей (Key Distribution Center, KDC). KDC позволяет каждому из хостов применять собственный ключ, при этом ни одной паре хостов специальный секретный ключ не требуется. Другими словами, при наличии KDC требуется поддерживать только N ключей вместо N(N- 1)/2, а это уже явное улучшение.
Когда Алиса хочет установить защищенный канал связи с Бобом, она может сделать это при помощи доверенного центра KDC. Основная идея состоит в том, что KDC поддерживает ключи Алисы и Боба, которые они могут использовать при обмене сообщениями, что и показано на рис. 8.14.
Рис. 8.14. Принцип использования KDC
Сначала Алиса посылает в центр KDC сообщение о том, что она хочет связаться с Бобом. KDC отвечает Алисе, посылая сообщение, содержащее общий секретный ключ КА>В, который она может задействовать для этой цели. Сообщение зашифровано секретным ключом Ka>kdc, который Алиса использует совместно с KDC. Кроме того, KDC и Бобу посылает ключ КА>В, но зашифрованный теперь уже секретным ключом Kb,kdc> который используется центром совместно с Бобом.
Основой минус такого подхода состоит в том, что Алиса может захотеть начать организацию защищенного канала связи с Бобом раньше, чем Боб получит их общий ключ от KDC. Кроме того, KDC может потребовать поставить Боба в цикл ожидания для получения им ключа. Эти проблемы можно обойти, если KDC просто вернет Kb,kdc(Ka,b) Алисе и возложит на нее всю ответственность за дальнейшую организацию связи с Бобом. Это приведет нас к протоколу, показанному на рис. 8.15. Сообщение Kb,kdc(Ka,b) также известно под названием талона (ticket). Дело Алисы передать этот талон Бобу. Отметим, что Боб — единственный, кто может осмысленно использовать этот талон, поскольку он — единственный, кроме центра KDC, кто знает, как расшифровать это сообщение и извлечь из него полезную информацию.
Рис. 8.15. Использование талона и передача Алисе права на установление контакта с Бобом
Протокол, показанный на рис. 8.15, на самом деле является одним из вариантов протокола аутентификации с использованием KDC, известного под названием протокола аутентификации Нидхема—Шредера (Needham—Schroeder authentication protocol), названного так по имени его создателей [311]. Другой вариант этого протокола используется в системе Kerberos, которую мы рассмотрим чуть позднее. Протокол Нидхема—Шредера — это многоканальный протокол запрос/ответ, работающий следующим образом (рис. 8.16).
Рис. 8.16. Протокол аутентификации Нидхема—Шредера
Когда Алиса собирается организовать защищенный канал связи с Бобом, она посылает KDC сообщение, содержащее запрос RA, вместе со своим идентификатором А и, разумеется, идентификатором Боба. KDC отвечает на этот запрос, выдавая ей талон Kb,kdc(Ka,b) вместе с секретным ключом KAtB, который она далее будет использовать совместно с Бобом.
Запрос RAu который Алиса посылает KDC вместе со своим требованием на создание канала связи с Бобом, также известен под названием попсе и представляет собой случайное число, которое используется только однажды. Основная задача этого «одноразового» случайного числа — единственным образом привязать одно сообщение из пары к другому, в данном случае — связать сообщения 1 и 2. В частности, при включении RA\ в сообщение 2 Алиса будет твердо знать, что сообщение 2 отправлено в ответ на сообщение 1 и не является, например, ответом на другое, более старое сообщение.
Чтобы как следует понять проблему, допустим, что мы не используем случайное число, а Чак ухитрился стянуть один из старых ключей Боба, назовем его K>lbdkd& Кроме того, Чак перехватил старый ответ Ka,kdc(B, KAtB, K°b,kdc(A, Ка,в))> который вернул центр KDC в ответ на предыдущий запрос Алисы на организацию связи с Бобом. Тем временем Боб договорился с KDC об использовании нового общего секретного ключа. Однако Чак терпеливо ожидает того момента, когда Алиса вновь начнет организовывать защищенный канал связи с Бобом. В этот момент он воспроизводит старый ответ и обманывает Алису, заставляя ее поверить, что она действительно общается с Бобом, поскольку ее талон расшифрован, а значит, он доказал, что знает их общий секретный ключ КА,в-
Включив в сообщение случайное число, мы делаем подобную атаку невозможной, поскольку воспроизведение старого ответа будет немедленно раскрыто. В частности, случайное число ответа не совпадет со случайным числом исходного сообщения.
Сообщение 2 также содержит J5, идентификатор Боба. Путем включения В в сообщение центр KDC защищает Алису от очередной атаки. Предположим, что идентификатор В в сообщении 2 отсутствует. Чак может модифицировать сообщение 1, заменив идентификатор Боба своим идентификатором, скажем, С. После этого KDC решит, что Алиса хочет создать защищенный канал с Чаком и ответит в соответствии с этим предположением. Как только Алиса захочет пообщаться с Бобом, Чак будет перехватывать ее сообщения и обманывать Алису, заставляя ее поверить, что она связана с Бобом. При копировании идентификатора из сообщения 1 в сообщение 2 Алиса немедленно обнаружит, что ее запрос был изменен.
После того как KDC передаст Алисе талон, можно организовывать защищенный канал между Алисой и Бобом. Алиса начинает этот процесс с посылки сообщения 3, которое содержит талон для Боба и запрос Ra2, зашифрованный их общим ключом Кл,в, который только что был создан KDC. Боб расшифровывает талон, чтобы получить общий ключ, и возвращает отклик, Ra2~ 1, вместе с запросом RB к Алисе.
Следует сделать по поводу сообщения 4 следующее замечание. Вообще говоря, возвращая отклик Ra2 - 1, а не просто /?л2, Боб не только доказывает, что он знает общий секретный ключ, но также и то, что он действительно расшифровал запрос. И вновь это связывает сообщение 4 с сообщением 3, таким же образом, как случайное число RA связывало сообщение 2 с сообщением 1. Таким образом, протокол становится более защищенным от повторного воспроизведения сообщений.
Однако в этом конкретном случае может быть достаточно вернуть Ka,b(Ra2, RB) по той простой причине, что это сообщение нигде ранее в протоколе не используется. Отклик KAb(Ra2> Rb) всегда доказывает, что Боб в состоянии расшифровать запрос, присланный ему в сообщении 1. Сообщение 4, так как оно приведено на рис. 8.16, сохранено по историческим причинам.
У приведенного здесь алгоритма Нидхема—Шредера имеется одно слабое место. Если Чаку каким-то образом удастся завладеть старым ключом КА>В, он может просто повторить посылку сообщения 3, требуя от Боба установки канала. Боб может поверить, что он общается с Алисой, хотя на самом деле на другом конце канала будет Чак. В этом случае мы должны соотнести сообщение 3 с сообщением 1, то есть сделать так, чтобы ключ зависел от исходного запроса, посылаемого Алисой для организации канала связи с Бобом. Это решение представлено на рис. 8.17.
Рис. 8.17. Защита от злонамеренного повторного использования сгенерированного ранее сеансового ключа в протоколе Нидхема—Шредера
Фокус состоит в том, чтобы включить случайное число в ответ, посылаемый Алисе из KDC. Причем случайное число должно прийти от Боба — это уверит Боба, что тот, кто пытается установить с ним защищенный канал связи, получил соответствующую информацию от KDC. Таким образом, Алиса сначала просит Боба послать ей случайное число Rb\, зашифрованное ключом, который совместно используется Бобом и KDC. Алиса включает это случайное число в свой запрос к центру KDC, который расшифровывает его и помещает результат в создаваемый талон. Тем самым Боб убеждается в том, что сеансовый ключ связан с исходным требованием Алисы на организацию связи с Бобом.
Аутентификация на основе криптосистем с открытым ключом
Обсудим теперь аутентификацию на основе криптосистем с открытым ключом, которым не нужен центр KDC. Давайте снова рассмотрим тот случай, когда Алиса хочет организовать защищенный канал связи с Бобом, причем оба они владеют
открытыми ключами друг друга. Типичный протокол аутентификации на основе криптосистем с открытым ключом показан на рис. 8.18.
Р
ис.
8.18. Взаимная
аутентификация в криптосистемах с
открытым ключом
Алиса начинает с того, что посылает Бобу запрос Ra, зашифрованный его открытым ключом Кв. Дело Боба расшифровать это сообщение и вернуть Алисе свой запрос. Поскольку Боб — единственный, кто в состоянии расшифровать это сообщение (используя закрытый ключ, соответствующий открытому ключу Алисы), Алиса будет знать, что общается с Бобом. Отметим важность того, что Алиса гарантированно использует открытый ключ Боба, а не кого-то другого, кто притворяется Бобом. Как можно получить эту гарантию, мы обсудим чуть позже.
Когда Боб получает от Алисы требование на создание канала, он возвращает расшифрованный запрос вместе со своим собственным запросом Rb для аутентификации Алисы. Кроме того, он создает сеансовый ключ Кл,в, который можно будет использовать для дальнейшей работы. Ответ Боба на запрос Алисы, его собственный запрос и сеансовый ключ помещаются в сообщение, которое шифруется открытым ключом Ка, принадлежащим Алисе (сообщение 2). Только Алиса в состоянии расшифровать это сообщение, используя закрытый ключ К а, соответствующий открытому ключу Ка.
И, наконец, Алиса возвращает свой ответ на запрос Боба, используя сеансовый ключ КА,в, созданный Бобом. Таким образом, она показывает, что в состоянии расшифровать сообщение 2, а значит, та, с кем общается Боб, — действительно Алиса.
