Teh Hermit

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 добавим в конфиг sshd_config следующие директивы:

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
отключаем_небезопасные_алгоритмы_ssh.1759310716.txt.gz · Last modified: by jp