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