На хабре уже давно знают об одноразовых паролях и технологиях OTP (One Time Password). Даже Яндекс придумал собственное решение. Я же хочу поведать вам о том как прикрутил интересную реализацию OTP к окну входа в сервер терминалов Windows.
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/911/586/33d/91158633d1ed00ad0cf949d64797994a.png)
Весь функционал решения держится на замечательном проекте multiotp, опенсорсовом PHP софте, умеющим работать как с TOTP так и c HOTP , и даже с OCRA. Причем запустить эту красоту можно и в *nix и в Windows. Есть даже веб-интерфейс и релизы для систем виртуализации, но это уже вы сами копайтесь, мы размеберем минимально необходимый для старта набор действий.
Привязка mutltiotp к окну входа в винду осуществляется при помощи плагина MultiOneTimePassword-CredentialProvider.
Пользователь будет генерировать одноразовые пароли у себя на компьютере или мобильном устройстве.
Порядок действий указан на странице плагина, но в последней версии multiotp изменился синтаксис, поэтому я пробегусь по всем действиям для вас еще раз.
Скачиваем multiotp и располагаем его где-нибудь на сервере. Я брошу в корень системного диска C:\multiotp.
Затем нужно создать ключ для каждого пользователя, заведенного на сервере. Подчеркну — мы говорим именно о локальных пользователях. У multiotp есть возможность привязки к ldap, но это слишком большая тема для одной статьи.
Для создания пользователей потребуются 160-битные ключи HEX (т.е. 20 символов в шестнадцатеричной системе счисления). Вы можете (и должны) генерировать их у себя сами в защищенное среде, в лабораторных же целях я вам предложу этот генератор. Указываете ему длину ключа (20) и количество пользователей в вашей системе, он все сделает сам. Сохраните куда-нибудь эти ключи, они нам дальше пригодятся.
Команда создания пользователей выглядит так (само собой в cmd перейдите в директорию с распакованным multiotp):
%USERNAME% — имя учетки пользователя в Windows;
%TOTP% — создание ключей для технологии TOTP (основанной на метке времени);
%KEY% — ключ созданный на предыдущем шаге;
%PIN% — дополнительный постоянный пин, который пользователь будет дописывать перед своим временным паролем (его можно не использовать, но команда требует указать какой-нибудь ключ);
%LENGTH% — длина одноразовых паролей (рекомендуются 6-ти символьные, так как большинство приложений генерируют именно их);
%LIVETIME% — срок действия одноразовых паролей (рекомендуется указать 30 секунд, так как большинство приложений генерируют именно их).
Пример:
Теперь нам нужно как-то передать пользователям их ключ, чтоб они могли у себя генерировать одноразовые пароли. Полноценный функционал multiotp позволяет через веб-интерфейс создать QR-код, который мы снимаем на наши телефоны и дальше работаем с ними. Я показываю минимальный функционал без интерфейса, так что придется работать руками.
Нужно будет ключи, созданные на втором шаге переконвертировать из 160-битного HEX в Base32. Опять же лучше это делать у себя в защищенной среде, кому лень, вот вам онлайн конвертер. Он даже не https, так что осторожней с ним. Он вроде бы понятно работает, обращайте внимание на регистр при вводе ключей.
Переконвертированные ключи нужно дать пользователю. Есть куча приложений для мобильных ОС, которые могут генерировать одноразовые пароли. Я люблю Google Authenticator, он работает на большинстве ОС. Кому хочется побаловаться и не засорять мобильное устройство — можете поставить плагин в браузер.
Приложению или плагину нужно указать ключ, созданный на четвертом шаге. Там ничего сложного, думаю разберетесь сами.
Чтобы проверить корректную работу сервиса multiotp следует потестировать создаваемые ключи в командной строке следующим образом:
%GENERATED_TOKEN% — ключ генерируемый приложением на мобильном устройстве (следите за временем, у вас всего 30 сек с момента генерации пароля)
Ответ в командной строке выглядеть должен так:
Осталось малое — скачать и установить плагин для Windows. Вопросов установщик задает мало. Нужно установить компонент «Default Provider» (иначе он ничего делать не будет), указать путь к multiotp и написать сообщение для окна входа в систему Windows.
Готово. Можно проверять работу.
1) Обязательно создайте пароли для всех, в том числе для администратора, иначе его не пустит в систему.
2) Обязательно настройте точное время на серваке и на устройствах пользователей, иначе ваши ключи не будут работать. Дело не именно в точности, а в том что время там и там должно совпадать.
3) Иногда не показывает в командной строке результат, но вы всегда можете почитать лог.
4) Если вам интересно как прикрутить это красоту к домену — скажите, я попробую и отпишусь.
5) Функционал огромный, все есть на вики multiotp: смс, QR, синхронизация, резервное копирование, привязка к чему угодно.
Тем, кто информацию любит воспринимать наглядно может быть полезен этот ролик.
Получил невероятно хорошие комментарии и уточнения от пожелавшего остаться неизвестным товарища:
1) В самом начале настройки сервера, вводите команду:
2) С помощью этой команды можно регулировать bantime, для пользователей, которые ошиблись с паролем (по умолчанию 30 сек):
3) То, что будет написано в приложении google Authenticator над 6 цифрами, называется issuer, можно поменять с дефолтного MultiOTP на что-то другое:
4) После проделанных операций, команда по созданию пользователя становится чуть проще:
5) Каждому пользователю можно изменить description (текст под цифрами в приложении Google Auth):
6) QR-коды можно создавать сразу в приложении:
7) Можно использовать не только TOTP, но и HOTP (на вход функции хэширования подаётся не текущее время, а значение инкрементального счетчика):
8) Если пользователь забыл/потерял телефон, можно сгенерировать десяток одноразовых кодов с помощью команды:
9) И хорошие пояснения
![image](https://habrastorage.org/getpro/habr/post_images/911/586/33d/91158633d1ed00ad0cf949d64797994a.png)
Как все это работает
Весь функционал решения держится на замечательном проекте 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, синхронизация, резервное копирование, привязка к чему угодно.
Тем, кто информацию любит воспринимать наглядно может быть полезен этот ролик.
UPD:
Получил невероятно хорошие комментарии и уточнения от пожелавшего остаться неизвестным товарища:
1) В самом начале настройки сервера, вводите команду:
multiotp.exe -debug -config default-request-prefix-pin=0 display-log=1
после неё не требуется вводить пин-код при настройке пользователя и включается отображение лога каждой операции в консоль.2) С помощью этой команды можно регулировать bantime, для пользователей, которые ошиблись с паролем (по умолчанию 30 сек):
multiotp.exe -debug -config failure-delayed-time=60
3) То, что будет написано в приложении google Authenticator над 6 цифрами, называется issuer, можно поменять с дефолтного MultiOTP на что-то другое:
multiotp.exe -debug -config issuer=other
4) После проделанных операций, команда по созданию пользователя становится чуть проще:
multiotp.exe -debug -create user TOTP 12312312312312312321 6
(время обновления цифр, равное 30 секундам, я не задаю, кажется оно по умолчанию равно 30).5) Каждому пользователю можно изменить description (текст под цифрами в приложении Google Auth):
multiotp.exe -set username description=2
6) QR-коды можно создавать сразу в приложении:
multiotp.exe -qrcode username c:\multiotp\qrcode\user.png:\multiotp\qrcode\user.png
7) Можно использовать не только TOTP, но и HOTP (на вход функции хэширования подаётся не текущее время, а значение инкрементального счетчика):
multiotp.exe -debug -create username HOTP 12312312312312312321 6
Пример
HOTP можно использовать в ситуациях, когда начальство любит железные решения, а не софт: к примеру, Yubikey программируется для использования HOTP и подходит для этого. Мы впоследствии отказались полностью от Yubikey+HOTP, поскольку если пользователь нажал на Yubikey не в том окне, где надо, то его последующие коды будут неподходящими (счетчик yubikey будет впереди на единицу) и придётся их с сервером синхронизировать:
multiotp.exe -resync user 061735 729371
8) Если пользователь забыл/потерял телефон, можно сгенерировать десяток одноразовых кодов с помощью команды:
multiotp.exe -scratchlist username
9) И хорошие пояснения
по поводу стабильности решения:
Работает уже больше года на нескольких серверах, никогда проблем с ним не было. Если и возникнет какая-то проблема с multiotp (мы к этому готовились и тестировали возможные варианты) — то достаточно сервер загрузить в безопасном режиме: в таком случае он загрузится с дефолтным credential provider (без участия multi-otp) и после этого нужно будет либо отключить в реестре провайдер multiotp, либо временно его деинсталлировать, сделав предварительно резервную копию папки c:\multitop