===== Отключаем небезопасные алгоритмы 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
{{tag>Putty SSH Ubuntu Linux Certificates}}