Двухфакторная аутентификация SSH на Debian за 10 минут.

Среди множества способов защиты серверов, сайтов и прочего ценного и нужного, двухфакторная аутентификация представляется, как крайне удобный инструмент. Благо не проблема прикупить токен, либо использовать его софтовую версию на своем Android/IPhone/Blackberry. Около года назад я озаботился прикручиванием двухфакторки к своим серверам, морально готовясь к огню/воде/медным трубам, но оказалось, что это максимально просто. А раз просто, то откладывание на потом просто преступно по отношению к нашим серверам.

В данной статье я расскажу, как быстро настроить двухфакторную аутентификацию на базе pam модуля pam_google_authenticator и подружить SSH с Google токеном, свободно распространяемым через Apple Appstore и Google Play.

ВАЖНО: Двухфакторная аутентификация не будет работать, если для авторицации вы используете ключи.

ВАЖНО: Убедитесь, что время на вашем телефоне и на сервере, на котором будем производить настройку, идентично. В случае расхождения времени вы не сможете попасть на свой сервер!

Если вы не уверены в том, что время на сервере не рассинхронизируется и у вас не настроен ntp клиент, самое время его настроить:

1
2
sudo apt-get install ntpdate
sudo ntpdate-debian

Я использую стабильный Debian Sqeeze, в котором, в отличие от Wheezy, из коробки нужное нам ПО не ставится. Не беда, на странице http://packages.debian.org/wheezy/libpam-google-authenticator ищем последнюю версию под нашу архитектуру и качаем его. В примере я качаю версию под amd64, актуальную на момент написания статьи. Так-же скачаем и поставим генератор qr кодов.

1
2
3
4
cd /tmp
sudo wget http://ftp.ru.debian.org/debian/pool/main/g/google-authenticator/libpam-google-authenticator_20110413.68230188bdc7-1.1_amd64.deb
sudo aptitude install libqrencode3
sudo dpkg -i libpam-google-authenticator_20110413.68230188bdc7-1.1_amd64.deb

Далее заходим под пользователем, под которым будем ходить с нашим кодом и запускаем:

1
google-authenticator

Приложение сразу выдаст qr код, по которому удобно привязываться к смартфону, просто отсканировав его через программу Google Authenticator, а также резервные коды, которые мы сможем использоваться, если что-то со смартфоном случится, либо его просто не будет под рукой.

Теперь нам надо ответить на несколько вопросов:

Do you want me to update your "~/.google_authenticator" file (y/n)
Апдейтить файл ~/.google_authenticator  

-y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) 

Отключить многократное использование одного кода? 

-y

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) 
По умолчанию код действует 1,5 минуты, мы можем увеличить это время до 4 минут, что может помочь при проблемах с синхронизацией времени

-y/n

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) 
Ограничить число попыток ввода до 3-х за 30 секунд?

-y

Настроим SSH.

1
sudo nano /etc/ssh/sshd_config

Изменим значение ключа ChallengeResponseAuthentication на yes:

1
ChallengeResponseAuthentication yes

Перезагрузим SSH:

1
sudo /etc/init.d/ssh restart

Создадим файл, в котором будут описаны условия аутентификации:

1
sudo nano /etc/ssh/tf.conf
# Для сети 10.0.1.0 ходим с обычным паролем
+ : ALL : 10.0.1.0/24
# Рут ходит по одному паролю, после отладки можно грохнуть, так-же можно завести специального пользователя, под которым будем заходить при отсутствии под рукой телефона.
+ : root : ALL 
# Остальные будут ходить по двухфакторке.
- : ALL : ALL

Настроим PAM:

1
sudo nano /etc/pam.d/sshd

Добавим строки после «auth required pam_env.so envfile=/etc/default/locale»:

1
2
auth [success=1 default=ignore] pam_access.so accessfile=/etc/ssh/tf.conf
auth required pam_google_authenticator.so

Если мы все настроили правильно, то при следующей авторизации SSH попросит ввести Verification code.

На этом все. Спасибо за внимание.


Смотрите также

comments powered by Disqus