Двухфакторная аутентификация — предоставления информации от двух различных типов аутентификации информации [»]
Например, это могут быть последовательно введённые пароль и код, который выдаёт токен с кнопкой. Думаю, многие из вас такие девайсы видели, а кто-то даже их регулярно использует.
Это как если бы на дверь поставили второй замок. Ключ к первому — обычный пароль. Ко второму — действующий в течение 30 секунд одноразовый код. Попасть за дверь можно только если оба ключа окажутся правильными, а не один, как было раньше.
С некоторых пор Google сделала доступной двухфакторную аутентификацию в своих сервисах. Теперь токен переехал в ваш мобильный телефон с Android'ом! iPhone и Blackberry тоже сгодятся в такой роли. Очень удобно. Опробовав на Gmail, мне захотелось такую же штуку сделать у себя, тут-то я внезапно и нашёл libpam-google-authenticator.
В самом начале, при инициализации создаётся секретный ключ, который будет записан и на сервере, и который нужно ввести в приложение на телефоне. Это одноразовая процедура, потом они работают уже сами по себе. Каждый раз из секретного ключа и текущего времени вычисляется по специальному алгоритму код, действующий в течение 30 секунд.
Подчеркну, что сервера Гугла в аутентификации не задействованы — просто алгоритм и форматы ключей совместимы с используемыми в Гугловых сервисах, что даёт возможность использовать готовые мобильные приложения. Для параноиков — исходники открыты, ссылка на них есть в конце поста :)
У меня стоит Debian testing (Wheezy), поэтому всё доступно «из коробки»:
В Debian stable (Sqeeze) этот модуль ещё не добавили, но пакет из testing ставится без проблем.
Тут самое время достать свой телефон. Если в нём Андроид — скачать туда Google Authenticator. Ещё пригодится сканер QR кодов, например такой. Если смартфон иной, то вам сюда.
Каждый пользователь на сервере, планирующий туда попасть, должен вначале запустить консольную тулзу, которая так и называется
И сразу рисует такой симпатичный QR код, содержащий в себе секретный ключ
А также 5 резервных кодов на всякий случай, вдруг с телефоном что-то случится. А по URL, который тулза тоже пишет, ходить не нужно — там лишь рисуется QR код покрасивее. Вы ведь не хотите показывать свой секретный код Гуглу? :)
QR код сразу сканируем из приложения, потом отвечаем на вопросы.
— Сохранить всё насовсем в
— y
— Запретить использование одного кода несколько раз? Помогает отловить или предотвратить атаку man-in-the-middle.
— y
— Увеличить окно времени с приблизительно 1.5 минут до 4 минут?
— n (и тут сразу проверяем, точно ли время в телефоне)
— Ограничить число попыток логина за промежуток времени?
— y
Если файл
Пока всё не заработает, рутовый шелл лучше оставить открытым
В /etc/ssh/sshd_config включаем challenge-response и рестарт ssh:
Для управления аутентификацией создаём файл /etc/ssh/two-factor-skip.conf, например такой:
В /etc/pam.d/sshd вписываем две строки:
Лучше всего их вписать перед
ssh туда, где всё это только что настраивали. Вводим временный код, затем пароль. Наслаждаемся.
Из-за текущих особенностей работы OpenSSH, если ходим по ключу — двухфакторная аутентификация не работает (не используется PAM). К сожалению.
Можно таким образом улучшить и другие сервисы, использующие PAM.
Например, это могут быть последовательно введённые пароль и код, который выдаёт токен с кнопкой. Думаю, многие из вас такие девайсы видели, а кто-то даже их регулярно использует.
Это как если бы на дверь поставили второй замок. Ключ к первому — обычный пароль. Ко второму — действующий в течение 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.