Безопасное подключение с чужого компьютера
Всем привет!
Так получилось, что знакомство с миром *NIX систем началось у меня в конце 90-х с системы FreeBSD, которая долгое время была любимой и с удовольствием использовалась для решения множества задач. Но, время шло, и приоритеты сместились в пользу Linux дистрибутивов, позволяющих «меньше нажимать на клавиши» для получения конечного результата. Однако, как «первая любовь» FreeBSD не забывается, и, сегодня я хочу рассказать об интересном и полезном варианте ее использования.
Итак, задача: Нужно подключиться SSH клиентом к «работе» с «чужого» компьютера и не хочется вводить пароль, «мало ли что»:) На следующей итерации можно так же подключиться по RDP или VNC добавив в настройки соединения SSH туннель, правда, пароль от этих сервисов придется вводить явно, но, будем считать SSH первым «фактором» двух факторной авторизации без доступа к которому скомпрометированный пароль RDP/VNC не угрожает безопасности.
Одним из вариантов решения этой задачи является использование одноразовых паролей, и, в состав базового ПО FreeBSD, уже давно входит реализация пакета OPIE (One time Passwords In Everything), которую мы и рассмотрим. Буду рад, если сообщество меня поправит, но в «мире» Linux дистрибутивов удалось обнаружить только пакет OTPW, требующий (опять, буду рад, если это не так) предварительной печати множества одноразовых паролей, например на бумаге.
Возвращаемся к FreeBSD, скачать свежий дистрибутив можно здесь:
https://www.freebsd.org/ru/where/
Установка не сильно отличается от установки большинства binary based дистрибутивов Linux, для многих экранов можно оставить значения по умолчанию. Здесь же можно настроить подключение к сети (для нашей задачи, система должна быть расположена так, что бы быть доступной «снаружи» и, в свою очередь, иметь доступ «внутрь»). Сервер SSH, с необходимым для работы OPIE параметром ChallengeResponseAuthentication yes, будет запущен по умолчанию. Нюансом может показаться отсутствие sudo, поэтому, в процессе инсталляции надо будет задать пароль root, а так же, создать учетную запись для администрирования системы (например, admin) включив ее в группу wheel, для которой разрешено использовать команду su. Если что-то упустили, всегда можно повторить, подключившись к консоли как root и набрав команду bsdconfig
По окончании процесса инсталляции подключаемся учетной записью администратора и поднимаем себе привилегии:
admin@bsdgate:~ $ su -
Password:
root@bsdgate:~ #
Cоздаем учетную запись пользователя, которым будем подключаться (команды и ключи напоминают аналогичные в Linux)
root@bsdgate:~ # pw useradd user1 -m
Теперь, ближе к нашей задаче, во FreeBSD уже «из коробки» библиотека PAM (Pluggable Authentication Modules) для сервиса sshd поддерживает OPIE
root@bsdgate:~ # cat /etc/pam.d/sshd
...
auth sufficient pam_opie.so no_warn no_fake_prompts
...
Это позволяет, даже не задавая unix пароль (с этой точки зрения ученая запись будет выгладить как заблокированная), задать для пользователя user1 «мастер» пароль OPIE (в документации — «защищенный пароль») который будет использоваться для генерации одноразовых паролей:
root@bsdgate:~ # su - user1
user1@bsdgate:~ $ opiepasswd -c -f
...
Enter new secret pass phrase: opassword1
Again new secret pass phrase: opassword1
ID user1 OTP key is 499 bs6909
SHOD VINE REAM HAIR JUDY BUST
В результате будет сгенерирован не являющийся секретом ключ (bs6909) и, на основе этого ключа и «мастер» пароля, одноразовый 499-й пароль (SHOD VINE REAM HAIR JUDY BUST)
Однако, если мы попробуем подключиться этим пользователем к нашей системе по ssh, нам потребуется уже 498-й пароль
login as: user1
Keyboard-interactive authentication prompts from server:
| otp-md5 498 bs6909 ext
| Password:
Получить его можно, например, используя телефон с Android и программу OTPdroid
https://play.google.com/store/apps/details? id=de.ub0r.android.otpdroid
Для удобства, можно нажать на Enter, что позволит вводить одноразовый пароль с отображением его на экране, а так же, не обязательно делать это в верхнем регистре:
...
| otp-md5 498 bs6909 ext
| Password [echo on]: lurk flag at len hug bite
End of keyboard-interactive prompts from server
...
Welcome to FreeBSD!
...
Магия в том, что «мастер» пароль хранится только в «голове» пользователя (ну или в программе OTPdroid на его телефоне), его НЕТ во FreeBSD!
В системе есть такой файл:
root@bsdgate:~ # cat /etc/opiekeys
user1 0499 bs6909 dabea335c94a38c3 Jan 30,2023 10:10:36
и на этом этапе в нем хранится хэш 499-й итерации функции MD5 над ключом и «мастер» паролем. От пользователя в этот момент потребуется 498 пароль, над ним произведут операцию MD5 и сравнят со значением в /etc/opiekeys. Если значения совпадут, пользователя «пустят» в систему (на самом деле, успешно отработает подсистема auth библиотеки PAM:) и в /etc/opiekeys запишется хэш 498-го пароля:
root@bsdgate:~ # cat /etc/opiekeys
user1 0498 bs6909 b4b034101201c6b1 Jan 30,2023 10:59:38
а для следующего подключения потребуется уже 497-й пароль. Красиво, правда?
Все это хорошо описано в системе документации к FreeBSD — Handbook
https://docs.freebsd.org/doc/8.4-RELEASE/usr/share/doc/freebsd/ru_RU.KOI8-R/books/handbook/one-time-passwords.html
В заключение могу только порекомендовать поменять порт ssh сервера на какой ни будь другой и усилить в систему сервисом fail2ban, ну и добавить sudo)
Спасибо, что дочитали до конца, буду рад, если кому то пригодится!