SPKM | это... Что такое SPKM? (original) (raw)

SPKM (англ. The Simple Public-Key GSS-API Mechanism — простой механизм[1] GSS-API на основе инфраструктуры с открытым ключом) — сетевой протокол, обладающий инфраструктурой с открытым, а не симметричным ключом. Протокол применяется для аутентификации, формирования ключей, сохранения целостности и конфиденциальности данных.

Содержание

История и причины появления

В сентября 1993 года была опубликована первая версия GSS-API[2][3], и к этому же времени появляется механизм Kerberos V5[4]. Но несмотря на то, что Kerberos 5 стал широко используемым, устоявшимся во многих системах протоколом, в некоторых приложениях было необходимо иметь GSS-API, построенный на инфраструктуре с открытыми, а не симметричными ключами. Это привело к созданию Карлайлом Адамсом (Carlisle Adams) в октябре 1996 года протокола SPKM (его первых двух разновидностей). Однако, при создании в 2000 году NFSv4 возникла проблема взаимной аутентификации и создания защищенного канала между анонимным пользователем и сервером, что привело к появлению SPKM-3.

Особенности протокола

Из выше перечисленных свойств следует, что SPKM обладает гибкостью и функциональностью, без излишней сложности и накладных расходов на внедрение. Так как SPKM соответствует GSS-API, то он может быть использован приложением в качестве альтернативного сетевого протокола безопасности (например вместо Kerberos)[6].

Обзор

Описание общего программного интерфейса служб безопасности (GSS-API), согласно можно разделить на 2 части[2]:

SPKM является примером последнего типа документов, и поэтому называется «GSS-API механизм». Этот механизм обеспечивает проверку подлинности, создание ключей, целостность данных, и конфиденциальность данных в распределенных приложениях в режиме он-лайн, с использованием инфраструктуры открытых ключей. SPKM может быть использован, как замена любому другому приложению, использующему службы безопасности через GSS-API вызовы (например, приложение, которое уже использует Kerberos GSS-API). Использование инфраструктуры открытых ключей позволяет использовать электронные подписи для поддержания невозможности отказа от авторства при обмене сообщениями, а также предоставляет другие преимущества, такие как масштабируемость для больших групп пользователей.

Маркеры, определенные в SPKM, предназначены для использования прикладными программами в соответствии с рабочей парадигмой GSS-API[2]. Она работает следующим образом. Обычно GSS-API вызывается сетевым протоколом (или приложением его использующим) для того, чтобы защитить соединение с помощью аутентификации, служб обеспечения конфиденциальности и/или целостности данных. При вызове GSS-API протокол (приложение) принимает маркеры, предоставленные ему своей (локальной) реализацией GSS-API (то есть GSS-API механизмом), и передает маркеры на удаленную систему, на том конце происходит получение маркера и его дальнейшая обработка уже своим GSS-API механизмом. Таким образом, GSS-API сам по себе не обеспечивает сервисов безопасности, вместо этого он обеспечивает интерфейс между приложениями и реализациями GSS-API (механизмами). А они в свою очередь обеспечивают совместимый с GSS-API интерфейс, позволяя создавать приложения, способные работать с разными механизмами безопасности; позволяя заменять механизмы без необходимости переписывать приложения.

Алгоритмы

Для того чтобы обеспечить хотя бы минимальную совместимость между различными реализациями SPKM, один из алгоритмов целостности был сделан обязательным (MANDATORY), а все остальные алгоритмы и примеры поддерживаются различными реализациями опционально, некоторые алгоритмы также обозначены как рекомендуемые (RECOMMENDED), это сделано для увеличения совместимости[6].

В протоколе SPKM используются следующие алгоритмы:

Алгоритмы целостности данных

Используются, чтобы убедится, что данные не были изменены третьей стороной. В зависимости от алгоритма, может обеспечивать также достоверность и невозможность отказа от авторства сообщения.

В качестве примеров могут использоваться следующие алгоритмы (ниже указаны идентификаторы алгоритмов):

md5WithRSAEncryption OBJECT IDENTIFIER ::= { iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) pkcs-1(1) 4 //заимствовано из PKCS#1 }

Данный алгоритм является обязательным (MANDATORY) для SPKM. Он обеспечивает целостность и подлинность данных, а также невозможность отказа от авторства, вычисляя электронную RSA подпись на основе MD5 хеш-функции. Так как на данный момент этот алгоритм является единственным обязательным алгоритмом проверки целостности и подлинности, то для обеспечения взаимодействия было также предусмотрено, чтобы md5WithRSA был алгоритмом подписи всех маркеров установления соединения, в которых целостность проверяется с помощью подписи, а не на основе MAC. Возможно в будущем появятся и другие обязательные алгоритмы, и тогда это условие, накладываемое на маркеры исчезнет[6].

DES-MAC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) //хранит длину MAC в битах как целое число, algorithm(2) 10 //ограниченное кратными 8, от 16 до 64 }

Этот алгоритм является рекомендуемым (RECOMMENDED), целостность обеспечивается посредством использования MAC на основе DES.

md5-DES-CBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) dod(6) internet(1) security(5) integrity(3) md5-DES-CBC(1) }

Здесь целостность данных обеспечивается шифрованием на основе DES-CBC и «замешанного» MD5-хеширования. Это на практике быстрее, чем вычисление DES-MAC, если входные данные малы (порядка нескольких байт). Заметим, что без «замешивания» стойкость целостности механизма не более или равна стойкости DES при атаке с известным открытым текстом.

sum64-DES-CBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) dod(6) internet(1) security(5) integrity(3) sum64-DES-CBC(2) }

Данный алгоритм обеспечивает целостноcть данных посредством шифрования с помощью DES CBC. Конкатенация «замешанных» данных и суммы всех входных блоков данных (сумма вычисляется с помощью сложения по модулю 264 — 1). Таким образом, в этом алгоритме, шифрование является необходимым условием обеспечения целостности данных[6].

Алгоритмы конфиденциальности

Эти симметричные алгоритмы используются для шифрования данных для вызовов GSS-API : gss_seal() / gss_wrap().

Пример:

DES-CBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithm(2) 7 }

Этот алгоритм является рекомендуемым (RECOMMENDED).

Алгоритмы образования ключа

Используются для создания симметричного ключа используемого узлами во время соединения. Далее из этого ключа создаются подключи для алгоритмов целостности и конфиденциальности. Создание ключа проходит во время обмена аутентификациями по стандарту X.509, так что полученный симметричный ключ является аутентифицированным.

Примеры:

RSAEncryption OBJECT IDENTIFIER ::= { iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) pkcs-1(1) 1 // заимствовано из PKCS#1 и RFC-1423 }

В этом обязательном (MANDATORY) алгоритме ключ соединения создается его инициатором с помощью открытого RSA ключа цели и посылается ей. Цели, в свою очередь, не обязательно отвечать, чтобы ключ был создан.

dhKeyAgreement OBJECT IDENTIFIER ::= { iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) pkcs-3(3) 1 }

В этом примере ключ создается обоими узлами с использованием алгоритма Диффи-Хеллмана. Таким образом, цель должна ответить инициатору для установления соединения (следовательно, этот алгоритм не может быть использован с односторонней аутентификацией в SPKM-2).

Односторонняя функция для алгоритма получения подключей

Создав ключ соединения с помощью K-ALG, узлы должны получить набор подключей для алгоритмов конфиденциальности и целостности. Для этого используются односторонние функции. Пусть перечень принятых алгоритмов конфиденциальности пронумерован последовательно, то есть первому алгоритму (алгоритму по умолчанию) присвоен номер 0, второму — номер 1 и так далее. Пусть список алгоритмов целостности пронумерован таким же образом. Наконец, пусть ключ соединения будет двоичной строкой произвольной длины M, с учетом ограничений:

L ≤ M ≤ U

Битовая длина ключа соединения должна быть больше, чем наибольшая битовая длина подключей (C-ALG или I-ALG), и, в то же время, она ограничена сверху входными параметрами алгоритма формирования ключа (K-ALG).

Например, при использовании DES и 3-DES в алгоритмах конфиденциальности и DES-MAC в алгоритме целостности, ключ соединения должен составлять, по крайней мере, 112 бит. А при использовании 512-битного RSA, возможная длина составляет 424 бит (наибольший допустимый входной параметр RSAEncryption, описанный в PKCS#1). С другой стороны, при использовании алгоритма dhKeyAgreement, ключ соединения вычисляется по алгоритму Диффи-Хеллмана (за исключением старшего байта, который отбрасывается по соображениям безопасности), таким образом его длина будет на 8 битов меньше чем модуль p, что составляет примерно 1000 бит[6].

Алгоритм получения k-битного подключа определяется следующим образом:

rightmost_k_bits ( OWF ( context_key || x || n || s || context_key ) ) где:

context_key — ключ соединения;
x — ASCII символ «C» (0x43) при создании подключа для алгоритма конфиденциальности, ASCII символ «I» (0x49) при создании подключа для алгоритма целостности;
n — номер алгоритма в соответствующем разрешенном списке (ASCII символ «0» (0x30), «1» (0x31), и так далее);
s — «этап» обработки — всегда равняется ASCII символом «0» (0x30), если «k» не больше выходного размера односторонней функции (OWF), в этом случае односторонняя функция считается повторно с увеличением значения «этапа» (каждое выходное значение OWF дописывается к концу предыдущих), до тех пор, пока не будет образовано «k» битов;
|| — операция конкатенации;
OWF — соответствующая односторонняя функция.

Примеры:

**MD5 OBJECT IDENTIFIER** ::= { iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5 }

Этот алгоритм является обязательным (MANDATORY).

**SHA OBJECT IDENTIFIER** ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithm(2) 18 }

Следует отметить, что существующие хеш-функции не соответствуют всем свойствам односторонних функций. Поэтому в процессе установления соединения применяется согласование алгоритма получения подключей, что позволяет в будущим согласовывать улучшения односторонней функции со старыми версиями.

Согласование

В процессе установления соединения в SPKM, инициатор предлагает ряд возможных алгоритмов конфиденциальности и целостности данных (в том числе и алгоритмов электронной подписи). Приемник выбирает какие алгоритмы будут использоваться в установленном соединении и отсылает подкорректированный список поддерживаемых алгоритмов обратно. В каждом сообщении, передаваемом по установленному соединению, может быть использован любой алгоритм конфиденциальности и целостности, причем указанные на первом месте в списке алгоритмы являются выбранными по умолчанию. Принятые для данного соединения алгоритмы конфиденциальности и целостности определяют значения параметра качества защиты (Quality Of Protection), используемого функциями gss_getMIC() и gss_wrap(), которые вычисляют криптографические коды целостности сообщения и пришивают его к сообщению. Если ответа от приемника не ожидается (односторонняя аутентификация в SPKM-2), то алгоритмы предлагаемые источником и будут использоваться в процессе передачи сообщений. Если же приемник не поддерживает применяемые алгоритмы, то он посылает маркер завершения соединения (delete token) источнику и соединение разрывается.

Кроме того, в первом маркере установления соединения источник предлагает ряд возможных алгоритмов образования ключа (K_ALG) вместе с ключом (или половиной ключа), отвечающим первому алгоритму в списке. Если этот алгоритм неприемлем, то приемник должен выбрать один из оставшихся в списке и послать свой выбор вместе с ключом (половиной), отвечающим выбранному алгоритму. Если в присланном приемнику списке нет поддерживаемого им алгоритма, то он посылает источнику маркер разрыва соединения. При необходимости (если приемник выбирает двусторонний алгоритм образования ключа, как в случае с использованием алгоритма Диффи-Хеллмана), источник пошлет свою половину ключа обратно к приемнику. Наконец, в первом маркере установления соединения источник предлагает ряд разрешенных алгоритмов образования подключей, если же используется односторонняя аутентификация, то предлагается только один алгоритм. Алгоритм (единственный), выбранный приемником становится алгоритмом получения подключа в установленном соединении[6].

Пример установления, использования и разрыва соединения

Пример установления, использования и разрыва соединения при помощи маркеров

Для того, чтобы понять механизм работы маркеров, используемых в SPKM обратимся к примеру установления соединения на основе случайных чисел. Мы не будем рассматривать все доступные маркеры и функции, для ознакомления со всем списком и для просмотра их описания и реализации лучше обратиться к RFC 2025.

На представленной схеме инициатор соединения вызывает функцию gss_init_sec_context(), которая возвращает маркер SPKM_REQ, который затем пересылается приемнику по используемому сетевому протоколу. Приемник, получив этот маркер, передает его gss_accept_sec_context(), которая возвращает в качестве результата SPKM_REP_TI. Его приемник отсылает обратно инициатору. Тот, в свою очередь, использует этот маркер, как входной параметр во время второго вызова gss_init_sec_context(). Если инициатором использовалась односторонняя аутентификация, то на этом установление соединения заканчивается. В противном случае (например, если изначально требуется взаимная аутентификация) gss_init_sec_context() возвращает SPKM_REP_IT, который посылается приемнику. Тот использует этот маркер во время второго вызова gss_accept_sec_context() и, тем самым, завершает установку соединения. После этого, стороны могут обмениваться маркерами SPKM_MIC и SPKM_WRAP до тех пор, пока одна из сторон не пошлет SPKM_DEL для разрыва соединения[5].

Маркер SPKM_REQ содержит, среди других полей данных, следующие пункты:

Целостность этих данных защищается, а также они подписываются электронной подписью инициатора соединения. Если же он пожелал остаться анонимным, в этом случае целостность защищается при помощи MAC. При необходимости в этом маркере может отсылаться информация о цифровых сертификатах.

Маркер SPKM_REP_TI содержит:

Целостность этих данных защищается, а также они подписываются электронной подписью приемника. Заметим, что подписанное приемником случайное число инициатора, дает ему гарантию того, что приемник «живой» и достоверный. В этом маркере может отсылаться информация о цифровых сертификатах, если это было потребовано инициатором в SPKM_REQ.

Если было выбрана взаимная аутентификация, то используется маркер SPKM_REP_IT, содержащий следующие поля:

Целостность этих данных защищается, а также они подписываются электронной подписью инициатора. Заметим, что подписанное инициатором случайное число приемника, дает ему гарантию того, что инициатор «живой» и достоверный.

По завершению установления соединения на основе случайных чисел, обе стороны аутентифицированы (без использования меток доверенного времени), ключ соединения был безопасно установлен, два набора алгоритмов (конфиденциальности и целостности) согласованы для использования в соединении операциями MIC и WRAP. Каждый SPKM_MIC, SPKM_WRAP, а также SPKM_DEL маркер может явно указывать соответствующий алгоритм из согласованного списка, который будет использоваться для данных, связанных с маркером, или же использовать алгоритмы «по умолчанию» (то есть первые алгоритмы в каждом из списков).

SPKM_MIC — используется для подписи и проверки целостности данных (gss_sign() / gss_getMIC())

SPKM_WRAP — используется для шифрования (расшифровки) и защиты конфиденциальности данных (gss_seal() / gss_wrap())

SPKM_DEL — для разрыва соединения (gss_delete_sec_context()).

Поэтому маркеры содержат следующую информацию:

Этот формат маркеров дает большую гибкость при вызове приложений, чтобы выбрать то качество защиты (QOP), которое подходит для защищаемых данных в пределах установленного соединения[5].

Разновидности

Изначально были описаны две разновидности SPKM: SPKM-1 и SPKM-2, основным отличием, которых является то, что SPKM-2 требует наличие меток доверенного времени с целью повторного обнаружения во время установления соединения, а в SPKM-1 не требует. Это обеспечивает большую гибкость для приложений, так как в системе не всегда возможно использование меток доверенного времени. При создании в 2000 году протокола NFSv4 возникла необходимость в механизме, предусматривающем создание защищенного канала со взаимной аутентификацией, где:

  1. Как пользователи, так и сервер проводят аутентификацию с использованием сертификатов открытого ключа
  2. Сервер устанавливает подлинность по сертификатам открытого ключа, а пользователи по логину и паролю.
  3. Клиент остается анонимным, а сервер использует сертификаты открытого ключа.

Так появился SPKM-3, который, используя надстройку LIPKEY, лежит в основе работы сетевых файловых систем[8][9]. В первую очередь он создан для упрощения процедуры аутентификации. Рассмотрим подробнее этот механизм.

Клиент:

Таким образом, между клиентом и сервером установлено защищенное соединение, как видно здесь применяется алгоритм Диффи — Хеллмана. Клиент может предоставить свой логин и пароль для аутентификации (или же сертификаты), однако, это не является обязательным, то есть клиент может оставаться анонимным.

Как видно, используемый механизм аутентификации аналогичен TLS, но вместе с простотой и удобством он также унаследовал и главный недостаток — возможность атаки человек посередине[10].

GSS-API

GSS-API (англ. Generic Security Service - Application Programming Interface — служба общей безопасности — интерфейс программирования приложений) позволяет приложению аутентифицировать пользователя, соответствующего другому приложению, с целью предоставления ему прав, и применить службы безопасности конфиденциальности и целостности данных для каждого сообщения.

Существует 4 этапа использования GSS-API:

  1. Приложение получает ряд удостоверений, с помощью которых оно может доказать свою подлинность другим процессам. При этом удостоверение приложения отвечает глобальной учетной записи, которая может быть, и не связана с локальной.
  2. С помощью своих удостоверений пара общающихся приложений устанавливает безопасное соединение, которое представляет собой пару структур данных GSS-API содержащих общую информацию состояния. Эта информация необходима для того чтобы обеспечить применение служб безопасности для каждого сообщения. В качестве этой информации могут выступать криптографические ключи и порядковые номера сообщений. В процессе установления безопасного соединения, инициатор этого соединения должен быть аутентифицирован другой стороной (приемником), и также может требовать аутентификации приемника. Инициатор может отдать приемнику право инициировать безопасные соединения на своих правах, что возможно, если создать ряд удостоверений схожих с удостоверениями инициатора, с тем отличием что их может использовать приемник. Для того чтобы создать и поддерживать общую информацию, обуславливающую безопасное соединение, определенные GSS-API вызовы возвращают метку структуры данных, которая содержит криптографически защищенные данные. Метка передается в соответствии с выбранным сетевым протоколом и, приняв ее, удаленное приложение извлекает необходимую информацию и обновляет состояние безопасного соединения.
  3. Для каждого сообщения службы безопасности направлены либо на обеспечение целостности данных и проверки их происхождения, либо еще и на обеспечение конфиденциальности. При этом данные приложения рассматриваются GSS-API как случайные 8-символьные строки. При передаче сообщения, нуждающегося в защите, приложение вызывает соответствующую GSS-API функцию (например, gss_wrap()), указывая используемое соединение, и посылает полученную метку принимающей стороне. Та в свою очередь передает эту метку соответствующей функции расшифровки и получает исходное сообщение.
  4. При завершении сессии обе стороны вызывают функцию разрыва соединения.

Примечания

  1. Механизм (mechanism) — реализация нижележащего уровня GSS-API, обеспечивающая фактические имя, удостоверение и маркеры
  2. 1 2 3 RFC 1508
  3. RFC-1509
  4. RFC- 1510
  5. 1 2 3 Carlisle Adams IDUP and SPKM: Developing Public-Key-Based APIs and Mechanisms for Communication Security Services
  6. 1 2 3 4 5 6 RFC 2025
  7. Маркер (token) — непрозрачное (для приложения) сообщение, которое отсылается на этапе установления соединения или в ходе передачи защищённого сообщения
  8. RFC 3530 — Network File System (NFS) version 4 Protocol
  9. RFC 2847 — LIPKEY — A Low Infrastructure Public Key Mechanism Using SPKM
  10. William (Andy) Adamson, Olga Kornievskaia Low Infrastructure Public Key Based GSS Security Mechanisms

Ссылки

Просмотр этого шаблона Протоколы аутентификации и обмена ключами
С симметричными алгоритмами Wide-Mouth FrogYahalom • Протокол Нидхема — Шрёдера • Протокол Отвея — Рииса • Kerberos • Протокол Ньюмана — Стабблбайна
С симметричными и асимметричными алгоритмами DASS • Протокол Деннинга — Сакко • Протокол Ву — Лама • SPKM
Протоколы и сервисы, используемые в Internet OAuthOpenIDWindows Live ID