Двухфакторная аутентификация Google Authenticator

Материал из ALT Linux Wiki

Введение

Двухфакторную аутентификацию для входа в систему (локально, через ssh, через OpenVPN и т.п.) можно настроить без использования аппаратных токенов, GSM-модемов для отправки СМС и прочего оборудования. Это можно сделать с использованием Google Authenticator.

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

Необходимые пакеты

Для работы с Google Authenticator необходимо установить пакет libpam-google-authenticator. Так же желательно установить библиотеку libqrencode4 (или libqrencode для систем на основе p8 или младше).

На смартфон можно стандартными способами установить программу Google Authenticator или FreeOTP.

О генерации ключа для пользователя можно почитать в интернете. Кратко: от пользователя запустить google-authenticator, на первый вопрос ответить "да", ввести ключ в смартфон (вручную или через QR-код, если установлена библиотека libqrencode и он отобразился на экране), подтвердить сохранение изменений.

Включение двухфакторной аутентификации для логина по ssh

Пример:

/etc/pam.d/ssh:

#%PAM-1.0
auth            include         system-auth-local
auth            [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf
auth            required        pam_google_authenticator.so echo_verification_code nullok
account         include         common-login
password        include         common-login
session         include         common-login

В файле /etc/security/access-local.conf нужно указать, при логине из каких подсетей не будет применяться двухфакторная аутентификация:

# Two-factor can be skipped on local network
+ : ALL : 192.168.1.0/24
+ : ALL : 127.0.0.1
+ : ALL : LOCAL
- : ALL : ALL
# empty line at the end!!!

Если нужно, чтоб пинкод запрашивался всегда, можно удалить строку с упоминанием этого файла из /etc/pam.d/ssh.

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

Включение двухфакторной аутентификации для логина через OpenVPN