
Я пытаюсь добиться следующего на своих серверах OpenBSD 6.9:
- Запрет на использование всех ключей, кроме
ssh-ed25519
одного на обоихСЕРВЕРиКЛИЕНТстороны. - Ограничение
ssh-keygen -A
генерации ключей только авторизованнымssh-ed25519
алгоритмом и ничем другим.
Чтобы добиться этого, я добавил в свой sshd_config
:
HostKey /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 restart sshd
sshd(ok)
sshd(ok)
Проверив, используются ли мои настройки, выполнив следующие команды:
# ssh -Q HostbasedAcceptedAlgorithms
# ssh -Q HostKeyAlgorithms
# 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]
Другими словами, ключевые ограничения игнорируются.
На всякий случай я даже перезапустил сервер, но разницы никакой.
Потенциальным решением является удаление всех файлов ключей, кроме авторизованного. Однако в скрипте init /etc/rc
есть строка, ssh-keygen -A
которая восстанавливает все отсутствующие ключи ssh после каждой перезагрузки системы, до того, как запустится демон sshd,в том числе и запрещенных алгоритмов!
Таким образом, удаление ключей не решает проблему.
В качестве дополнительного обходного пути я мог бы удалить ssh-keygen -A
строку из сценария инициализации или заменить ее своим собственным алгоритмом генерации ключей, но это приведет к тому, с чего все началось: к необходимости решать эту проблему снова и снова, например, после каждого обновления системы, когда команда OpenBSD выпускает новую версию /etc/rc
. Автоматизировать удаление этой строки и протестировать такой неаккуратный обходной путь на большом количестве серверов сложно, и это может привести к массовому сбою сети, если что-то пойдет не так.
Поэтому я продолжил свое расследование и углубился в исходный код ssh-keygen
. Я обнаружил, что невозможно ограничить поведение коммутатора -A
извне, например, через файлы конфигурации. Он даже не выполняет предварительную проверку того, авторизованы ли ключи или нет, он просто генерирует ключи в соответствии со списком алгоритмов из жестко закодированного массива. Единственный способ избежать этого — редактировать, перекомпилировать и использовать пользовательский форк ssh-keygen
, но тогда мне придется иметь с этим дело после каждого обновления OpenSSH...
Я нашел частичное решение для других операционных систем, но не для OpenBSD.
Может ли кто-нибудь указать мне правильное решение? Почему мои sshd_config
и ssh_config
ключевые ограничения игнорируются и как остановить ssh-keygen -A
генерацию ключей с запрещенными алгоритмами?
Прежде чем кто-то спросит: все остальные настройки используются OpenSSH в обоих файлах конфигурации, поэтому эти файлы конфигурации действительно загружаются.
Большое спасибо за все полезные ответы.