Время идёт и постепенно старые алгоритмы шифрования становятся небезопасными. Разрабочики софта конечно же постепенно их отключают. Но для админа-то обычно это просиходит внезапно и ой как не вовремя и становится чертовски неприятным сюрпризом, особенно если обновления накатываются атоматически. Так обновление на 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