Удалить ключ из известных_хостов

129

Я построил несколько виртуальных машин за последние несколько недель. Проблема в том, что предупреждает .ssh/known_hostsменя Человек в среднем . Это происходит потому, что с IP-адресом виртуальной машины связан другой отпечаток.

В этом .ssh/known_hostsфайле, однако, я не нахожу записи, относящиеся к IP, только две странные, подобные ключу строки и "ssh-rsa".

У кого-нибудь есть идеи о том, как удалить старый ключ known_hosts?

Адам Матан
источник
7
«Странные, похожие на ключи строки», на которые вы ссылаетесь, являются хешированными адресами хостов / ip. Эта функция безопасности помогает злоумышленнику узнать, к каким системам у вас есть доступ. Если вы видите это, значит, ваш ssh_config HashKnownHosts yesустановлен.
Дибстер
1
Если вы считаете, что содержимое файла слишком запутанное, возможно, активирована перенос строки. Деактивировать это. Все строки начинаются с имени хоста или IP-адреса.
Даниэль Б

Ответы:

90
sed -i '6d' ~/.ssh/known_hosts

Изменит файл ~ / .ssh / known_hosts: 6, удалив 6-ю строку.

На мой взгляд, использование ssh-keygen -R- лучшее решение для опытных пользователей openssh, в то время как ваш обычный администратор Linux будет лучше поддерживать свои навыки sed, используя вышеописанный метод.

mikewaters
источник
18
Я не думаю, что это хороший совет, чтобы редактировать файл конфигурации вручную, если у вас есть официальное приложение для этого. Риски не делают вас профессионалом, а находят самый быстрый и безопасный вариант. Это все равно что говорить людям идти дальше и редактировать /etc/sudoersбез них visudo. Если вы хотите оттачивать свои sedнавыки, продолжайте и делайте это, не портя свою систему.
kraxor
2
«если у вас есть официальная заявка на это» => оба ssh-keygen -Rи sed -i {line}dдовольно «официальные», и оба будут работать в обозримом будущем. Util ssh-keygen позволяет удалять по номеру строки, оба являются вполне приемлемыми (потому что с номерами строк часто легче работать и они менее подвержены ошибкам, чем при работе с именами хостов современных центров обработки данных).
Майкл
2
А) Исключение конкретно 6-й строки, все очень "смотри без рук". Никаких объяснений относительно того, что важно в 6-й строке файла ?! Б) Также man ssh-keygenупоминается, что ssh-keygen -R hostname вы только что сказали, ssh-keygen -Rбез указания имени хоста, и вы не объяснили, что вы подразумеваете под этим.
barlop
124

Самое простое решение:

rm -f .ssh/known_hosts

ssh снова создаст файл, но вы потеряете проверку ключей для других хостов!

Или вы можете использовать:

ssh-keygen -R "hostname"

Или в сообщении ssh "man-in-the-middle" должно быть указано, какая строка файла known_hosts имеет отпечаток пальца. Отредактируйте файл, перейдите к этой строке и удалите его.

Шон Стаатс
источник
55
ssh-keygen -R hostnameтоже будет работать
Гравитация
6
Если мы удалим этот файл, другие ключи тоже будут удалены.
ShgnInc
16
Удаление файла - плохой совет, это все равно, что сказать кому-то купить новый компьютер, потому что у старого сломана мышь. Ручное редактирование файла, который может быть отредактирован официальным приложением, также является плохой идеей. ssh-keygenОпция была добавлена из - за комментарием, но без каких - либо объяснений. Я не думаю, что этот ответ заслуживает так много голосов.
kraxor
12
-1 из-за целых первых строк «удалить весь файл known_hosts». Это ужасная, ужасная, ужасная вещь, которую нужно предложить, и она должна быть отредактирована.
Оливье Дюлак
4
Это решение является излишним. Просто удалите оскорбительную строку. Вот и все.
Блейк Фредерик
81

Для этого есть переключатель ssh-keygen ( -R).

man ssh-keygen гласит:

-R имя хоста

Удаляет все ключи, принадлежащие hostnameиз known_hostsфайла. Эта опция полезна для удаления хэшированных хостов (см. -HОпцию выше).

user201564
источник
8
Это самый простой и безопасный метод.
курица
Примечание. Это изменит разрешения для файла known_hosts на 0600. Если по какой-либо причине у вас есть общий файл known_hosts, это может отключить его общий доступ.
Иржи Клауда
и правильный. Кроме того, я должен был сделать [localhost]:port, используя скобки, потому что я использовал собственный порт, я думаю = /. Как уже говорили другие, я бы также использовал подход без проверки ключей SSH для разработки моей переходной / тестовой системы.
Пизис
Это удаляет все случаи, так что лучший способ. Вы можете добавить новый ключ с:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux
18

В предупреждении будет указана точная строка в известном файле hosts.

Вот пример:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Видишь /home/user/.ssh/known_hosts:6часть? Он определяет файл и номер строки.

InnaM
источник
10

Вам нужно выполнить следующую команду, чтобы избавиться от этой проблемы. Откройте терминал и введите следующую команду:

Для всех приведенных ниже примеров просто замените значение после -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-keygen -Rчем любой другой ответ до сих пор. Это показывает на примере именно то, что вы можете написать после -R. Так что этот ответ стоит того, хотя он и не совсем новый.
Иц
@Yitz Мой комментарий был сделан как часть обзора. В то время (18 месяцев назад) я думал, что вопрос нуждается в небольшой помощи, чтобы сделать его еще лучше.
Бурги
8

Вы также можете указать ssh не проверять файл known_hosts, используя флаги UserKnownHostsFile и StrictHostKeyChecking.

Например:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

Для простоты использования вы можете использовать псевдоним:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Теперь вы можете просто boldssh, когда вы уверены, что доверяете сертификату сервера.

рубль
источник
8
Какая ужасная идея. Навсегда отключить уровень безопасности только потому, что вы слишком ленивы, чтобы поддерживать свою ~/.ssh/known_hostsактуальность? Почему бы просто не пойти дальше и использовать telnet? «всякий раз, когда вы уверены» - если вы когда-либо в этом уверены, тогда вы понятия не имеете, что такое атака MITM, и вам, вероятно, следует потратить некоторое время на чтение хорошей литературы.
kraxor
2
Исходя из вопроса ОП, я думаю, что это правильный ответ. Иногда у вас есть тестовая система, на которой вы создаете / уничтожаете множество виртуальных машин. (Я делаю это прямо сейчас, когда я готовлюсь к экзамену RHCE.) Может не быть никаких последствий для безопасности. Отмечая, что последствия для безопасности велики, я не думаю, что это должно быть названо «ужасной идеей».
Рик Чатем
относящиеся: superuser.com/a/1126243/73961
майкл
3

Все ответы хороши, но для реального SSH pro у нас отсутствует информация о том, как удалить ssh-подпись с номером порта.

  • Простая команда удаления подписи хоста SSH:

    ssh-keygen -R example.com
    
  • Сложный ключ ssh удаляется, например, вы подключаетесь к ssh через нестандартный порт 222:

    ssh example.com -p 222
    

и вы получите предупреждение, и чтобы удалить это, вам нужно использовать квадратные скобки номер порта двоеточия:

    ssh-keygen -R [example.com]:222

Надеюсь, это поможет пользователям нестандартной конфигурации.

Арунас Бартисиус
источник
Именно то, что я искал. Спасибо!
aexl
1

Вот метод, использующий редактор Ex:

ex +6d -scwq ~/.ssh/known_hosts

где 6-й номер вашей линии, указанный в предупреждающем сообщении. Такие как этот:

Оскорбляющий ключ для IP в /home/user/.ssh/known_hosts:6 <== НОМЕР ЛИНИИ


В общем, рекомендуется использоватьex для редактирования файлов неинтерактивно , а не то sed, что больше S- tream ED itor и его -iпараметр, который является нестандартным расширением FreeBSD.

kenorb
источник
0

Запись для имени хоста или ip должна быть в первом столбце. В предупреждении также должен быть указан номер строки, в которой находится нарушающий ключ.

stimms
источник
0

Вы также можете удалить одну строку из известных хостов с помощью, например, rmknownhost 111 (111 - строка для удаления):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

Сохраните это как rmknownhostв папке из вашего PATH.

грубее
источник
Какая польза от этого в любом текстовом редакторе? Есть ли какая-то причина не делать это таким образом, например, как редактировать sudoers с помощью visudo?
Энди Лестер
Какие дистрибутивы идут с этим? У Ubuntu, похоже, нет этого.
мерцание
Преимущество в том, что это автоматизировано и быстро / это отдельный двоичный файл, который вы добавляете сами
grosser
2
Вы могли бы просто опубликовать свой сценарий здесь вместо того, чтобы связать свою собственную запись в блоге, которую вы создали в день публикации этого ответа. Это квалифицируется как спам ИМХО. Не говоря уже о том, что вы можете создать простой псевдоним для достижения того же результата, нет необходимости в сценарии ruby ​​длиной 7 строк.
kraxor
1
или просто добавьте это в ваш ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }и вызовите его с помощью sshdel [line number]. нет рубина, нет двоичного кода, нет проблем.
Rubynorails
0

Это текстовый файл. Вы можете легко редактировать с помощью vi (m) и просто удалить нужную строку (dd) и сохранить файл (wq). Но если есть конкретная команда для удаления хоста, это, вероятно, самый безопасный метод.

Райан Григгс
источник
Я не вижу, как редактировать файл непосредственно в VIM "небезопасно". Он основан на вашем уровне комфорта с VIM. Особенно с этим файлом вы рискуете удалить слишком много ключей, и в этом случае вы просто получите запрос снова.
Рик Чатем
«Безопасность», о которой я говорил, включает в себя: 1) забыть / не знать, чтобы удалить зависимую информацию в других файлах (если таковые имеются) и 2) случайно удалить больше или меньше, чем необходимо, тем самым сломав файл.
Райан Григгс