Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Безопасность работы с системой Linux

Yubikey - аутентификация по одноразовым паролям

Оригинал: Yubikey One-Time Password Authentication
Автор: Dirk Merkel
Дата: 1 января 2009
Перевод: Александр Тарасов aka oioki
Дата перевода: 16 сентября 2009

Мне захотелось поближе познакомиться с Yubikey по многим причинам. Для начинающих это устройство - простое и элегантное решение двух главных проблем в современной информационной безопасности - аутентификации и управлением подлинности. Более того, мне действительно нравится как Yubico, компания-производитель ключа Yubikey, старается интегрировать движение OpenSource в свою бизнес-стратегию. В этой статье я рассмотрю три темы, связанные с этим маленьким устройством. Во-первых, расскажу, какие функции есть у Yubikey и как им пользоваться. Во-вторых, объясню, как он работает. И наконец, покажу, как интегрировать аутентификацию Yubikey в свои веб-приложения.

Что же это?

Yubikey - это маленький пластиковый ключ, состоящий по сути из USB-коннектора и кнопки. Он напоминает маленькую USB-флешку, его размеры - 18×45×2 мм, а весит он всего 2 грамма. Его легко можно переносить на связке ключей или в кошельке (см. рисунки 1 и 2). Когда вы вставляете его в USB-порт своего компьютера, он определяется как клавиатура, подразумевая, что Yubikey - платформо-независимое устройство, ведь он поддерживает передачу данных по стандарту USB HID (Human Interface Device, Устройство взаимодействия с человеком). Ключ питается от компьютера и поэтому ему не требуется своя батарейка. Все устройство довольно компактно, его можно носить вместе со своими обычными ключами, надев его на кольцо через маленькое отверстие вверху. Позолоченные контакты достаточно крепкие и рассчитаны на время, большее предполагаемого времени жизни устройства. По сведениям компании Yubico, ключом Yubikey можно будет пользоваться, даже если постирать его в стиральной машинке.


Рисунок 1. Вставленный ключ Yubikey


Рисунок 2. Вот такой Yubikey маленький

Каждый раз, когда вы нажимаете кнопку на ключе, он генерирует одноразовый пароль и отправляет его на компьютер так, как будто вы ввели его с клавиатуры. Этот пароль потом можно использовать в вашем приложении для аутентификации пользователя.

Как этим воспользоваться?

Когда у меня нет доступа к моей собственной системе, для чтения своих электронных писем я пользуюсь RoundCube. RoundCube - это основанное на AJAX веб-приложение, реализующее почтовый клиент. Чтобы воспользоваться им, нужно просто зайти на него с помощью веб-браузера, как например на Gmail и на множество других популярных почтовиков. К счастью, RoundCube является программным продуктом с открытым исходным кодом, написан на PHP, поэтому добавить в него аутентификацию по Yubikey будет достаточно простой задачей.

При обычной установке RoundCube спросит у вас e-mail адрес и пароль. Однако, если внести несколько изменений в исходный код, окно входа в почту будет иметь новое третье поле - Yubikey OTP (one-time password, одноразовый пароль). Теперь для входа в свой почтовый ящик нужно будет ввести свой e-mail, свой пароль (как обычно), затем перенести курсор на третье поле и нажать кнопку на ключе Yubikey. Спустя пару секунд, Yubikey сгенерирует 44-символьную последовательность, завершающуюся символом новой строки. Символ новой строки приводит к тому, что форма будет отправлена, и вам не придется нажимать кнопку Login лишний раз. Если ваш ключ Yubikey действительно связан с этим почтовым аккаунтом, то вы войдете в свой почтовый ящик. Взгляните на картинку 3, на ней показано модифицированное окно входа в ящик.


Рисунок 3. Модифицированное окно входа в почтовый ящик RoundCube

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

Подробнее

Давайте взглянем на последовательность символов, которую Yubikey генерирует и передает на компьютер. Вот пример такой последовательности:

tlerefhcvijlngibueiiuhkeibbcbecehvjiklltnbbl

На самом деле, эта строка является одноразовым паролем, зашифрованным по алгоритму AES-128 и закодированным в ModHex. Сейчас мы разберемся, как именно Yubikey получает такую строку. Взгляните на рисунок 4.


Рисунок 4. Получение строки Yubikey

Устройство начинает с создания 16-байтовой последовательности (см. рисунок 4), в которой отдельные байты размещены следующим образом:

  • Первые шесть байт содержат уникальный секретный идентификатор ключа, который назначается каждому экземпляру Yubikey при его изготовлении и прошивке. Этот идентификатор известен только тому, кто его назначал, и его нельзя никаким образом достать из Yubikey. Шести байтам соответствует 26*8 = 281,474,976,710,656 уникальных битовых комбинаций. По сути это максимальное количество экземпляров ключей Yubikey, которого должно хватить, прежде чем Yubico выпустит новую модель ключа. Это число превышает количество живущих на планете людей в 42 тысячи раз, поэтому на нас всех хватит с запасом.
  • Следующие два байта в нашей последовательности (байты 7 и 8) используются для хранения счетчика сессии в энергонезависимой памяти. Счетчик начинается с нуля и увеличивается при каждой вставке ключа. Двухбайтовый счетчик сессий может хранить 22*8 = 65,536 сессий. Другими словами, можно включать Yubikey трижды в день в течении почти 60 лет, прежде чем счетчик сессий сбросится. Обратите внимание, что в течение каждой сессии можно создавать несколько одноразовых паролей (см. ниже).
  • Следующие три байта, с 9 по 11, используются в качестве временной метки, хранящейся в энергозависимой памяти в течение каждой сессии. Это означает, что при каждом включении устройства, временная метка обнуляется и постепенно увеличивается. Увеличение метки происходит за счет внутреннего таймера с частотой 8 Гц, поэтому значения кончатся спустя 24 дня. Если вы все же окажетесь в такой редкой ситуации, придется просто вытащить Yubikey и вставить его обратно.
  • Байт номер 12 - это счетчик внутри сессии, который начинается с нуля и увеличивается каждый раз при генерации новой последовательности. После максимального значения (255) следующим будет 0.
  • Байты 13 и 14 в последовательности - это псевдослучайные числа, создаваемые автономным осциллятором. Эти байты добавляют дополнительную энтропию к исходной строке.
  • Последние два байта, 15 и 16, содержат контрольную сумму, вычисляемую по алгоритму CRC-16 по всем байтам строки, исходным значением для самих двух байт контрольной суммы считаются нули. Эта сумма необходима для контроля целостности данных.

Каждый раз при нажатии на кнопку Yubikey генерирует эту самую 16-байтовую последовательность. Однако если вы взглянете выше на пример строки, печатаемой Yubikey, вы увидите, что он состоит из 44 символов. Это потому что мы еще не рассмотрели три важных шага, которые проделывает устройство. Во-первых, 16-байтовая последовательность шифруется с помощью ключа AES-128, уникального для каждого экземпляра Yubikey. Во-вторых, Yubikey дописывает зашифрованную 16-байтовую последовательность 6-байтовым плоским публичным идентификатором. Этот публичный идентификатор полностью отличается от секретного идентификатора (байты 1-6 исходной последовательности). Публичный ключ не меняется с течением времени и может быть привязан к аккаунту. Наконец, полностью 22-байтовая последовательность (6 байт публичный идентификатор + 16 зашифрованных байт) кодируется с помощью малоизвестного алгоритма ModHex.

Компания Yubico выбрала этот алгоритм просто потому, что вывод алгоритма ограничивается набором символом, общим для всевозможных клавиатурных раскладок. Так как Yubikey имитирует клавиатуру, необходимо использовать наиболее совместимые клавиатурные настройки. Недостатком алгоритма ModHex является то, что каждый входной байт кодируется двумя, именно поэтому 22-байтовая последовательность превращается в 44-символьную строку. Однако так как Yubikey сам набирает эту последовательность, неудобств это пользователю не создает.

Подробнее о шифровании

Давайте подробнее разберем этап шифрования. В отличие от асимметричных алгоритмов с использованием публичного ключа, например PGP, алгоритм AES является симметричным. Это означает, что как шифрующей, так и дешифрующей стороне нужно обладать ключом AES-128! Этот обмен ключом AES выполняется в момент изготовления устройства. Подобно уникальному идентификатору устройства, уникальный ключ AES-128 генерируется и сохраняется в устройстве прежде, чем Yubico отправит его на реализацию. Компания поддерживает базу данных, в которой уникальный публичный и секретный идентификаторы соответствуют ключам AES. Таким образом, компания Yubico способна предоставлять веб-сервис аутентификации.

Использование симметричного алгоритма хорошо тем, что он очень быстр. Также, для работы с ключами вам не придется связываться с третьими лицами.

Если вы хотите сами руководить своим ключом AES, у вас есть два способа. Во-первых, вы можете запросить ключ у компании Yubico. На момент написания статьи, Yubico по требованию высылала компакт-диск с AES-ключом, однако компания также работала над более удобным способом получения ключа через интернет. Во-вторых, можно воспользоваться комплектом разработчика Yubico и запрограммировать ключ самому. Этот способ хорош тем, что вы можете сами назначать ключи AES-128, а также публичный и секретный идентификаторы. Если вы примете такой подход и создадите свой веб-сервис аутентификации, вы устраните какую-либо зависимость от Yubico в своей процедуре аутентификации, что является несомненным плюсом.

Алгоритм проверки: порядок имеет значение

Неудивительно, что процесс проверки одноразового пароля состоит из шагов, обратных к тем, что необходимы для конструирования этого пароля. Простейшая процедура проверки может выглядеть следующим образом. Во-первых, вы декодируете строку с помощью ModHex. Затем разделяете получившуюся байтовую последовательность на публичный идентификатор и 16-байтовую последовательность. Затем с помощью публичного идентификатора вы получаете ключ AES. После дешифрования с помощью ключа AES вы получаете оригинальную 16-байтовую последовательность в плоском виде. Далее, нужно проверить контрольную сумму по алгоритму CRC-16 (последние два байта). Затем нужно проверить соответствие секретного идентификатора тому, который вы получили из базы данных по публичному идентификатору. С помощью счетчика сессий и счетчика внутри сессии убеждаемся, что текущая строка была сформирована позже, чем в прошлый раз успешной аутентификации. Хотя вы точно не знаете, когда именно были сгенерированы две строки, вы всегда можете узнать, в каком порядке. Если строка проходит все эти проверки, можно послать клиенту сигнал успешной аутентификации. В случае, когда хоть одна проверка не проходит, строка отклоняется.

Как вариант, вы можете еще усилить алгоритм проверки. К примеру, вы можете подсчитать, сколько сессий или строк внутри сессии было пропущено с последнего момента успешной аутентификации. Эти данные можно также использовать для вынесения решения, разрешать или отклонять доступ. Для этого можно также пользоваться временной меткой сессии.

Yubico открывает исходники

Вот что меня привлекает в бизнес-модели компании Yubico, так это всевозможные попытки открыть исходные коды своего программного обеспечения. По заявлениям Yubico они планируют получать выручку с производства и продажи устройств, но намерены открывать все исходные коды. К примеру, исходный код упомянутого выше веб-сервиса аутентификации свободно доступен как эталонная реализация. Более того, Yubico предлагает клиентам библиотеки, необходимые для встраивания аутентификации Yubikey в различные приложения и платформы. На данный момент есть клиентские библиотеки для языков Java, C, C#/.NET, PAM, PHP, Ruby, Perl и Python. Все эти библиотеки и программы оформлены в виде проектов на сайте Google Code. В дополнение к этому существуют библиотеки для дешифрации одноразовых паролей на языках C и Java, а также сервер Open ID и средство персонализации, с помощью которого можно запрограммировать свой собственный Yubikey. Хотя эти программные проекты изначально созданы компанией Yubico, но в них участвует множество и других людей. Более того, появилось множество независимых проектов с открытым исходным кодом, которые используют технологию Yubikey. Форум Yubico является хорошим местом, где можно поговорить о подобных проектах и получить хорошую поддержку.

Служба аутентификации Yubico

Когда вы заказываете ключ Yubikey, вы уже можете воспользоваться веб-сервисом аутентификации, предоставляемым компанием Yubico. Сама Yubico поддерживает базу данных всех API-ключей, а также открытый и секретный идентификатор, которыми ключи программируются перед реализацией. Именно поэтому компания решила сразу предлагать сервис аутентификации по этим атрибутам. Впоследствии разработчики могут пользоваться веб-сервисом аутентификации Yubico для проверки одноразовых паролей, полученных от устройства. На сайте Yubico есть страница, на которой можно заказать API-ключ. Любой может получить этот API-ключ. Единственным требованием является отправка корректного одноразового пароля. Это мера направлена на защиту базы данных от кучи поддельных запросов. API-ключ также идет вместе с идентификационным номером.

API-ключ предназначен для подписи/проверки запросов к/от веб-сервиса аутентификации Yubico, с помощью хэш-алгоритма HMAC-SHA1. Это сделано по той причине, что зачастую поддержка SSL на самом деле не реализована в некоторых окружениях, в которых будет работать клиентская библиотека веб-сервиса. Обратите внимание, что SSL использовать необязательно, ведь строка уже зашифрована! Однако SSL все-таки должен быть использован там, где возможно, в целях усиления безопасности. В клиентской библиотеке для языка PHP, к примеру, все что нужно будет сделать, это добавить s к http в том месте, где указывается URL-адрес сервера аутентификации.

Источники информации

Дирк Меркель (Dirk Merkel) - технический директор компании Vivantech Inc. На досуге ему нравится посылать свои патчи хорошим проектам с открытым исходным кодом. Он также пишет о веб-разработке. Живет Дирк в Сан-Диего со своей любимой женой и двумя замечательными дочерьми. Дирку можно написать на адрес dmerkel@vivantech.com.