Итак, оказалось, что ответ на самом деле был намного, намного проще, чем я думал.
Тем не менее, я должен поблагодарить '@jeff schaller' за его комментарии, если бы не он, я бы не стал изучать, как работает конфигурация SSH 'Match'.
В любом случае
Хитрость заключается в том, чтобы установить файл конфигурации /etc/ssh/sshd _по умолчанию, чтобы он был конфигурацией, которую вы хотели бы иметь для доступа, поступающего из внешнего интернет-соединения.
В моем случае это означало установку следующего
PermitRootLogin no
PasswordAuthentication no
UsePAM no
Сделав это,Я заставляю ВСЕ входы в систему, независимо от того, откуда они происходят, использовать входы на основе ключей с использованием ключа SSH.
Затем на компьютерах с Windows я использовал «PuttyGen» для создания пары открытого и закрытого ключей, которую я сохранил на диск, и соответствующей записи ssh для моего файла «авторизованные _хосты» в домашнем каталоге внешних пользователей.
Я вставил этот ключ ssh в правильное место в домашней папке моих пользователей, затем настроил шпатлевку на использование частного (ppk )файла, сгенерированного PuttyGen, для входа в систему и сохранил профиль.
Затем я сохранил профиль и отправил его и файл ключа ppk внешнему пользователю безопасным способом. (Зашифрованное электронное письмо с вложенным защищенным паролем zip-файлом)
Как только пользователь получил ppk и профиль в своей копии шпатлевки и смог войти в систему, я добавил следующие две последние строки в мой файл конфигурации sshd _
Match Host server1,server1.internalnet.local,1.2.3.4
PasswordAuthentication yes
В строке "Совпадение" я изменил имена серверов, чтобы защитить имена своих собственных серверов.
Обратите внимание, что каждый домен сервера отделяется запятой и БЕЗ ПРОБЕЛОВ, это важно. Если вы поместите в него какие-либо пробелы, это приведет к тому, что SSHD не загрузит конфигурацию и сообщит об ошибке, 3 совпадения, которые у меня есть, делают следующее:
server1-соответствует всем, кто использует только «server1» без домена для подключения EG :«fred@server1»
server1.internalnet.local-соответствует любому, кто использует полное внутреннее доменное имя, например :'fred@server1.internalinternet.local' (ПРИМЕЧАНИЕ :для этого вам понадобится внутренний DNS работать правильно)
1.2.3.4-соответствует определенному IP-адресу. адрес, назначенный серверу SSH EG :'fred@1.2.3.4' здесь можно использовать подстановочные знаки или даже лучше в формате cidr сети/маски EG :1.2. Однако *или 192.168.1.0/8, если вы используете подстановочные знаки, прочитайте ответ fchurca ниже для некоторых важных примечаний.
Если какой-либо из предоставленных шаблонов соответствует хосту, к которому осуществляется доступ, то единственное изменение, которое необходимо внести в текущую конфигурацию, — это снова включить возможность интерактивного входа в систему с паролем.
Вы также можете поместить сюда другие директивы конфигурации, и эти директивы также будут снова включены для внутренних хостов, перечисленных в списке совпадений.
однако прочтите это:
https://man.openbsd.org/OpenBSD-current/man5/ssh_config.5
осторожно, поскольку не каждый параметр конфигурации разрешено использовать внутри блока соответствия, я обнаружил это, когда попытался «Использовать PAM да», чтобы снова включить аутентификацию PAM, только чтобы прямо сказать, что это не разрешено.
После внесения изменений введите
sshd -T
с последующим возвратом, чтобы проверить их перед попыткой перезапустить сервер, он сообщит обо всех ваших ошибках.
Помимо всего вышеперечисленного, мне очень помогли следующие две ссылки:
https://raymii.org/s/tutorials/Limit_access_to_openssh_features_with_the_Match_keyword.html
Ваш заменяющий текст содержит /
, который sed
обрабатывается как конец -выражения -, а затем сбой на следующем символе.
Либо измените разделитель с /
на что-то, что не появляется ни в совпадении с образцом, ни в его замещающем тексте, либо экранируйте символ обратной косой чертой:
s/"Host"/"Europe\/London"/g
s#"Host"#"Europe/London"#g