SSH — периодически запрашивать пароль, даже если присутствует открытый ключ

Возможно, Endless OSне является подходящим инструментом для достижения желаемого. Со страницы Endless OS Developer ,

Endless OS

Not your typical Linux distribution. We don’t use rpm, apt, or any other packaging system. We use a read-only root file system managed by OSTree with application bundles overlaid on top. We have a different target user. Most desktop Linux distributions are oriented towards tech-savvy users and developers. Simplicity is the key, so we carefully pick and choose the best applications available for our users. A number of core technologies underlie our OS, in particular the Linux kernel, OSTree, systemd, GNU, X, GNOME, and Xapian.

0
29.09.2019, 18:17
1 ответ

Изучив справочную страницу sshd_config(5), я нашел несколько ключевых слов конфигурации, которые можно было бы каким-то образом использовать для достижения этой цели.:

  1. Использовать модифицированныйAuthenticationMethodsс блокомMatch
  2. ИспользуйтеAuthorizedKeysCommandдля запуска сценария при каждом входе в систему, который решает, требуется ли пароль
  3. ИспользуйтеForceCommandдля выполнения пользовательской команды для проверки необходимого пароля после успешного входа в систему.

Подробно:

  1. Используйте модифицированныйAuthenticationMethodsс блокомMatch:с этим вы можете запретить аутентификацию с открытым ключом или дополнительно требовать аутентификацию по паролю для определенных пользователей:
Match User john
        AuthenticationMethods publickey,password publickey,keyboard-interactive

При этом пользователь johnдолжен ввести пароль после успешной аутентификации с открытым ключом. Но периодически менять , какие пользователи должны вводить свой пароль, немного сложно. Одним из способов может быть пользовательский сценарий для изменения sshd_configдля добавления/удаления пользователей и подачи сигнала sshdдля перезагрузки его конфигурации -, что является довольно неприятным хаком.

Единственный способ, которым я вижу Matchдинамически, этоGroup:

Match Group need-passwd
        AuthenticationMethods publickey,password publickey,keyboard-interactive

При этом вам не нужно изменять sshd_config, а только добавлять/удалять пользователей в системную группу need-passwdсоответственно. Затем sshdпроверит, входит ли пользователь в эту группу, и если да, то дополнительно потребует пароль.

  1. ИспользуйтеAuthorizedKeysCommandдля запуска сценария при каждом входе в систему, который решает, требуется ли пароль
# ignore existing authorized_keys files by default
AuthorizedKeysFile /dev/null
# instead load allowed authorized_keys using external command
AuthorizedKeysCommand /path/to/external_script.sh
# root is required to be able to read users ~/.ssh/authorized_keys files
AuthorizedKeysCommandUser root

Вместо sshdпрямого просмотра ~/.ssh/authorized_keysбудут использоваться только ключи, предоставленные external_script.sh, где вы можете реализовать свою пользовательскую логику, например. *поиск последнего успешного удаленного входа пользователя в систему *если это было более 24 часов назад, не возвращайте авторизованные ключи,эффективное отключение аутентификации с открытым ключом *если это было в течение последних 24 часов, просто верните содержимое~/.ssh/authorized_keys

Последнее является причиной того, что external_script.shтребуется rootдоступ для чтения файлов в домашней папке пользователей.

Недостаток этого подхода по сравнению с 1. и 3. заключается в том, что вам придется фактически снизить уровень безопасности, разрешив вход только с паролем -.

  1. ИспользуйтеForceCommandдля выполнения пользовательской команды для проверки необходимого пароля после успешного входа в систему.

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

Недостатком здесь является то, что это довольно сложно сделать правильно :*поскольку команда выполняется только после успешного входа в систему пользователь уже будет в системе -, что означает, что запрошенный порт/X11/ssh -переадресация агента может быть уже активна до того, как пароль вводится *правильная обработка предоставленной командной строки -если таковая имеется -может потребоваться внимательное экранирование всех строк

Кроме того, поскольку пароль/логин запрашивается пользовательским скриптом, он не будет поддерживаться/обрабатываться клиентами ssh, но требует работающего tty.

Вы можете комбинировать подход 2. и 3. вместо того, чтобы возвращать неавторизованные ключи, добавляйте к строкам префикс с опциями restrictполный доступ и выполняйте только принудительный пользовательский command, см. АВТОРИЗОВАННЫЕ _КЛЮЧИ _ФАЙЛ _ФОРМАТ .

0
28.01.2020, 03:14

Теги

Похожие вопросы