Изучив справочную страницу 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
, см. АВТОРИЗОВАННЫЕ _КЛЮЧИ _ФАЙЛ _ФОРМАТ .
Это не так жестко запрограммировано, как вы утверждаете. Максимальное число для вашей системы
. cat /proc/sys/fs/file-max
Для меня это будет 3257198. Если вы любите (изменять параметры ядра на лету, мммммм ), вы можете изменить это число.
Абсолютный максимум дается тем фактом, что это long
целое число в C, и, следовательно, максимум будет 2147483647.
Для каждого процесса максимум
cat /proc/sys/fs/nr_open
(в моей системе также ваш 1048576 ).
Технически это unsigned long (см. fs.h
; найдите unsigned long max_files;
в struct files_stat_struct
. Но количество открытых файлов на процесс должно быть ниже максимального системного -, поэтому оно должно быть ниже 2147483647 или ниже вашего cat /proc/sys/fs/file-max
значения.