Привязка дополнительных одноразовых паролей к окну входа Windows

    На хабре уже давно знают об одноразовых паролях и технологиях OTP (One Time Password). Даже Яндекс придумал собственное решение. Я же хочу поведать вам о том как прикрутил интересную реализацию OTP к окну входа в сервер терминалов Windows.

    image

    Как все это работает

    Весь функционал решения держится на замечательном проекте 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
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 21
    • +3
      Занимательная штука. Устойчивость конструкции вызывает опасения.
      • 0
        У меня тоже, но уже месяц работает на ура. Пару раз приходилось в реестр лезть.
      • +1
        4) Если вам интересно как прикрутить это красоту к домену — скажите, я попробую и отпишусь.

        ждемс ;)
      • 0
        Да, очень ждем статьи о том как это все прикрутить к самбе =)
        • 0
          Ок, принято. Думаю быстрее выйдет у меня на канале видео соответсвующее.
          • +1
            Уточните задачу — вы как бы хотели увидеть результат работы с самбой?
            • 0
              Канал ваш уже смотрю.
              И да, по самбе есть хорошие видео =)

              Уточнение: в качестве ВАУ-фактора хотелось бы увидеть логи где видно что аутентификация проходит именно через OTP.
              QR, PSK, или SMS — Это не принципиально. То есть, предположим, окно виртуалки с виндой, а рядом окно с логом самбы.
              Ну и послушать/посмотреть немного о подводных камнях с которыми пришлось столкнуться.
              Это всегда самая интересная часть.
          • 0
            Нюансы:
            2) Обязательно настройте точное время на серваке, иначе ваши ключи не будут работать.

            Уточню:
            • время должно быть _одинаково_ на сервере и на устройстве с аутентификатором, не обязательно «атомное»(допускается небольшое отклонение). Зачастую устройство синхронизируется вручную — такой точности не всегда хватает.

            Google Authenticator — доступен в исходных кодах — github.com/google/google-authenticator.

            Очень хотелось бы увидеть это же в применении к MS AD.
            • 0
              Согласен, некорректно сформулировал, имел в виду что проще всего иметь точное время на всех устройствах. правлю.
              По AD задачу принял)
            • 0
              Спасибо за статью!

              Поправьте заголовок.
              Привязка дополниельных одноразовых паролей к окну входа Windows
              • 0
                Спасибо, поправил!
                • 0
                  Поправьте ещё раз: "… дополниТельных одноразовых паролей..."
              • 0
                Спасибо за интересный пост. Я в свое время тоже тестировал аналогичное решение с одноразовыми паролями для Windows. Использовал сервер аутентификации, поддерживающий протокол RADIUS, а на клиенте устанавливал PGina.
                • 0
                  А что за сервер аутентификации был? Я все бьюсь как это к домену подключить
                  • 0
                    Сервер аутентификации может быть любой, который поддерживает протокол RADIUS. Я использовал neXus Hybrid Access Gateway. Этот сервер избыточен для такой узкой задачи. Вы можете попробовать что-то полегче, например, linotp + freeRADIUS.
                • 0
                  А есть ли подобное средство, но что бы одноразовые пароли запрашивались не только во время входа в систему, а во время любых запросов на повышение привелегий? Т.е. нужно что бы OTP пароли зарашивались уже внутри сеанса пользователя, если ему требуется повысить права, скажем, для установки приложения.
                  • 0
                    Тут все реализовано засчет этого плагина для дефолтного провайдера, я им напишу сейчас спрошу по вашей задаче, она действительно хороша.
                  • 0
                    Еще можно использовать решение от Duo Security. В случае использования менее 10 учеток они работают бесплатно.
                    • 0
                      А вы этой штукой пользовались от Duo Security? Не пойму как они ее к AD привязали, заменяют пароль пользователя на пины эти?
                      • 0
                        Да, пользуюсь активно. DUO дает именно второй фактор. То есть пользователь логинится по своим реквизитам и после этого требуется подтвердить второй фактор. Также у них есть duo auth proxy, которая может быть radius или ldap прокси-сервером. Соответственно можно прикрутить второй фактор даже там, где это не поддерживается на нативном уровне. Можете написать в личку, расскажу подробнее.

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