TOTP без смартфона, послесловие

После публикации статьи «TOTP без смартфона» она получила много интересных и полезных комментариев. Я решил подождать, пока обсуждение затихнет и провести работу над замечаниями и высказанными мыслями.

Поскольку объём работы оказался достаточно большой, то оформил её в виде отдельной публикации-послесловия.

Философские вопросы (фактор знания или владения?)

В идеальной модели MFA первый фактор предполагается фактором знания (пароль), а второй — фактором владения (вот типа мой номер телефона для СМС, или смартфон с генератором кодов, или аппаратный ключ).

Увлекательная дискуссия развернулась по поводу того, что же может считаться знанием, а что владением; как одно может перетекать в другое; что можно скопировать, а что потерять / отобрать. Огромное спасибо уважаемым @splitfire, @aborouhin, @inkelyad как застрельщикам этой ветки!

Раздельное хранение разных FA

Хотя само по себе наличие 2FA увеличивает защищённость сервиса по сравнению с одним лишь паролем (отпадают угрозы утечки пароля, банальное подсмотрели или более сложные варианты, типа кейлоггер / анализ звука клавиатуры etc) — идеологически правильным будет хранить 2FA отдельно, таким образом, который исключает возможность одновременного раскрытия и пароля, и TOTP.

Поэтому я прекратил использование KeePass для хранения секретов TOTP (хоть это и казалось очень удобным, но безопасность обычно обратно пропорциональна удобству, и наоборот). Да, можно использовать отдельную парольную базу для 2FA, но это уже не будет удобно;, а безопасно хранить их в GPG зашифрованном виде уже реализовано.

Использование 2FA на отдельном устройстве

Спасибо уважаемому @xSVPx за мысль:

Смысл двухфакторной проверки в том, что оба «пароля» в том числе хранятся или получаются способами не имеющими общих мест. Т.е. для компрометации необходимо два устройства взломать, а не одно.

Действительно, даже при раздельном хранении разных FA на одном и том же устройстве (например, рабочий десктоп) существует угроза раскрытия всех FA при его полной компрометации. Поэтому я храню 2FA на отдельной Linux-машине, доступной через SSH. Для пущей надёжности заходить на неё можно не с основного десктопа, а с рабочего ноутбука.

И да, поэтому варианты с копированием TOTP в буфер обмена должны рассматриваться как потенциальное ослабление безопасности. Не зря же TOTP сделан цифровым и коротким, чтоб даже занятой человек мог удержать его в оперативной памяти на те несколько секунд, которые нужны для ввода.

2FA и Microsoft

Я не до конца разобрался с тонкостями 2FA в Microsoft, когда написал:

не работает с MicroSoft, поскольку там традиционно не ограничились стандартным TOTP

Спасибо уважаемым @aborouhin и @CaptainFlint за то, что обратили моё внимание на это и побудили ещё раз пройти через не очень очевидные настройки безопасности учётной записи MicroSoft.

Как оказалось, при включении 2FA есть возможность выбрать опцию другая программа–аутентификатор, тогда вместо проприетарной связи с приложением Microsoft Authenticator на телефоне — сгенерируют QR-код (нормально воспринимается например Google Authenticator);, а с опцией не могу отсканировать QR можно получить заветный TOTP секрет в формате base32. После чего он без проблем работает с mytotp.sh (с теми же дефолтными шестью цифрами и хэшем SHA-1).

Извлечение параметров TOTP из Google Authenticator

Уважаемый @adrozhzhov поделился методикой извлечения параметров TOTP, уже заведённых в Google Authenticator. Нужно в приложении инициировать Transfer Accounts, выбрать нужный нам из списка, получив QR-код сделать скриншот экрана и нажать Cancel.

Для дальнейшей работы нужна программа zbarimg для декодирования QR-кода (пакет zbar-tools в Debian и производных, zbar в RedHat и производных) и скрипт для разбора строки otpauth-migration (Python3 с двумя зависимостями, ставится с GitHub)

 $ sudo apt install zbar-tools
 $ cd ~/wrk && git clone https://github.com/qistoph/otp_export
 $ cd otp_export && pip install -r requirements.txt
 $ ./parse.py "$(zbarimg -q --raw  /path/to/qr-auth.png)"
 [...]
  secret: b'ABCD1234EFGH5678IJKL2345MNOP6789'
  name: myname@service
  issuer: 
  algorithm: SHA1
  digits: SIX
  type: TOTP

Новый вариант скрипта (форк на GitHub)

Мысль следовать моде и разместить свой тривиальный скрипт на GitHub оказалась удачной: репозиторий был дважды форкнут, причём во втором случае доработан до использования в виде BASH-функций mytotp(), mytotpadd() и mytotplist() для загрузки в окружение и последующего вызова. Более того, уважаемый yuriq оформил pull request на включение изменений в мой репозиторий, всё как у взрослых!

Думаю теперь, как лучше поступить — с одной стороны, изменения полезные; с другой я достаточно старомоден и стараюсь не раздувать окружение BASH, потому надо бы и исходный вариант со скриптом оставить. Осталось поизучать мануалы на git (1), а также best practices на GitHub, чтобы всё сделать правильно и красиво.

Аппаратный токен U2F

Уважаемый @kasiopei задал вопрос про U2F устройства:

А почему U2F почти никто не внедряет? Не знают о нем или защита слабая?

Поскольку мои познания в этом вопросе были сугубо теоретическими, я решил расстаться с небольшой суммой денег и поискал доступное к покупке прямо сейчас устройство с поддержкой форматов FIDO 2UF (CTAP1) / FIDO2 (CTAP2).

Устройства Yubikey мне показались дороговатыми, плюс табличка The FIDO U2F PIN озадачила богатством вариантов — взял USB-устройство попроще. И вот что я хочу сказать:

Это лучшее решение задачи «TOTP без смартфона»!

От GAuth к CTAPx

От GAuth к CTAPx

Работает со всеми моими сервисами (думаю, в 2024 году большинство веб-сервисов поддерживают CTAP); под Windows (7 / 10), MacOS (10.13+), Linux (Mint 21); с актуальными версиями FireFox и Safari (уверен, с Chrome тоже работать будет). Если не устанавливать свой PIN на токен (чистый фактор владения), то вообще ничего с ним делать не нужно, помимо:

  • Регистрация: зашли на сервис, выбрали настройку 2FA, аппаратный ключ; когда попросят — коснулись кнопки на ключе

  • Использование: зашли на сервис, увидели приглашение коснуться кнопки на ключе, коснулись — аутентификация выполнена

Из недостатков (кроме необходимости заплатить живые деньги): при поломке / пропаже токена остаёмся без 2FA. В Apple даже предлагают при активации 2FA использовать два разных токена;, но вполне можно обойтись схемой «токен + TOTP», чем я и воспользовался.

Заключение

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

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

© Habrahabr.ru