Обновление ssh и очередное отключение устаревших алгоритмов

Время идёт и постепенно старые алгоритмы шифрования становятся небезопасными. Разрабочики софта конечно же постепенно их отключают. Но для админа-то обычно это просиходит внезапно и ой как не вовремя и становится чертовски неприятным сюрпризом, особенно если обновления накатываются атоматически. Так обновление на Fedora 23 подарило мне пару незабываемых часов когда я не мог достучаться на большую часть серверов которыми управляю. Казалось бы что обновление openssl, openssh в любом виде должно стать красной тряпкой, но пока что стереотип поведения не сложился. И последнее обновление openssh.i686 7.2p1-2.fc23, openssh-server.i686 7.2p1-2.fc23, openssh-clients.i686 7.2p1-2.fc23 снова подарило неожиданный сюрприз в виде невозможности залогиниться на клиентский mikrotik.

[user001@localhost ~]$ ssh root@192.168.88.1
ssh_dispatch_run_fatal: Connection to 192.168.88.1 port 22: DH GEX group out of range

И как обычно бывает в свежих случаях гугл и яндекс не показали ничего интересного.
— Упс, сказал я и полез в мануал.

В мануале man ssh_config в секции KexAlgorithms приведены следующие умолчания:

KexAlgorithms
             Specifies the available KEX (Key Exchange) algorithms.  Multiple algorithms must be comma-separated.  Alternately if the specified value
             begins with a ‘+’ character, then the specified methods will be appended to the default set instead of replacing them.  The default is:

                   curve25519-sha256@libssh.org,
                   ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
                   diffie-hellman-group-exchange-sha256,
                   diffie-hellman-group-exchange-sha1,
                   diffie-hellman-group14-sha1

             The list of available key exchange algorithms may also be obtained using the -Q option of ssh(1) with an argument of “kex”.

Я решил что по сравнению с предыдущей версией был отключён какой-то алгоритм поэтому полез посмотреть что из полного списка отключено. ssh -Q kex показал список и я выделил те что включены по умолчанию.

* curve25519-sha256@libssh.org
  diffie-hellman-group1-sha1
* diffie-hellman-group14-sha1
* diffie-hellman-group-exchange-sha1
* diffie-hellman-group-exchange-sha256
* ecdh-sha2-nistp256
* ecdh-sha2-nistp384
* ecdh-sha2-nistp521
  gss-gex-sha1-
  gss-group14-sha1-
  gss-group1-sha1-

Теперь нужно включить отладку и найти какие Кекс алгоритмы предлагают клиент и сервер. Достаточно будет второго уровня отладки опция -vv

[user001@localhost ~]$ ssh -vv root@192.168.88.1 2>&1
debug2: local client KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,ext-info-c
debug2: host key algorithms: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa,ssh-dss
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com,zlib
debug2: compression stoc: none,zlib@openssh.com,zlib
debug2: languages ctos: 
debug2: languages stoc: 
debug2: first_kex_follows 0 
debug2: reserved 0 
debug2: peer server KEXINIT proposal
debug2: KEX algorithms: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: host key algorithms: ssh-dss
debug2: ciphers ctos: aes192-cbc,aes128-cbc,aes256-cbc,blowfish-cbc,3des-cbc
debug2: ciphers stoc: aes192-cbc,aes128-cbc,aes256-cbc,blowfish-cbc,3des-cbc
debug2: MACs ctos: hmac-sha1,hmac-md5
debug2: MACs stoc: hmac-sha1,hmac-md5
debug2: compression ctos: none
debug2: compression stoc: none
debug2: languages ctos: 
debug2: languages stoc: 
debug2: first_kex_follows 0 
debug2: reserved 0 
debug1: kex: algorithm: diffie-hellman-group-exchange-sha256
debug1: kex: host key algorithm: ssh-dss
debug1: kex: server->client cipher: aes128-cbc MAC: hmac-sha1 compression: none
debug1: kex: client->server cipher: aes128-cbc MAC: hmac-sha1 compression: none
debug1: kex: diffie-hellman-group-exchange-sha256 need=20 dh_need=20
debug1: kex: diffie-hellman-group-exchange-sha256 need=20 dh_need=20
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(2048<7680<8192) sent
debug1: got SSH2_MSG_KEX_DH_GEX_GROUP
ssh_dispatch_run_fatal: Connection to 192.168.88.1 port 22: DH GEX group out of range

Если сопоставить строки клиента и сервера то видно, что совпадают только 3 алгоритма и первым в порядке очерёдности идёт алгоритм diffie-hellman-group-exchange-sha256 именно его и клиент и серверо принимают и начинают обмен после чего происходит ошибка DH GEX group out of range. Так как следующий алгоритм автоматически не проверяется я подставлял их вручную и искал тот который сработает. Вторым стоит diffie-hellman-group-exchange-sha1 но с ним такая же проблема. Третьим стоит diffie-hellman-group14-sha1, и он стал спасением от даунгрейда ssh клиента. Я пока не понимаю баг это или фича поэтому буду держать этот вопрос на контроле.
Так как ключ найден то стоит привязать этот Кекс алгоритм к этому микротику. Для этого пропишем в конфиг ${HOME}/.ssh/config следующую секцию:

mcedit ~/.ssh/config
Host 192.168.88.1
        PubkeyAcceptedKeyTypes +ssh-dss
        HostKeyAlgorithms=+ssh-dss
        KexAlgorithms diffie-hellman-group14-sha1

После этого можно нормально подключиться к микротику по ssh, и побовать обновить его прошивку если прошивка для него существует. Лично я предпочитаю OpwnWRT, что и другим советую. Хотя на мой взгляд среди проприетарных прошивок mikrotik имеет лучшие даже если их сравнивать с Linksys. Чего никак не скажешь о всём остальном “домашне-офисном” сетевом оборудовании.

Конечно внимательный читатель заметил опцию ssh-dss которая добавляется (+) к существующим по умолчанию или добавленным в конфиге ранее. Эта опция появилась после обновления на Fedora 23 и была вызвана следующей ошибкой:

Unable to negotiate with 192.168.88.1 port 22: no matching host key type found. Their offer: ssh-dss

Обновляя ssh клиент имейте запасной старый, чтобы не попасть “под раздачу” когда в этот самый момент у клиента что-то упадёт и потребует оперативного вмешательства. Не менее важно ведение учёта всех хостов с которыми вы работаете и автоматизация тестирования стандартных процедур, например логина для ssh клиентов и серверов.

Опцию можно передать также и в командной строке.

ssh -oKexAlgorithms=diffie-hellman-group14-sha1 192.168.88.1