The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Двухфакторная аутентификация SSH с использованием YubiKey
Все началось с того, что я приобрел YubiKey и захотел использовать его для
двухфакторной аутентификации SSH. Я также хотел иметь возможность восстановить
доступ к серверу на случай, если потеряю ключ. Информация о том, как это
сделать, слишком разрознена, поэтому я написал собственное руководство.

Вещи, которые необходимо знать:

* HOTP -- это алгоритм генерации одноразового пароля на основе счетчика.
Счетчик меняется каждый раз, когда генерируется новый пароль.
* TOTP -- алгоритм генерации пароля в зависимости от таймера, регулярно
генерируется новый пароль. (30 секунд в этом случае).

В результате, вы входите через SSH, видите запрос пароля и вводите пароль,
предоставленный OTP, системой одноразовых паролей (one-time password) от YubiKey.

Для аварийного доступа я настроил возможность аутентификации с помощью
Android-приложения Google Authenticator. Я настраивал все на Debian Wheezy
сервере, но это должно работать и для других похожих систем.

Вам необходимо установить libpam-oath на сервере (>=1.12.4-1 или вы не сможете
использовать аварийный вход).
На вашем компьютере необходимо установить yubikey-personalization-gui, oathtool
и libmime-base32-perl.

Когда вы установите необходимые программы и библиотеки, то прежде, чем
приступать к настройке, убедитесь, что у вас открыт дополнительный терминал с
правами root, чтобы можно было исправить возможные ошибки.

Ключ ниже указан просто для примера, вам необходимо подставить свой.

Настройка YubiKey.

Для начала, используем yubikey-personalisation-gui, чтобы настроить YubiKey и
сгенерировать ключ. Укажите OATH-HOTP режим, отключите token идентификацию и
скопируйте ключ куда-нибудь, он понадобится для настройки сервера. Не забудьте
сохранить настройки в YubiKey.

Создайте файл /etc/users.oath на сервере с содержанием:

   HOTP robin - 8a54ac40689f0bb99f306fdf186b0ef6bd153429

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

Установите возможность читать файл только для root:

   # chmod 600 /etc/users.oath

Измените /etc/pam.d/sshd таким образом, чтобы строка

   @include common-auth

была раскомментирована, а после нее добавьте следующее:

   auth required pam_unix.so nullok_secure

   # OATH OTP
   auth required pam_oath.so usersfile=/etc/users.oath window=20

window=20 указывает, как много раз может быть нажата кнопка на YubiKey перед
входом. Иными словами, как далеко в последовательности OTP модуль будет искать совпадение.

Измените sshd_config, чтобы он разрешал вызов-ответ (Challenge-Response) аутентификацию.

   sed -i.bak -E -e 's/(ChallengeResponseAuthentication) no/\\1 yes/' /etc/ssh/sshd_config

Вы можете проверить последовательность следующим образом:

   $ oathtool -w10 8a54ac40689f0bb99f306fdf186b0ef6bd153429
   333518
   886962
   ...

Если вы нажмете кнопку на YubiKey несколько раз, вы дожны увидеть точно такую
же последовательность.

Перезапустите ssh демон и все должно работать. Вам нужно ввести пароль, вы
нажимаете на кнопку YubiKey.

Настройка Google Authenticator

Это будет аварийным входом на случай, если вы потеряете ключ. Используем здесь
повременной счетчик TOTP вместо счетчика на основе последовательности.

Для начала сгенерируйте случайный десятибайтовый ключ (20 символов в шестнадцатиричном виде):

   $ head -c 1024 /dev/urandom | openssl sha1 | tail -c 21 
   2c2d309a7a92e117df5a

Добавьте строку в /etc/users.oath:

   HOTP/T30 robin - 2c2d309a7a92e117df5a

T30 означает, что используется повременной алгоритм с 30-и секундной ротацией.

Перед тем, как добавить этот же ключ в android приложение, мы должны представить его в base32 виде:

   $ perl -e 'use MIME::Base32 qw( RFC ); print  lc(MIME::Base32::encode(pack("H*","2c2d309a7a92e117df5a")))."\\n";'
   fqwtbgt2slqrpx22

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

   $ oathtool --totp -w10 2c2d309a7a92e117df5a
   125557
   804612
   ...

Последовательность должна совпадать с той, которую отдает android приложение.
Поскольку алгоритм генерации основывается на времени, то разница времени на
устройствах должна не превышать пары секунд.

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

Примечания

Когда вы залогиньтесь, файл users.oath будет изменен, в него будет записано
новое значение счетчика и время. Убедитесь, что файл не открыт в текстовом редакторе.

Если кто-нибудь нажмет кнопку YubiKey много раз (больше двадцати для этого
примера), то ключ рассинхронизируется с сервером и вам придется сбросить его,
сгенерировав новый и заменив старый в users.oath.

Есть еще libpam-google-authenticator, который ведет себя похожим образом, но
недоступен для Debian Wheezy.

Если у вас много сервереров и вы хотите использовать один YubiKey для всех, то
вам потребуется что-нибудь вроде центрального сервера аутентификации, чтобы
избежать рассинхронизации ключей.
 
30.09.2013 , Автор: Dvenum , Источник: http://www.kallisti.net.nz/blog/201...
Ключи: ssh, auth, yubikey, password
Раздел:    Корень / Безопасность / SSH

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, lucentcode (ok), 21:18, 01/10/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо. Очень интересный материал. Не зла про YubiKey.
     
  • 1.2, lucentcode (ok), 21:19, 01/10/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не знал про YubiKey(опечатки такие опечатки).
     
  • 1.3, Аноним (-), 18:55, 02/10/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Еще бы абзац о том, что такое юбикей и чем он лучше ключей... 2 железки постоянно генерят пароли в зависимости от (точного) времени, и имея одну железку можно узнать какой пароль в другой в этот момент?
     
  • 1.4, Аноним (-), 22:43, 02/10/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Только получается что "поймав" ваш "8a54ac40689f0bb99f306fdf186b0ef6bd153429" с ним каждый раз можно будет заходить, так как он - валидный всегда будет. Лучше или свой сервер (в целом два) поднимать или юзать модуль что бы обращаться к yubi-key серверам в интеренете. Смысл в том что yubikey имеет свой идинтефикатор и по нему алгоритмом генерит пароль, пароль НЕ зависит от времени или чего-то там еще кроме собственно AES ключа зашитого в него и ID yubikey. Смысл в том что сервер проверяет насколько правильна сгенерилась последовательность зная public ID + AES и смотрит - не использовалась ли указанная последовательно до того. То есть сервера YubiKey в интернете (ну или приватный) хранят историю использования ключей. В целом еще у них есть беспланая виртуалка YubiRadius где все преднастроенно и типа есть ЛДАП + Радиус и можно забивать туда юзеров \ ключи и использовать как центр авторизации.
     
     
  • 2.6, pavlinux (ok), 00:08, 03/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Только получается что

    ФСБ запрещает юзать аппаратные ключи для удалённого доступа! Это только увеличивает риск.
    Лучше один, средненький пароль, типа "Qwerty-1025", чем два ключа.  
    Более того, использовать аппаратную авторизацию допускается только на защищенной,
    ограниченной территории (в пределах этажа, отдела).

    А как нарисовано на сайте http://www.yubico.ru/?uic_map=1505201284100
    "Юбикей на связке ключей" - это ваще, высший пилотаж раз3.1415здяйства. :D

     
     
  • 3.8, n0p (?), 22:54, 04/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Есть маленький нюанс, дружище.

    Двухфакторная аутентификация означает, что ты "что-то знаешь", например пароль и "что-то имеешь", например, ключ. И при этом используются обязательно обе штуки одновременно.

    Если у тебя сперли пароль, то это не значит, что им можно воспользоваться, а если сперли ключ, то без пароля его можно тупо заблокировать и заменить на другой.

    Как думаешь, у ФСБ будут возражения?

     
     
  • 4.9, pavlinux (ok), 01:30, 06/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > В результате, вы входите через SSH, видите запрос пароля и вводите пароль,
    > предоставленный OTP, системой одноразовых паролей (one-time password) от YubiKey.

    Где тут двухфакторность?

    ----

    Двух-, трех-, хз- факторность - это последовательные, НЕ ВЗАИМОИСКЛЮЧАЮЩИЕ процедуры аутентификации.
    Например ( SSL-ключ && пароль && подтверждение по SMS).

     
     
  • 5.10, n0p (?), 12:29, 06/10/2013 [^] [^^] [^^^] [ответить]  
  • +/

    Согласен, эту штуку обязательно надо использовать в сочетании с дополнительной процедурой. Без неё она превращается в тыкву.
     
  • 5.15, Filosof (ok), 19:39, 15/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    У меня сначала идёт запрос ОТП, потом стандартный пароль.
    2 фактора + защита от перебора.

    Для ленивых стандартное поведение - "авторизовывать по ключу, если нет ключа - запускать 2х факторность". Спасает при необходимости написания скриптов.
    Система вообще гибкая - твори что хочешь. PAM же.

    А вот "сервера YubiKey" меня пугают. Я б никому не доверял свой ключ.

     
  • 3.19, Crazy Alex (ok), 13:17, 23/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Смотря от чего защищаешься. Если от интернет-взломщиков всяких, и при этом хочешь ходить откуда угодно (то есть только ключами не обойдешься) - то как раз OTP будет отличным вариантом, даже без двухфакторки.

    Собственно, есть куча случаев, когда вариант "блокнотик, а то и листок на мониторе со страшными паролями" будет очень надежным и удобным решением.

    Мораль - прежде чем защищаться - стройте модель угроз.

     

  • 1.5, pavlinux (ok), 00:00, 03/10/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кто ж напишет PAM модуль для подтверждения по SMS, мне чёй-то так в падлу.
     
     
  • 2.7, Andrey Mitrofanov (?), 10:48, 03/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Кто ж напишет PAM модуль для подтверждения по SMS, мне чёй-то так в падлу.

    [CODE]Debian GNU/Linux 6.0 servachok tty2

    servachok send SMS text OK to short nmr 5554 and enter the unlock code : _[/CODE]

     
  • 2.11, Олег (??), 13:36, 06/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Проспонсируешь? :)
     
     
  • 3.12, pavlinux (ok), 14:18, 06/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Проспонсируешь? :)

    Краудфандинг или как там это зовётся.

     
     
  • 4.13, Олег (??), 14:58, 06/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Ну как оно там зовется мне все равно :)
    Главное что бы это было кому нибудь нужно, и еще было бы неплохо что бы этот кто то еще и заплатил :)
     
     
  • 5.17, Аноним (-), 14:56, 20/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну как оно там зовется мне все равно :)
    > Главное что бы это было кому нибудь нужно, и еще было бы
    > неплохо что бы этот кто то еще и заплатил :)

    Тебе надо? Ты и плати.

    Пассажиров без тебя хватамбо.

     
     
  • 6.18, Аноним (-), 10:33, 22/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Не хами! Проходи мимо
     
  • 2.16, Filosof (ok), 19:42, 15/10/2013 [^] [^^] [^^^] [ответить]  
  • +/
    > Кто ж напишет PAM модуль для подтверждения по SMS, мне чёй-то так
    > в падлу.

    Я там ниже ссылку на коллекцию motp-поделок дал - там должно быть что-то готовое стоящее.

    Я лично СМСки шлю через внешний сервер - к нему стучусь через http rest. По сути скрипт-однострочник. Но для этой цели не пользовал - итак в телефоне стоит клиент-генератор.

     

  • 1.14, Filosof (ok), 19:33, 15/10/2013 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Пакет libpam-google-authenticator есть для бубунты. Думаю бекпортировать в Дебиан не должно быть проблемой - он весьма автономен.

    Делал на базе google-authenticator несколько серверов.
    Решение вполне годное с парой минусов:
    - Нужно мобильное устройство типа айОС/Андроид
    - Нужно каждому пользователю прописать ключ персонально (в штатной схеме. Мож можно и один на всех - не пробовал).
    Плюсы:
    + не надо СМСок - всё итак в "телефоне"
    + в Убунте ставится пакетиком из репа
    + Есть генератор QR кодов, чтоб не набирать сериализированный ключ руками.

    HOTP - это стрёмный вариант. Везде рекомендуется иметь TOTP. Синхронизация по времени таки на порядок надёжней счётчиков. Особенно при использовании больше чем одним человеком.

    Позже нашёл такой конструктор:
    http://motp.sourceforge.net/
    можно собрать авторизацию куда угодно, в каком угодно виде, и использовать в виде клиента что угодно. Думаю и к Гаусу и к Оаусу прикладывается.
    Стандарты рулят. Желающие сами написать могут модуль куда угодно. Математика же.
    Если удастся сделать красиво и элегантно - может напишу готовую заметку (может будет моей первой).

     
     
  • 2.20, Аноним (-), 10:33, 05/05/2017 [^] [^^] [^^^] [ответить]  
  • +/
    TOTP ME позволяет сделать то же самое на любой недорогой кнопочной мобиле с J2ME. Я проверял, it works.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру