SSH или Secure Shell - очень распространенный способ безопасного доступа к удаленным машинам, обычно через командную строку. Он направлен на то, чтобы ваше соединение и, следовательно, все передаваемые данные были свободны от подслушивания. Из-за этого в популярные клиенты SSH, такие как OpenSSH , встроено немало проверок, которые гарантируют, что ваше соединение не будет скомпрометировано.
Примером одной из этих проверок является следующий, который определяет, когда был изменен отпечаток пальца сервера:
$ ssh [email protected]
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:hotsxb/qVi1/ycUU2wXF6mfGH++Yk7WYZv0r+tIhg4I.
Please contact your system administrator.
Add correct host key in /Users/scott/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/scott/.ssh/known_hosts:47
ECDSA host key for ec2-192-168-1-1.compute-1.amazonaws.com has changed and you have requested strict checking.
Host key verification failed.
Когда вы подключаетесь к серверу через SSH, он получает отпечаток ключа
ECDSA
, который затем сохраняет в вашем домашнем каталоге в
~/.ssh/known_hosts
. Это делается после первого подключения к серверу,
и вам будет предложено следующее сообщение:
$ ssh [email protected]
The authenticity of host 'ec2-192-168-1-1.compute-1.amazonaws.com (192.168.1.1)' can't be established.
ECDSA key fingerprint is SHA256:hotsxb/qVi1/ycUU2wXF6mfGH++Yk7WYZv0r+tIhg4I.
Are you sure you want to continue connecting (yes/no)?
Если вы введете «да», то отпечаток пальца будет сохранен в known_hosts
, который SSH затем проверяет каждый раз, когда вы подключаетесь к этому
серверу.
Но что произойдет, если ключ ECDSA сервера изменился с момента вашего последнего подключения к нему? Это настораживает, потому что на самом деле это может означать, что вы подключаетесь к другому серверу, не зная об этом. Если этот новый сервер является вредоносным, он сможет просматривать все данные, отправляемые в ваше соединение и из него, которые могут быть использованы любым, кто настраивал сервер. Это называется атакой «человек посередине» . Этот сценарий в точности соответствует сообщению «ПРЕДУПРЕЖДЕНИЕ: ИДЕНТИФИКАЦИЯ УДАЛЕННОГО ХОЗЯКА ИЗМЕНИЛАСЬ!» сообщение пытается вас предупредить.
Конечно, это не всегда так, и есть много причин для изменения отпечатка ключа ECDSA для сервера. В моем случае у меня был эластичный IP-адрес на AWS, и я назначил его другому серверу после повторного развертывания нашего приложения. IP-адрес и имя хоста, к которым я подключался, были одинаковыми, но базовый сервер был другим, что и заставило SSH-клиент выдать это предупреждение.
Устранение проблемы
Если вы на 100% уверены, что это ожидаемое поведение и что нет потенциальной проблемы с безопасностью, вам необходимо исправить проблему, прежде чем продолжить.
Я нашел два самых простых способа решить эту проблему.
Разрешить вручную через known_hosts
- В предупреждающем сообщении найдите строку, которая сообщает вам,
где находится проблемный ключ ECDSA в файле
known_hosts
В моем примере в этой строке говорилось «Нарушение ключа ECDSA в /Users/scott/.ssh/known_hosts:47», что относится к строке 47. - Откройте
known_hosts
указанный в предупреждающем сообщении. - Удалить строку, указанную в предупреждающем сообщении
Удалив эту строку, у вашего SSH-клиента не будет отпечатка ключа ECDSA
для сравнения, и он снова попросит вас проверить подлинность сервера при
следующем подключении. После этого у вас будет новый отпечаток в нашем
known_hosts
для этого сервера, и предупреждение исчезнет.
Разрешить с помощью ssh-keygen
Другое решение - использовать утилиту
ssh-keygen known_hosts
ключа из вашего файла known_hosts, что можно сделать с помощью следующей
команды:
$ ssh-keygen -R [hostname-or-IP]
Итак, в моем примере я бы использовал это так:
$ ssh-keygen -R ec2-192-168-1-1.compute-1.amazonaws.com
Этот метод хорош, если вы не хотите вручную изменять known_hosts
, а
утилиту проще использовать, если вам нужно исправить несколько имен
хостов и IP-адресов. Он также может обрабатывать хешированные
known_hosts.old
хостов в файле known_hosts.old.