Двухфакторная аутентификация в OpenSSH на СentOS 6.x

Заморочки с безопасностью продолжаются. Двухфакторная аутентификация – это очень кашерно (כשר לפסח) — предоставление информации от двух различных типов аутентификации информации источнику запроса. Например, это могут быть последовательно введённые пароль и код, который выдаёт токен с кнопкой, или аппликация для Android\iPhone или даже плагин для Firefox GAuth Authenticator. Принцип работы простой и понятный. В репозитория можно откапать готовый пакет google-authenticator или собрать самому из исходных кодов, что тоже просто, никаких особенных зависимостей у утилиты нет. Исходники открыты и доступны, так что без паранои. Кароч, хватит текста, давайте замутим двухфакторную аутентификацию на нашем Centos 6.4 сервере.

Подготовка сервера

Если вы хотите ставить пакет из репозитория, а не собирать самому, то вам придется воспользоваться предыдущей статьей на этом блоге, в которой подробно написано как добавить экстра репозитории Remi и Epel себе в систему.

Далее проверим и убедимся, что время на сервере в порядке:

yum install ntp -y
chkconfig ntpd on; ntpdate pool.ntp.org; /etc/init.d/ntpd start
yum install ntp -y
chkconfig ntpd on; ntpdate pool.ntp.org; /etc/init.d/ntpd start

Если вам необходимо сменить часовой пояс, это просто:

mv /etc/localtime /etc/localtime.old
ln -sf /usr/share/zoneinfo/Europe/Athens /etc/localtime
hwclock --systohc
mv /etc/localtime /etc/localtime.old
ln -sf /usr/share/zoneinfo/Europe/Athens /etc/localtime
hwclock --systohc

Теперь нужен сам пакет, из репозитория:

yum install google-authenticator -y
yum install google-authenticator -y

Или собираем из исходников:

yum install gcc gcc++ pam-devel subversion python-devel git wget make
yum install gcc gcc++ pam-devel subversion python-devel git wget make

Выделим для кода папку:

mkdir /root/google-authenticator; cd /root/google-authenticator
mkdir /root/google-authenticator; cd /root/google-authenticator

Получим код:

git clone https://code.google.com/p/google-authenticator/
cd google-authenticator/libpam/
git clone https://code.google.com/p/google-authenticator/
cd google-authenticator/libpam/

Скомпилируем код и поставим в систему:

sudo make && make install
sudo make && make install

Настраиваем OpenSSH

Откроем файл настройки аутентификации и перепилим его:

cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
vim /etc/pam.d/sshd
cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
vim /etc/pam.d/sshd

Содержимое:

auth       required     pam_google_authenticator.so
auth       include      password-auth
account    include      password-auth
session    include      password-auth
account    required     pam_nologin.so
auth       required     pam_google_authenticator.so
auth       include      password-auth
account    include      password-auth
session    include      password-auth
account    required     pam_nologin.so

Откроем файл настройки OpenSSH:

vim /etc/ssh/sshd_config
vim /etc/ssh/sshd_config

И меням “no” на “yes”:

...
ChallengeResponseAuthentication yes
...
...
ChallengeResponseAuthentication yes
...

Так-же смотрим что параметр UsePAM включен:

...
UsePAM yes
...
...
UsePAM yes
...

Перезапускаем демон OpenSSH:

service sshd restart
service sshd restart

И запускаем google-authenticator:

google-authenticator
google-authenticator

Там видим ссылку на QR код, его сканируем аппликацей Google Authenticator для этого у вас в телефоне должен быть уже установлен ZXing Barcode Scanner которая кстати open source

После того как телефон прочитал QR код можно смело отвечать на все вопросы которые задаст вам утилита:
— Сохранить всё насовсем в ~/.google_authenticator?
— y
— Запретить использование одного кода несколько раз? Помогает заметить или даже предотвратить атаку man-in-the-middle.
— y
— Увеличить окно времени с приблизительно 1.5 минут до 4 минут?
— n (и тут сразу проверяем, точно ли время в телефоне; впрочем, Google Authenticator последних версий умеет синхронизировать время из интернета)
— Ограничить число попыток логина за промежуток времени?
— y

Теперь можете осуществить логин на сервер (Видно что добавилась строчка Verification code):

login as: root
Using keyboard-interactive authentication.
Verification code:
Using keyboard-interactive authentication.
Password:
Last login: Mon Sep  9 15:55:44 2013 from
login as: root
Using keyboard-interactive authentication.
Verification code:
Using keyboard-interactive authentication.
Password:
Last login: Mon Sep  9 15:55:44 2013 from

P.S.: Кстати, в новой версии OpenSSH есть возможность замутить аутентификацию по ключу и токену. В старой версии такого нет. В CentOS 6.4 в репах и в системе старая версия 5.3p1, а надо OpenSSH 6.2 минимум. Такую версию для CentOS придется собирать самому. Исходники тут.

P.S2.: Хотя вот нашлись и RPM пакеты тут.