Двухфакторная аутентификация на домашнем серваке — быстро, дёшево, дружелюбно

    Двухфакторная аутентификация — предоставления информации от двух различных типов аутентификации информации [»]

    Например, это могут быть последовательно введённые пароль и код, который выдаёт токен с кнопкой. Думаю, многие из вас такие девайсы видели, а кто-то даже их регулярно использует.



    Это как если бы на дверь поставили второй замок. Ключ к первому — обычный пароль. Ко второму — действующий в течение 30 секунд одноразовый код. Попасть за дверь можно только если оба ключа окажутся правильными, а не один, как было раньше.

    С некоторых пор Google сделала доступной двухфакторную аутентификацию в своих сервисах. Теперь токен переехал в ваш мобильный телефон с Android'ом! iPhone и Blackberry тоже сгодятся в такой роли. Очень удобно. Опробовав на Gmail, мне захотелось такую же штуку сделать у себя, тут-то я внезапно и нашёл libpam-google-authenticator.

    В самом начале, при инициализации создаётся секретный ключ, который будет записан и на сервере, и который нужно ввести в приложение на телефоне. Это одноразовая процедура, потом они работают уже сами по себе. Каждый раз из секретного ключа и текущего времени вычисляется по специальному алгоритму код, действующий в течение 30 секунд.

    Подчеркну, что сервера Гугла в аутентификации не задействованы — просто алгоритм и форматы ключей совместимы с используемыми в Гугловых сервисах, что даёт возможность использовать готовые мобильные приложения. Для параноиков — исходники открыты, ссылка на них есть в конце поста :)

    Ставим и готовимся


    У меня стоит Debian testing (Wheezy), поэтому всё доступно «из коробки»:

    aptitude install libpam-google-authenticator

    В Debian stable (Sqeeze) этот модуль ещё не добавили, но пакет из testing ставится без проблем.

    Тут самое время достать свой телефон. Если в нём Андроид — скачать туда Google Authenticator. Ещё пригодится сканер QR кодов, например такой. Если смартфон иной, то вам сюда.

    Каждый пользователь на сервере, планирующий туда попасть, должен вначале запустить консольную тулзу, которая так и называется

    google-authenticator

    И сразу рисует такой симпатичный QR код, содержащий в себе секретный ключ



    А также 5 резервных кодов на всякий случай, вдруг с телефоном что-то случится. А по URL, который тулза тоже пишет, ходить не нужно — там лишь рисуется QR код покрасивее. Вы ведь не хотите показывать свой секретный код Гуглу? :)

    QR код сразу сканируем из приложения, потом отвечаем на вопросы.
    — Сохранить всё насовсем в ~/.google_authenticator?
    — y
    — Запретить использование одного кода несколько раз? Помогает отловить или предотвратить атаку man-in-the-middle.
    — y
    — Увеличить окно времени с приблизительно 1.5 минут до 4 минут?
    — n (и тут сразу проверяем, точно ли время в телефоне)
    — Ограничить число попыток логина за промежуток времени?
    — y

    Если файл ~/.google_authenticator (кстати, путь к нему можно изменить соответствующей опцией модуля) отсутствует, то пользователя не пустят.

    Настроим SSH и PAM


    Пока всё не заработает, рутовый шелл лучше оставить открытым

    В /etc/ssh/sshd_config включаем challenge-response и рестарт ssh:

    ChallengeResponseAuthentication yes

    Для управления аутентификацией создаём файл /etc/ssh/two-factor-skip.conf, например такой:

    # В локальной сети ходим с одним паролем
    + : ALL : 192.168.1.0/24
    # Этот юзер умеет вводить только пароль
    + : bezmobilki : ALL
    # Всех остальных заставим вводить ещё и временный код
    - : ALL : ALL


    В /etc/pam.d/sshd вписываем две строки:

    auth [success=1 default=ignore] pam_access.so accessfile=/etc/ssh/two-factor-skip.conf
    auth       required     pam_google_authenticator.so


    Лучше всего их вписать перед @include common-auth

    Проверяем


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

    Из-за текущих особенностей работы OpenSSH, если ходим по ключу — двухфакторная аутентификация не работает (не используется PAM). К сожалению.

    Что дальше?


    Можно таким образом улучшить и другие сервисы, использующие PAM.

    Ссылки


    1. code.google.com/p/google-authenticator/wiki/PamModuleInstructions
    2. code.google.com/p/google-authenticator
    3. tools.ietf.org/html/rfc6238
    4. habrahabr.ru/blogs/google/125193
    5. www.google.com/support/accounts/bin/answer.py?hl=ru&answer=1066447

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 29

    • UFO just landed and posted this here
        –3
        Которая стоит от 40к$ единоразово?
        • UFO just landed and posted this here
          0
          Поддерживаю! Сам активно его использую как второй фактор для LastPass, самое то (в качестве третьего использую сканер отпечатков пальца, когда с ноутбука).
          +1
          Определённо, в последнее время, очень торт!

          P.S. Для айфона тоже есть гугловская тулза.
            0
            Да, ещё и для Blackberry. Обновил пост.
            +2
            Может стоить поподробнее описать сам процесс аутенфикации, а то не все используют его в гугле.

            И не очень понятно насколько важно, что сервак домашний — на удаленном не заработает?
              0
              Да, стоит. Добавил пару фраз.

              «Домашний» это шутка :) Разумеется можно всё внедрить где угодно, причём даже не только в SSH, но и в любой сервис, который использует PAM. Например, FTP.
                0
                Что это такое вообще понятно, не понятно как работает конкретная реализация. Телефон и сервер генерируют две одинаковые последовательности кодов на основе общего секретного инициирующего кода (а ля псевдослучайные числа) или «токен» лишь показывает коды, которые ему как-то отсылает сервер (а то и гугл отсылает и на токен, и на сервер)?
                  0
                  Спасибо, действительно надо уточнить, пост обновил. Самому-то всё понятно, а вот читателю не всегда :)
                  0
                  FTP будет запрашивать два пароля?
                +3
                [paranoia]
                Датчиков в 3D сканере реальности Гугла становится все больше…
                [/paranoia]
                  0
                  Данная либа лишь разработана Гуглом, код открыт и никакие данные самому Гуглу не передаются, насколько мнe известно.
                    0
                    Тогда прошу, прощения, я сразу не разобрался.

                    [paranoia] Правда на истинность общего утверждения выше это практически не влияет :) [/paranoia]
                    0
                    В данном случае Гугл никакие данные не собирает :) По ссылке, которую тулза выдаёт перед QR кодом, ходить не нужно.
                      0
                      Вполне может собирать, ведь данные через него идут. Или это аутентификация гугла без серверов гугла?
                        0
                        Без.

                        Просто конкретные форматы секретного кода и временных кодов совместимы с гуглевской системой и можно использовать их готовое мобильное приложение.
                          0
                          А что мешает сделать аутентификацию гугла без серверов гугла? Это просто очередная реализация OTP ключей…
                            0
                            Да, я уже понял как это работает. Всем спасибо.
                      0
                      Хочу под виндовс такую штуку на рабочий комп.
                        0
                        А вот, кстати, вопрос. Имеет ли смысл такое приложение непосредственно на раб. станции с которой будет осуществляться вход, а не на смарте? Вопрос не конкретно вам, baxtep2, если что:)
                          0
                          Я бы не стал так делать, т.к. секретный ключ придётся хранить тоже на раб. станции, а он будет в более уязвимом положении — ведь можно подхватить трояна. Или враг может в ваше отсутствие пошарить на диске. Разные яйца лучше хранить в разных корзинах :)
                            0
                            генератор кодов у меня в Айфоне уже есть. Хочу что бы после ввода пароля еще и с айфоном код сверялся.
                        0
                        и тут сразу проверяем, точно ли время в телефоне


                        Вот это кстати да… совсем недавно находясь в другом часовом поясе эта вся хренатень распрекрасная система перестала работать!

                        Незнаю что именно сбило все — в ручную настроенное время в телефоне или автоматическая настройка на буке… но гугл не принимал коды.

                        Если у кого есть решение для путешественников — огласите пжлста.
                          0
                          Нужно, чтобы время в UTC на обоих сторонах совпадало. В Linux внутри время всегда в UTC, а текущее вычисляется на основе описания timezone. В Android'е, как частном случае Linux, все точно так же. Поэтому выставляем вначале текущее смещение от UTC, потом правильное время и всё будет работать.

                          У меня в телефоне обновления таймзоны (отменённый в этом году переход между зимним и летним временем) ещё не пришли, поэтому находясь в Москве, выставляю «Дубай». Это именно то, что нужно — смещение UTC+4 и нет зимнего/летнего времени.
                          +1
                          Есть решения проверенные и зарекомендовавшие себя: E-NUM

                          Чаще всего видно его использование при входе на сайты системы WebMoney Transfer и при оплате товаров на WebMoney Merchant

                          Есть клиенты для:

                          Java
                          Android
                          iOS
                          Windows Mobile
                            +1
                            Dubstep щаз самое то :)
                              0
                              Опыт показывает, что необходимость дополнительного устройства у клиента делает систему неудобной для массового пользователя.
                              Вроде бы и круто, но в большинство упрямо не хочет пользоваться.
                              Причем, даже бесплатность клиентского терминала не решает проблему…
                                0
                                Ссылка на Google Authenticator устарела, по возможности обновите

                                Only users with full accounts can post comments. Log in, please.