Я пытаюсь добиться следующего на своих серверах OpenBSD 6.9:
- Запрет на использование всех ключей, кроме
ssh-ed25519
один на обоих СЕРВЕР и КЛИЕНТ стороны.
- Ограничение
ssh-кейген -A
генерировать ключи только авторизованным ssh-ed25519
Алгоритм и ничего больше.
Чтобы добиться этого, я добавил следующие строки в свой sshd_config
:
Ключ хоста /etc/ssh/ssh_host_ed25519_key
CASignatureAlgorithms ssh-ed25519
HostbasedAcceptedKeyTypes ssh-ed25519
HostKeyAlgorithms ssh-ed25519
PubkeyAcceptedKeyTypes ssh-ed25519
Я также добавил следующие строки в свой ssh_config
:
CASignatureAlgorithms ssh-ed25519
HostbasedAcceptedKeyTypes ssh-ed25519
HostKeyAlgorithms ssh-ed25519
PubkeyAcceptedKeyTypes ssh-ed25519
Я удалил все ключи, кроме авторизованного.
Перезапустил sshd:
# rcctl перезапустить sshd
sshd (хорошо)
sshd (хорошо)
После проверки того, используются ли мои настройки, выполнив следующие команды:
# ssh -Q Принятые алгоритмы на основе хоста
# ssh -Q Алгоритмы ключа хоста
# ssh -Q PubkeyAcceptedAlgorithms
К моему удивлению, вот с чем они все возвращаются:
ssh-ed25519
[email protected]
[email protected]
[email protected]
ssh-rsa
rsa-sha2-256
rsa-sha2-512
ssh-dss
ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Другими словами, ключевые ограничения игнорируются.
На всякий случай я даже перезапустил сервер, но разницы нет.
Потенциальный обходной путь — удалить все ключевые файлы, кроме авторизованного. Тем не менее, сценарий инициализации /etc/rc
имеет линию, ssh-кейген -A
, который восстанавливает все отсутствующие ключи ssh после каждой перезагрузки системы, прежде чем запустится демон sshd, в том числе запрещенных алгоритмов!
Так что удаление ключей не решает проблему.
В качестве дополнительного обходного пути я мог бы удалить ssh-кейген -A
строку из сценария инициализации или заменить ее на мой собственный алгоритм генерации ключей, но это приведет к тому, с чего все началось: необходимость решать эту проблему снова и снова, например. после каждого обновления системы, всякий раз, когда команда OpenBSD выпускает новую версию /etc/rc
. Автоматизировать удаление этой строки и протестировать такой небрежный обходной путь на большом количестве серверов сложно, и это может привести к массовому сбою сети, если что-то пойдет не так.
Поэтому я продолжил свое расследование и покопался в исходном коде ssh-keygen
. Я обнаружил, что невозможно ограничить поведение -А
переключение снаружи, например. через конфигурационные файлы. Он даже не выполняет предварительную проверку, авторизованы ключи или нет, он просто генерирует ключи в соответствии со списком алгоритмов из жестко запрограммированного массива. Единственный способ избежать этого — отредактировать, перекомпилировать и использовать собственный форк ssh-keygen
, но тогда мне придется иметь дело с этим после каждого обновления OpenSSH...
Я нашел частичное решение для других операционных систем, но не для OpenBSD.
Может ли кто-нибудь указать мне правильное решение? Почему мой sshd_config
и ssh_config
ключевые ограничения игнорируются и как получить ssh-кейген -A
перестать генерировать ключи с запрещенными алгоритмами?
Прежде чем кто-либо спросит: все остальные настройки используются в обоих файлах конфигурации OpenSSH, поэтому эти файлы конфигурации действительно загружаются.
Большое спасибо за все полезные ответы.