Приветствую читателей (и писателей 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
Получаем:
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
Введя последовательно пароль , а потом сгенерированный код с нашего Google Authenticator, мы успешно авторизируемся по ssh.
Вот так выглядят ключи в приложении.
Еще есть возможность использовать связки Public Key + TOTP . Настройка схожая.
Таким образом добавив 2й фактор, наш сервер стал немного защищеннее.
Надеюсь статья Вам понравилась. Если есть замечания или пожелания - пишите в комментариях.
ПС: Ну и как же без бонуса?
Hardware реализация ТОТР на arduino.
Собственно именно она меня и сподвигла на изучение этой технологии.
ППС: Если вам интересен прототип, собранный на Arduino - пишите в комментариях - вынесу в отдельную статью.
Давеча появилась у меня навязчивая идея сделать двухфакторную авторизацию для 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
Получаем:
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
Введя последовательно пароль , а потом сгенерированный код с нашего Google Authenticator, мы успешно авторизируемся по ssh.
Вот так выглядят ключи в приложении.
Еще есть возможность использовать связки Public Key + TOTP . Настройка схожая.
Таким образом добавив 2й фактор, наш сервер стал немного защищеннее.
Надеюсь статья Вам понравилась. Если есть замечания или пожелания - пишите в комментариях.
ПС: Ну и как же без бонуса?
Hardware реализация ТОТР на arduino.
Собственно именно она меня и сподвигла на изучение этой технологии.
ППС: Если вам интересен прототип, собранный на Arduino - пишите в комментариях - вынесу в отдельную статью.