Возможно, 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.
Изучив справочную страницу sshd_config(5)
, я нашел несколько ключевых слов конфигурации, которые можно было бы каким-то образом использовать для достижения этой цели.:
AuthenticationMethods
с блокомMatch
AuthorizedKeysCommand
для запуска сценария при каждом входе в систему, который решает, требуется ли пароль ForceCommand
для выполнения пользовательской команды для проверки необходимого пароля после успешного входа в систему. Подробно:
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
проверит, входит ли пользователь в эту группу, и если да, то дополнительно потребует пароль.
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. заключается в том, что вам придется фактически снизить уровень безопасности, разрешив вход только с паролем -.
ForceCommand
для выполнения пользовательской команды для проверки необходимого пароля после успешного входа в систему. Вместо выполнения команды, предоставленной клиенту ssh
пользователем, ForceCommand
будет выполняться после успешного входа в систему (с открытым ключом ). В этой команде вы можете реализовать свою пользовательскую логику (, см. выше ), и сначала запросить пароль для входа, если это необходимо, или просто выполнить предоставленную командную строку.
Недостатком здесь является то, что это довольно сложно сделать правильно :*поскольку команда выполняется только после успешного входа в систему пользователь уже будет в системе -, что означает, что запрошенный порт/X11/ssh -переадресация агента может быть уже активна до того, как пароль вводится *правильная обработка предоставленной командной строки -если таковая имеется -может потребоваться внимательное экранирование всех строк
Кроме того, поскольку пароль/логин запрашивается пользовательским скриптом, он не будет поддерживаться/обрабатываться клиентами ssh
, но требует работающего tty
.
Вы можете комбинировать подход 2. и 3. вместо того, чтобы возвращать неавторизованные ключи, добавляйте к строкам префикс с опциями restrict
полный доступ и выполняйте только принудительный пользовательский command
, см. АВТОРИЗОВАННЫЕ _КЛЮЧИ _ФАЙЛ _ФОРМАТ .