Статья Debian * настройка двухфакторной авторизации для ssh

Приветствую читателей (и писателей CODEBY)!

Давеча появилась у меня навязчивая идея сделать двухфакторную авторизацию для SSH с помощью TOTP паролей. В этой статье я напишу простой способ это сделать. Информация актуальна для debian-based дистрибутивов. Пример привожу для ubuntu server 14.04

Немного об двухфакторной авторизации.

В данном случае я хочу использовать пароль как первый фактор доступа по ssh и TOTP код , как второй.
Подробнее о технологии в вики:


Ключи бывают OTP и TOTP

OTP – One-Time Password – одноразовый пароль, после использования невалидный.
TOTP – Time-based One-Time Password – генерирует пароль, который действительный 30 секунд (по стандарту применяемому в Google Authenticator)

ТОТР в кратце работает так - берется timestamp в формате unixtime и возводится в функцию от sha1-hmac от passphrase. Итого (unixtime * sha1(passphrase) = 123456 (6ти значный код). Этот код генерируется в приложении и служит для проверки.

1. Подготовка


В первую очередь нужно синхронизировать время и убедиться, что временные зоны установлены корректно. (Время на смартфоне и сервере должны совпадать иначе unixtime будет отличаться и вы не получите правильный код).

date - просмотреть системное время
date +%s - просмотреть системное время в формате Unixtime
Выставите правильное для вашей временной зоны время для вашего дистрибутива.

Далее нам понадобится смартфон для генерации кодов.
Приложение: или


Google Authenticator для
Google Authenticator для Android
Authenticator+ для

Я для примера использовал именно Google Authenticator.


2. Генерация ключа на сервере

Установка Google Authenticator:

sudo apt-get install libpam-google-authenticator


Генерация:

google-authenticator


Do you want authentication tokens to be time-based (y/n) Y

logserver_TOTP_001.png
Получаем:
QR CODE : Можно отсканировать через камеру смартфона в приложении.


Секретный 16-ти значный ключ для Приложения google-authenticator, можно ввести вручную
Your new secret key is: IPSVMLQ7EYYBKCSD
Your verification code is 682522 проверочный код (Генерирует 6 символов)

Коды восстановления (OTP) , каждый код одноразовый, если вдруг потеряете телефон\ забудете секретный код, с их помощью можно восстановить.
Your emergency scratch codes are:
90324048

31642211

35281275


Далее:
Do you want me to update your "/home/log/.google_authenticator" file (y/n) Y

На смартфоне добавьте данный ключ (IPSVMLQ7EYYBKCSD) либо qr code , там появится учетная запись вида username@hostname

В нашем случае log@logserver

Далее:

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


Запретить нескольким пользователям использовать один и тот же ОТР в один промежуток времени. Отвечаем “Y” , для предотвращения перехвата ТOTP кода и использования его повторно.

Далее:
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:30 до 4 минут (По умолчанию 30 секунд х 3 попытки = 1:30 ) – Отвечаем “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) Y


Предотвращает брут-форс ОТР кода , подтверждаем “Y” для лимита 3 попытки на 30 сек.

Ключ успешно сгенерирован.

3. Настройки Аутентификации


3.1 Настрока РАМ


В данном примере используется PAM – Pluggable Authentication Modules.

ВНИМАНИЕ:
Пока проводите настройки, держите хотя бы 1 сессию с сервером открытой, если что-то сделаете не так, что бы была возможность исправить конфигурацию.


Редактируем любым редактором конфигурацию PAM

sudo nano /etc/pam.d/sshd

Добавляем в конец файла:

auth required pam_unix.so no_warn try_first_pass

auth required pam_google_authenticator.so nullok


Первая строчка разрешает проверку пароля от ssh
Вторая вызывает проверку TOTP кода.
Параметры этого PAM сохранены в
~/.google_authenticator

3.2 Настройка SSH

Редактируем любым редактором конфигурацию

sudo nano /etc/ssh/sshd_config

Установить порт (крайне рекомендую изменить на нестандартный)
Port 22
Для статического IP привязываем адресс сервера.
ListenAddress 10.10.100.20
Отключаем вход для root пользователя.
PermitRootLogin no
Отключаем пустые пароли
PermitEmptyPasswords no

Ищем строку:
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

PasswordAuthentication yes
В конце добавляем:
UsePAM yes
Match User log

AuthenticationMethods keyboard-interactive

Это правило для пользователя log
вторая строка – после пароля проверять TОТР.

Если хотите применить правило для всех пользователей оставьте только
AuthenticationMethods keyboard-interactive

Если для конкретных пользователей, то продублируйте строки

Match User user1
AuthenticationMethods keyboard-interactive
Match User user2
AuthenticationMethods keyboard-interactive

Сохраняем конфигурацию.
Перезагружаем службу sshd :


sudo service sshd restart (sudo systemctl restart ssh)

4. Проверка

Пробуем подключиться к серверу по ssh

ssh log@10.10.100.20

logserver_TOTP_003.png

Введя последовательно пароль , а потом сгенерированный код с нашего Google Authenticator, мы успешно авторизируемся по ssh.

google auth.png

Вот так выглядят ключи в приложении.

Еще есть возможность использовать связки Public Key + TOTP . Настройка схожая.

Таким образом добавив 2й фактор, наш сервер стал немного защищеннее.

Надеюсь статья Вам понравилась. Если есть замечания или пожелания - пишите в комментариях.

ПС: Ну и как же без бонуса?
Hardware реализация ТОТР на arduino.
logserver_totp_004_bonus.jpg

logserver_totp_005_bonus.jpg

Собственно именно она меня и сподвигла на изучение этой технологии.

ППС: Если вам интересен прототип, собранный на Arduino - пишите в комментариях - вынесу в отдельную статью.
 

ghost

Well-known member
12.05.2016
1 636
3 289
BIT
0
Действительно интересная статья. Спасибо. А про прототип на ардуино конечно напиши. Здесь мало чего о таком к сожалению.
 
  • Нравится
Реакции: Vertigo
D

Dmitry88

Забыл дополнить важный момент.

Для восстановления доступа:

  • Если Вы потеряли телефон , либо сбосили на заводские, Вы можете повторно добавить secret key.

  • Если Вы потеряли secret key , можно использовать recovery codes как verification code. (Учтите, они - одноразовые! )

  • Если потеряли все, подключитесь к серверу руками , или через панель управления хостера, после этого переименуйте или удалите файл ~/.google_authenticator
Убедитесь что в /etc/pam.d/sshd по прежнему стоит параметр "nullok"
После этого сгенерируйте новый ~/.google_authenticator , через команду google-authenticator

Ну и перезапустите ssh.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!