Видаліть ключ із відомих_хостів


129

Я побудував кілька віртуальних машин протягом останніх тижнів. Проблема в тому, що .ssh/known_hostsдає мені Людина в середньому попередженні. Це відбувається тому, що інший відбиток пальця пов'язаний з IP-адресою віртуальної машини.

Однак у .ssh/known_hostsфайлі я не знаходжу запису, пов’язаного з IP-адресою, лише дві химерні, ключові рядки та "ssh-rsa".

Хтось має ідеї, як видалити старий ключ з known_hosts?


7
"Дивні, схожі на ключ рядки", на які ви посилаєтесь, - це хешовані адреси хостів / ip. Ця функція безпеки, яка допомагає зупиняти зловмисника, дізнатися, до яких систем у вас є доступ. Якщо ви бачите це, то ваша ssh_config HashKnownHosts yesвстановлена.
Дібстер

1
Якщо ви вважаєте, що вміст файлу занадто заплутаний, напевно, активовано обгортання рядків. Відключіть його. Усі рядки починаються з імені хоста або IP-адреси.
Даніель Б

Відповіді:


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

Змінюватиме файл ~ / .ssh / known_hosts: 6, видаляючи 6-й рядок.

На мій погляд, використання ssh-keygen -Rє кращим рішенням для користувача, що працює на енергозбереженні, тоді як ваш звичайний адміністратор Linux буде краще зберігати свої навички sed, використовуючи вищевказаний метод.


18
Я не думаю, що це корисна порада редагувати файл конфігурації вручну, якщо у вас є офіційна програма для цього. Ризикування не робить вас професіоналом, знаходячи найшвидший і безпечний варіант. Це як сказати людям йти і редагувати /etc/sudoersбез них visudo. Якщо ви хочете відточити свої sedнавички, продовжуйте це робити, не псуючи свою систему.
kraxor

2
"якщо у вас є офіційний додаток для цього" => і обидва, ssh-keygen -Rі sed -i {line}dвони досить "офіційні", і обидва будуть працювати в осяжному майбутньому. Util ssh-keygen дозволяє видаляти за номером рядка, обидва цілком прийнятні (адже з номерами рядків часто легше впоратися і менше схильні до помилок, ніж мати справу з сучасними іменами хостів центру обробки даних).
Майкл

2
A) Видалення конкретно шостого рядка - це все дуже "не дивись руки". Жодного пояснення щодо того, що є важливим для 6-го рядка файлу ?! B) Також man ssh-keygenзгадується, що ssh-keygen -R hostname ви щойно сказали ssh-keygen -Rбез вказаного імені хоста, і ви не пояснили, що ви маєте на увазі під цим.
барлоп

123

Найпростіше рішення:

rm -f .ssh/known_hosts

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

Або ви можете використовувати:

ssh-keygen -R "hostname"

Або ssh "man-in-the mid" повідомлення повинно вказувати, у якому рядку файла відомого_hosts є відбиток відбитка. Відредагуйте файл, перейдіть до цього рядка та видаліть його.


55
ssh-keygen -R hostnameтакож буде працювати.
grawity

6
Якщо ми видалимо цей файл, видалять і інші ключі.
shgnInc

16
Видалення файлу - погана порада, це як сказати комусь купити новий ПК, оскільки в старому є зламана миша. Вручну редагувати файл, який можна редагувати офіційною програмою, також є поганою ідеєю. ssh-keygenОпція була додана з - за коментарем, але без будь - яких пояснень. Я не думаю, що ця відповідь заслуговує на стільки відгуків.
kraxor

12
-1 через перші рядки "видалити весь відомий файл_гостів". Це жахлива, страшна, жахлива річ, яку можна запропонувати, і її слід редагувати.
Олів’є Дулак

4
Це рішення є надмірним. Просто видаліть правопорушну лінію. Це воно.
Блейк Фредерік

78

Для цього існує ssh-keygen switch ( -R).

man ssh-keygen читає:

-R ім'я хоста

Видаляє всі ключі , що належать hostnameз known_hostsфайлу. Цей параметр корисний для видалення хешованих хостів (див. -HВаріант вище).


8
Це найпростіший і безпечний метод.
курка

Примітка. Це дозволить змінити дозволи дозволеного файлу known_hosts на 0600. Якщо у вас є спільний файл known_hosts з будь-якої причини, це може вимкнути спільний доступ до нього.
Jiri Klouda

і правильний. Крім того, мені довелося це зробити [localhost]:port, скориставшись дужками, тому що я використовував користувацький порт, я думаю = /. Як уже говорили інші, я також застосував би підхід для перевірки ключів SSH для моєї розробки тимчасових / тестових систем.
Pysis

18

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

Ось приклад:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       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частину? Він визначає номер файла та рядок.


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 не перевіряти файл відомих_хостів за допомогою прапорів UserKknownHostsFile та StrictHostKeyChecking.

Наприклад:

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

Для зручності використання ви можете псевдонімом цього:

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

Тепер ви можете просто сміливо, коли ви впевнені, що довіряєте сертифікату сервера.


8
Яка жахлива ідея. Постійно відключати шар безпеки лише тому, що ти лінивий постійно ~/.ssh/known_hostsоновлювати? Чому б просто не йти вперед і використовувати telnet? "всякий раз, коли ви впевнені" - якщо ви коли-небудь впевнені, то ви не маєте поняття, що таке атака MITM, і вам, мабуть, слід витратити деякий час, читаючи хорошу літературу.
kraxor

2
Виходячи з питання ОП, я думаю, що це правильна відповідь. Іноді у вас є тестова система, за допомогою якої ви створюєте / знищуєте багато віртуальних машин. (Я роблю це прямо зараз, коли готуюсь до іспиту RHCE.) Можливо, не буде жодних наслідків для безпеки. Зауважуючи, що наслідки для безпеки є великими, я не думаю, що це має бути позначено "жахливою ідеєю".
Rick Chatham

пов’язано: superuser.com/a/1126243/73961
michael

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 it tream ED itor та його -iпараметр, який є нестандартним розширенням FreeBSD.


0

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


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.


Яка користь від цього в тому, щоб зробити це в будь-якому текстовому редакторі? Чи є якась причина, щоб не зробити це так, як, наприклад, як судори повинні редагуватися візуально?
Енді Лестер

Які дистрибуції приходять із цим? У Ubuntu, схоже, його немає.
мерехтіння

Перевага полягає в тому, що це автоматизовано та швидко / це окремий двійковий код, який ви додаєте самі
grosser

2
Ви могли щойно опублікувати свій скрипт тут, замість того, щоб посилатись на свій власний запис у блозі, який ви створили в день опублікування цієї відповіді. Це кваліфікується як спам IMHO. Не кажучи вже про те, що ви могли створити простий псевдонім, щоб досягти того ж результату, не потрібно 7-рядкового сценарію в рубіні.
kraxor

1
або просто додайте це до свого ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }і зателефонуйте за допомогою sshdel [line number]. ні рубіну, ні двійкових, ні турбот.
rubynorails

0

Це текстовий файл. Ви можете легко редагувати за допомогою vi (m) та просто видалити відповідний рядок (dd) та зберегти файл (wq). Але якщо є певна команда для видалення хоста, це, мабуть, найбезпечніший метод.


Я не бачу, як редагування файлу безпосередньо у VIM є "небезпечним". Це базується на вашому рівні комфорту з VIM. Особливо з цим файлом найбільшим ризиком є ​​видалення занадто великої кількості ключів, і в цьому випадку вам знову буде запропоновано.
Rick Chatham

"Безпека", про яку я мав на увазі, передбачає: 1) забути / не знати, як видалити залежну інформацію з інших файлів (якщо така є) та 2) Випадково видалити більше або менше, ніж потрібно, тим самим порушивши файл.
Райан Гріггс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.