Вопрос или проблема
За последние несколько недель я создал несколько виртуальных машин. Проблема в том, что .ssh/known_hosts
выдает мне предупреждение Человек посередине. Это происходит потому, что для IP виртуальной машины связаны другие отпечатки.
Однако в файле .ssh/known_hosts
я не нахожу записи, относящейся к IP, только две странные строки, похожие на ключи, и “ssh-rsa”.
У кого-нибудь есть идеи о том, как удалить старый ключ из known_hosts
?
sed -i '6d' ~/.ssh/known_hosts
Это изменит файл ~/.ssh/known_hosts:6, удалив 6-ю строку.
На мой взгляд, использование ssh-keygen -R
является более хорошим решением для опытного пользователя openssh, в то время как ваш обычный администратор Linux лучше сохранит свои навыки в sed, используя указанный выше метод.
Есть ключ ssh-keygen (-R
) для этого. Используйте так:
$ ssh-keygen -R example.com
# Хост example.com найден: строка 109
/home/username/.ssh/known_hosts обновлен.
Исходное содержимое сохранено как /home/username/.ssh/known_hosts.old
man ssh-keygen
читает:
-R
hostnameУдаляет все ключи, принадлежащие
hostname
, из файлаknown_hosts
. Эта опция полезна для удаления хэшированных хостов (см. опцию-H
выше).
Самое простое решение:
rm -f .ssh/known_hosts
ssh снова создаст файл, но вы потеряете проверку ключей для других хостов!
Или вы можете использовать:
ssh-keygen -R "hostname"
Или сообщение ssh “человек посередине” должно указать, какая строка файла known_hosts содержит проблемный отпечаток. Отредактируйте файл, перейдите к этой строке и удалите ее.
Вам нужно выполнить следующую команду, чтобы избавиться от этой проблемы. Откройте терминал и введите следующую команду:
Для всех примеров ниже просто замените значение после -R
:
ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com
Все ответы хороши, но для настоящего профессионала SSH у нас отсутствует информация о том, как удалить подпись ssh с (нестандартным) номером порта.
-
Простая команда для удаления подписи SSH хоста:
ssh-keygen -R example.com
-
Сложная команда для удаления ключа ssh, например, если вы подключаетесь к ssh на нестандартном порту 222:
ssh example.com -p 222
и вы получите предупреждение, и чтобы удалить это, вам нужно использовать квадратные скобки и двоеточие с номером порта:
ssh-keygen -R [example.com]:222
Обратите внимание, что, вероятно, будет запись IP для того же хоста, так что вам также нужно будет удалить ее.
Надеюсь, это поможет пользователям с нестандартной конфигурацией.
Предупреждение укажет вам точную строку в файле известных хостов.
Вот пример:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ ПРЕДУПРЕЖДЕНИЕ: ВОЗМОЖНАЯ ПОДМЕНА DNS! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
RSA-ключ хоста для foo-bar.net изменился,
а ключ для соответствующего IP-адреса 127.0.0.1
остался прежним. Это может означать, что
происходит ПОДМЕНА DNS или IP-адрес хоста
и его ключ хоста изменились одновременно.
Проблемный ключ для IP в /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ ПРЕДУПРЕЖДЕНИЕ: ИДЕНТИФИКАЦИЯ УДАЛЕННОГО ХОСТА ИЗМЕНИЛАСЬ! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ВОЗМОЖНО, ЧТО КТО-ТО ДЕЛАЕТ ЧТО-ТО НЕКОРРЕКТНО!
Видите ли вы часть /home/user/.ssh/known_hosts:6
? Она указывает файл и номер строки.
Вы также можете указать ssh не проверять файл known_hosts, используя флаги UserKnownHostsFile и StrictHostKeyChecking.
Например:
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]
Для удобства вы можете создать псевдоним для этого:
alias boldssh="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
Теперь вы можете просто использовать boldssh всякий раз, когда вы уверены в доверии к сертификату сервера.
Вот метод, использующий редактор Ex:
ex +6d -scwq ~/.ssh/known_hosts
где 6 – это ваш номер строки, упомянутый в предупреждающем сообщении. Например:
Проблемный ключ для IP в /home/user/.ssh/known_hosts:6 <== НОМЕР СТРОКИ
В общем, рекомендуется использовать ex
для редактирования файлов неинтерактивно, вместо sed
, который больше подходит для Stream EDitor и его параметра -i
, который является нестандартным расширением FreeBSD.
Запись для имени хоста или IP должна находиться в первом столбце. Предупреждение также должно указывать номер строки, где находится проблемный ключ.
Вы также можете удалить одну строку из известных хостов, например, с помощью rmknownhost 111 (111 – это номер строки для удаления):
#! /usr/bin/env ruby
line = ARGV[0] || raise("укажите строку для удаления")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Удалено:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}
Сохраните это как rmknownhost
в папке из вашего PATH
.
Это текстовый файл. Вы можете легко отредактировать его с помощью vi(m) и просто удалить проблемную строку (dd), сохранив файл (wq). Но если существует конкретная команда для удаления хоста, это, вероятно, самый безопасный метод.
Ответ или решение
Удаление ключа из known_hosts: Полное руководство для IT-специалистов
Работа с виртуальными машинами может привести к подмене ключей SSH и, как следствие, к предупреждениям о возможной атаке «человек посередине» (Man-in-the-Middle). Это часто происходит, когда виртуальные машины переиспользуют IP-адреса и ключи SSH, которые уже были зарегистрированы в вашем файле .ssh/known_hosts
. В этом руководстве мы подробно рассмотрим, как правильно удалить старый ключ, чтобы избежать таких предупреждений.
Структура файла known_hosts
Файл .ssh/known_hosts
представляет собой текстовый документ, в который SSH-клиент записывает ключи, соответствующие удалённым хостам. В каждом ряду находится публичный ключ хоста, а также информация о его имени или IP-адресе. Если вы видите предупреждение о смене ключа, это может означать, что изменился ключ на стороне сервера или вы подключаетесь к другому серверу, который использует тот же IP.
Способы удаления ключа
-
Использование команды ssh-keygen
Самый простой и безопасный способ удалить ключ из файла
known_hosts
– воспользоваться встроенной командойssh-keygen
:ssh-keygen -R имя_хоста
Например, чтобы удалить ключ для
example.com
, выполните:ssh-keygen -R example.com
Если вы используете IP-адрес, команда будет выглядеть следующим образом:
ssh-keygen -R 192.168.1.1
Этот метод автоматически обновит файл
known_hosts
, сохранив оригинальное содержимое в.known_hosts.old
. -
Редактирование файла вручную
Если вы знаете номер строки, где хранится проблемный ключ, его можно удалить вручную. Предупреждение, возникающее при подключении, обычно указывает на строку, содержащую ошибочный ключ, например:
Offending key for IP in /home/user/.ssh/known_hosts:6
В данном случае следует открыть файл в текстовом редакторе (например,
vim
илиnano
) и удалить соответствующую строку.Для быстрого удаления определённой строки из терминала можно использовать команду
sed
:sed -i '6d' ~/.ssh/known_hosts
-
Удаление всех ключей с хоста
Если вы хотите удалить все записи, связанные с хостом, можно удалить сам файл
known_hosts
, хотя это и не рекомендуется, так как приведёт к потере других ключей. В таком случае используйте:rm -f ~/.ssh/known_hosts
После этого файл будет создан заново при следующем подключении к хосту.
-
Сложные случаи: нестандартные порты
Если вы подключаетесь к хосту на нестандартном порту, добавьте номер порта в квадратные скобки:
ssh-keygen -R [example.com]:222
-
Использование Ex редактора
Кроме того, можно использовать
ex
, чтобы редактировать файл без необходимости в текстовом редакторе:ex +6d -scwq ~/.ssh/known_hosts
Здесь
6
– это номер строки, которую нужно удалить.
Заключение
Правильное управление файлами known_hosts
— это важный аспект обеспечения безопасности в SSH-соединениях. Понимание различных методов удаления ключей позволит вам избежать уведомлений о возможных атаках и поддерживать чистоту в файлах конфигурации SSH. Используйте описанные выше методы для удаления старых записей, и уверенно работайте с вашими виртуальными машинами и удалёнными серверами.