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

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

@webware

t.me/webware

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


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


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

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

Подробнее о технологии в вики:

https://ru.wikipedia.org/wiki/Google_Authenticator


Ключи бывают 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 или Authy


Google Authenticator для iOS

Google Authenticator для Android 

Authenticator+ для Windows Phone

Я для примера использовал именно 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

Получаем:

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

https://www.google.com/chart?chs=20...://totp/log@logserver?secret=IPSVMLQ7EYYBKCSD


Секретный 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

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

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

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

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

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

ПС: Ну и как же без бонуса? 

Hardware реализация ТОТР на arduino. 

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

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

Источник codeby.net

Report Page