На хабре уже давно знают об одноразовых паролях и технологиях OTP (One Time Password). Даже Яндекс придумал собственное решение. Я же хочу поведать вам о том как прикрутил интересную реализацию OTP к окну входа в сервер терминалов Windows.
Как все это работает
Весь функционал решения держится на замечательном проекте multiotp, опенсорсовом PHP софте, умеющим работать как с TOTP так и c HOTP , и даже с OCRA. Причем запустить эту красоту можно и в *nix и в Windows. Есть даже веб-интерфейс и релизы для систем виртуализации, но это уже вы сами копайтесь, мы размеберем минимально необходимый для старта набор действий.
Привязка mutltiotp к окну входа в винду осуществляется при помощи плагина MultiOneTimePassword-CredentialProvider.
Пользователь будет генерировать одноразовые пароли у себя на компьютере или мобильном устройстве.
Порядок действий указан на странице плагина, но в последней версии multiotp изменился синтаксис, поэтому я пробегусь по всем действиям для вас еще раз.
Установка сервиса multiotp
Скачиваем multiotp и располагаем его где-нибудь на сервере. Я брошу в корень системного диска C:multiotp.
Генерация ключей
Затем нужно создать ключ для каждого пользователя, заведенного на сервере. Подчеркну — мы говорим именно о локальных пользователях. У multiotp есть возможность привязки к ldap, но это слишком большая тема для одной статьи.
Для создания пользователей потребуются 160-битные ключи HEX (т.е. 20 символов в шестнадцатеричной системе счисления). Вы можете (и должны) генерировать их у себя сами в защищенное среде, в лабораторных же целях я вам предложу этот генератор. Указываете ему длину ключа (20) и количество пользователей в вашей системе, он все сделает сам. Сохраните куда-нибудь эти ключи, они нам дальше пригодятся.
Создание пользовательских ключей
Команда создания пользователей выглядит так (само собой в cmd перейдите в директорию с распакованным multiotp):
multiotp.exe -debug -create %USERNAME% %TOTP% %KEY% %PIN% %LENGTH% %LIVETIME%
где
%USERNAME% — имя учетки пользователя в Windows;
%TOTP% — создание ключей для технологии TOTP (основанной на метке времени);
%KEY% — ключ созданный на предыдущем шаге;
%PIN% — дополнительный постоянный пин, который пользователь будет дописывать перед своим временным паролем (его можно не использовать, но команда требует указать какой-нибудь ключ);
%LENGTH% — длина одноразовых паролей (рекомендуются 6-ти символьные, так как большинство приложений генерируют именно их);
%LIVETIME% — срок действия одноразовых паролей (рекомендуется указать 30 секунд, так как большинство приложений генерируют именно их).
Пример:
multiotp.exe -debug -display-log -create rdpclient1 TOTP 6696f39315f4c6388216 1234 6 30
т.е. создал ключ для пользователя rdpclient1 с пином 1234 (синтаксис команды требует указывать пин, даже если мы планируем его не использовать);
multiotp.exe -debug -display-log -set user pin=
т.е. сказал что пин на самом деле не нужен.
Конвертация ключей для пользователей
Теперь нам нужно как-то передать пользователям их ключ, чтоб они могли у себя генерировать одноразовые пароли. Полноценный функционал multiotp позволяет через веб-интерфейс создать QR-код, который мы снимаем на наши телефоны и дальше работаем с ними. Я показываю минимальный функционал без интерфейса, так что придется работать руками.
Нужно будет ключи, созданные на втором шаге переконвертировать из 160-битного HEX в Base32. Опять же лучше это делать у себя в защищенной среде, кому лень, вот вам онлайн конвертер. Он даже не https, так что осторожней с ним. Он вроде бы понятно работает, обращайте внимание на регистр при вводе ключей.
Приложения для создания ключей
Переконвертированные ключи нужно дать пользователю. Есть куча приложений для мобильных ОС, которые могут генерировать одноразовые пароли. Я люблю Google Authenticator, он работает на большинстве ОС. Кому хочется побаловаться и не засорять мобильное устройство — можете поставить плагин в браузер.
Приложению или плагину нужно указать ключ, созданный на четвертом шаге. Там ничего сложного, думаю разберетесь сами.
Проверка работы сервиса
Чтобы проверить корректную работу сервиса multiotp следует потестировать создаваемые ключи в командной строке следующим образом:
multiotp.exe -display-log user %GENERATED_TOKEN%
где user — имя пользователя в винде;
%GENERATED_TOKEN% — ключ генерируемый приложением на мобильном устройстве (следите за временем, у вас всего 30 сек с момента генерации пароля)
Ответ в командной строке выглядеть должен так:
0 OK: Token accepted
Подключение плагина авторизации в Windows
Осталось малое — скачать и установить плагин для Windows. Вопросов установщик задает мало. Нужно установить компонент «Default Provider» (иначе он ничего делать не будет), указать путь к multiotp и написать сообщение для окна входа в систему Windows.
Готово. Можно проверять работу.
Нюансы:
1) Обязательно создайте пароли для всех, в том числе для администратора, иначе его не пустит в систему.
2) Обязательно настройте точное время на серваке и на устройствах пользователей, иначе ваши ключи не будут работать. Дело не именно в точности, а в том что время там и там должно совпадать.
3) Иногда не показывает в командной строке результат, но вы всегда можете почитать лог.
4) Если вам интересно как прикрутить это красоту к домену — скажите, я попробую и отпишусь.
5) Функционал огромный, все есть на вики multiotp: смс, QR, синхронизация, резервное копирование, привязка к чему угодно.
Тем, кто информацию любит воспринимать наглядно может быть полезен этот ролик.
Автор: semaev