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

"Двухфакторная аутентификация SSH"

Двухфакторная аутентификация обозначает, что для авторизации используется два метода. Первый из них, хорошо знакомый всем, способ авторизации по логину-паролю, второй с помощью разового кода, меняющегося с определенной периодичностью. Данный способ авторизации повышает степень устойчивости ко взлому, чем использование простой пары логин-пароль. В данном руководстве мы настроим двухфакторную авторизацию при помощи Google Authenticator.

Не без ложки дегтя, конечно. Телефон на котором стоит Google Authenticator, должен быть в сети, иначе сообщение с разовым кодом авторизации просто не дойдет. Но об этом ниже.

Требования

  • Сервер с Debian 10 (для 9 или 8 тоже должно работать)
  • Телефон с установленным Google Authenticator
  • SSH сервер с sudo доступом

Установка

Устанавливаем в одну команду:

sudo apt install libpam-google-authenticator

Настройка SSH сервера

Первым делом необходимо отредактировать /etc/pam.d/sshd, добавив в него следующую строку:

auth required pam_google_authenticator.so

Теперь изменим в файле /etc/ssh/sshd_config значение опции ChallengeResponseAuthentication на yes. Или, воспользуемся магией sed:

sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config

Перезапуск SSH сервера:

sudo service sshd restart

Настройка Google Authenticator

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

google-authenticator

Отвечаем на вопросы, которые нам задают:

Do you want authentication tokens to be time-based (y/n) y
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
  https://www.google.com/chart?chs=<>

<< ------ Тут будет QR-код ---------- >>

<< ------ Тут ваш секретный ключи и резервные коды ------ >>

Do you want me to update your "/home/user/.google_authenticator" file? (y/n) 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, a new token is generated every 30 seconds by the mobile app. 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. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server.
Do you want to do so? (y/n) y

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) y

Не пренебрегайте резервными кодами, они могут оказаться полезными, если вдруг у вас при себе нет телефона. Выпишите их и сохраните себе удобным вам способом.

Настройка приложения на телефоне

В приложение Google Authenticator жмем красный плюс и выбираем опцию "Сканировать штрих-код". Сканируем и на этом настройка завершена. Можно пробовать войти на сервер.

В заключение

Если у вас настроен метод авторизации по SSH-ключу, то временный пароль из Google Authenticator запрашиваться не будет, что есть достаточно удобно, например, для рабочего места, откуда вы постоянно ходите на свои сервера.

Так же хотелось бы предостеречь, что прежде чем что-то конфигурировать, особенно такие вещи как авторизацию, вы должны понимать что делаете. Рекомендую потренироваться на кошечках виртуалке, которую не жалко. Ибо в случае потери доступа к какому-нибудь важному серверу, вам как минимум понадобиться консольный доступ к нему.