This is an old revision of the document!
Отключаем небезопасные алгоритмы SSH
Представим, что у нас есть задача избавиться от каких-либо небезопасных алгоритмов SSH. К примеру, от всех ECDSA, включая ecdsa-sha2-nistp256, а также MACs: md5-based, sha1-based, umac-64 и KEX основанных на SHA1 + шифров ecdh-sha2-nistp-*.
В первую очередь мы можем просканировать протокол при помощи NMAP, чтобы понять какие шифры вообще доступны (см. соответствующий раздел материала по NMAP).
Также, можно вывести шифры, алгоритмы обмена ключами, алгоритмы MAC (Message Authentication Code), а также алгоритмы публичных ключей следующими командами:
ssh -Q cipher ssh -Q mac ssh -Q kex ssh -Q key
ВАЖНО: данные команды выводят списки алгоритмов, доступные в определенной версии SSH-сервера по умолчанию. Чтобы просматривать используемые алгоритмы в реальности - можно запускать следующую команду, грепая нужные данные, пример:
sshd -T | egrep '^macs' sshd -T | egrep '^kex'
Если шифры доступны - время перейти к конфигу SSH.
Узнаем для начала версию сервера SSH:
ssh -V
Отключаем ecdsa-sha2-nistp256
Если сервер старше 8.5, чтобы исключить ecdsa-sha2-nistp256 добавим в конфиг следующие директивы:
HostKeyAlgorithms -ecdsa-sha2-nistp256 PubkeyAcceptedAlgorithms -ecdsa-sha2-nistp256
В OpenSSH младше версии 8.5 директива PubkeyAcceptedAlgorithms имеет другое название (настройка и эффект ничем не отличается).
PubkeyAcceptedKeyTypes -ecdsa-sha2-nistp256
Если мы хотим полностью избавиться от ECDSA - удаляем или перемещаем сами ключи.
/etc/sshssh_host_ecdsa_key /etc/ssh_host_ecdsa_key.pub
Отключаем MACs: md5-based, sha1-based, umac-64
Добавляем в тот же sshd_config следующее:
MACs -*md5*,*sha1,*sha1-*,*-64,*-96,umac-64@openssh.com,umac-64-etm@openssh.com
Отключаем ненужные KEX
KexAlgorithms -diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp521,ecdh-sha2-nistp384
Завершаем настройку
Перед перезапуском sshd хорошо бы протестировать конфигурацию - проверить не только синтаксис, но и на всякий случай убедиться в том, что наш сервер поддерживает необходимые директивы. Это сделать просто:
sshd -t
Перезапустим ssh-сервер, если всё ОК:
systemctl restart ssh
Тестируем отключение
Пример тестирования с отключенным алгоритмом Public Key:
ssh -oHostKeyAlgorithms=ecdsa-sha2-nistp256 -oPubkeyAcceptedAlgorithms=ecdsa-sha2-nistp256 root@localhost -vv
Если алгоритм отключен, подключение не установится, получим что-нибудь похожее на:
Unable to negotiate with 127.0.0.1 port 22: no matching host key type found. Their offer: rsa-sha2-512,rsa-sha2-256,ssh-ed25519
Можно протестировать подключение с использованием конкретного MAC и посмотреть - не согласовывают ли сервер и клиент отключенный ранее алгоритм.
Здесь подключение всё равно может установиться, несмотря на опцию. Важно убедиться в том, что отключенный в реальности MAC не согласовывается и не используется.
ssh -o MACs=umac-64-etm@openssh.com root@192.168.0.1 -vv
Ищем похожие строки в выводе:
debug1: kex: algorithm: ... debug1: kex: host key algorithm: ... debug1: kex: server->client mac: ... debug1: kex: client->server mac: ...
Данным сканированием NMAP мы также можем проверить протоколы и шифры:
nmap -p22 -n -sV --unprivileged --script ssh2-enum-algos 192.168.0.1