понедельник, 20 января 2014 г.

Одноразовые пароли для SSH

Если вы работаете системным администратором/программистом/или-типа-того, у вас может возникнуть необходимость воспользоваться чужим/публичным/недоверенным компьютером для доступа по ssh к хосту. При этом крайне не желательно раскрывать свой пароль, т.к. на компьютере могут быть кейлогеры или вы просто не помните свой пароль. Для решения данной задачи можно воспользоваться генератором одноразовых паролей на основе текущего времени(важно: время должно быть синхронизировано!). В частности, эту технологию поддерживает приложение от корпорации добра Google Authenticator.

Устанавливаем необходимые пакеты
# aptitude install libpam-oath oathtool openssl libmime-base32-perl qrencode imagemagick
Генерируем 20тисимвольный hex-ключ(Это важная особенность: модуль pam_oath понимает ключи в hex):
# head -c 1024 /dev/urandom |openssl sha1| tail -c 21
a32230ef2926f93f86f1
И записываем его в файл
# echo "HOTP/T30 useradm - a32230ef2926f93f86f1" >/etc/users.oath
# chmod go-rw /etc/users.oath
    Здесь:
  • useradm - имя пользователя, под которым мы логинимся
  • Т30 - временной интервал, в течении которого работают временные пароли. У Google Authenticator этот интервал равен 30 секундам.
  • HOTP - алгоритм генерации
Создаём файл /etc/pam.d/oath
auth sufficient pam_unix.so 
auth sufficient pam_oath.so usersfile=/etc/users.oath digits=6
И добавляем в файл /etc/pam.d/sshd строку
@include oath
над всеми инклюдами с авторизациями
Выводим на экран QR-код для считывания приложением Google Authenticator.
# perl -e 'use MIME::Base32 qw( RFC ); print  "otpauth://totp/MyServer:useradm?secret=".lc(MIME::Base32::encode(pack("H*","a32230ef2926f93f86f1")))."&issuer=MyServer";'|qrencode -s 10 -o -|display
    Здесь параметры имеют значение лишь для порядка, кроме сгенерированного выше ключа:
  • MyServer - имя вашего сервера
  • useradm - имя пользователя
Думаю так же на телефоне должно быть установлено приложение для считывания QR-кодов. У меня стоит вот это.
Так же документация рекомендует отредактировать параметр в файле /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
Проверить, правильные ли коды генерирует приложение на телефоне, можно консольной командой:
# watch -n 1 -c "oathtool --totp a32230ef2926f93f86f1"
    Поведение, которого я добивался в данной конфигурации:
  • спрашивается обычная авторизация pam_unix.
  • если удачно - авторизовались. Т.о. эта модернизация не мешает в штатной работе.
  • если не удачно - спрашиваем одноразовый пароль. Если удачно - авторизовались.
  • если не удачно - идём в начало
При желании конфигурацию легко можно переделать, сделав ввод одноразового пароля обязательным, реализовав таким образом двухфакторную авторизацию и усилив защиту сервиса.
-- По мотивам статьи на OpenNET

Комментариев нет:

Отправить комментарий