Як відредагувати відомі_хости, коли кілька хостів мають однакове ім’я IP та DNS?


29

Я регулярно ssh в комп'ютер, який є комп'ютером з подвійним завантаженням OS X / Linux. Два екземпляри ОС не мають одного і того ж хостового ключа, тому їх можна розглядати як два хости, що мають однаковий IP та DNS. Скажімо, IP є 192.168.0.9, а назви є hostnameіhostname.domainname

Наскільки я зрозумів, рішення мати можливість з'єднатися з двома хостами - це додати їх обох до ~/.ssh/know_hostsфайлу. Однак, це легше сказати , ніж зробити, тому що файл хешіруется, і, ймовірно , кілька входів на хост ( 192.168.0.9, hostname, hostname.domainname). Як наслідок, у мене є таке попередження

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

Чи є простий спосіб редагувати known_hostsфайл, зберігаючи хеші. Наприклад, як я можу знайти рядки, що відповідають заданому хостаму? Як я можу генерувати хеші для деяких відомих хостів?

Ідеальне рішення дозволило б мені безперешкодно підключитися до цього комп’ютера за допомогою ssh, незалежно від того, я його називаю 192.168.0.9, hostnameабо hostname.domainname, якщо він не використовує свою хост-Linux або OSX хост-ключ. Однак я все ж хочу отримати попередження, якщо є справжня атака "посеред", тобто якщо використовується інший ключ, ніж ці два.


Що ти хочеш зробити? Відредагувати це для чого?
Рюк

@Rhyuk: Відредагуйте його, щоб він міг визнати дійсним і OSX, і ключ хоста Linux для IP-адреси, імені хоста та імені хоста.Домен.
Frédéric Grosshans

@Rhyuk: Я відредагував це питання. Чи зрозуміліше зараз?
Frédéric Grosshans

2
Ви просто думали зробити так, щоб обидві установки мали один ключ?
Zoredache

3
Є кілька випадків, коли доцільно використовувати одну IP-адресу для доступу до декількох об'єктів (кожен з окремими хост-ключами SSH) і все ще підтримує суворий контроль, що ТІЛЬКИ ці хост-ключі - це ті, які бачив клієнт SSH. Наприклад, кілька налаштувань високої доступності, коли доступ до кластеру одиниць здійснюється за допомогою однієї спільної IP-адреси, але де (чомусь) ключ хоста SSH, який бачать клієнти, змінюється залежно від того, який кластерний блок зараз є активним. Інший випадок, коли декілька хостів SSH стоять за NATed брандмауером та отримують доступ ззовні, вони, схоже, мають однаковий IP.
IllvilJa

Відповіді:


12

Найпростішим рішенням тут є просто використання однакових ключів хоста для Linux і OS X. Тобто, виберіть один набір /etc/ssh/ssh_host_*_key*файлів і скопіюйте їх в іншу ОС. Тоді той самий хост-ключ буде представлений клієнтові SSH незалежно від того, в яку ОС ви завантажилися, а клієнт SSH не буде мудрішим.


Я вважаю за краще клієнтську версію, але спробую цю, якщо її не знайду. До речі, OSX (нестандартна) локалізація файлів є /private/etc/ssh_host*, ні /etc/ssh/ssh_host*.
Frédéric Grosshans

Копіювання файлів з однієї машини на іншу (дві машини Linux) не працювало для мене. Хоча вміст файлу був ідентичним, хеш був не таким, я все ще отримував проблему (можливо час модифікації?). Рішення нижче набагато краще.
Stav

sshdзавантажує ключі хоста один раз при запуску, тому вам, швидше за все, потрібно перезапустити sshd. Я додам це до відповіді. Що стосується того, щоб інші рішення були кращими, це залежить від вашої ситуації. Я можу стверджувати, що основними плюсами цього методу є те, що він вимагає лише одноразової установки та швидше працює з кількома реалізаціями клієнтів SSH.
jjlin

Цікаво, але здається, що мій відносно недавній OpenSSH 7.4p1 sshdзавантажує хост-ключі при кожному новому з'єднанні. Можливо, це було так давно, і я просто припускав, що ключі хоста обробляються як інші sshdконфігурації. Так що все одно, це може бути або не бути вашою проблемою.
jjlin

Було б поганою ідеєю зробити це двом хостам у кластері, які мають однакову адресу VRRP? Після відмови, господар, який реагує, буде іншим. Я хотів би не отримувати попередження.
Colin 't Hart

26

Як @Izzy запропонував у вищенаведеному коментарі, ssh повідомляє вам порушуючий рядок, і, видаливши цей рядок (зберігаючи його в іншому місці), прийнявши новий ключ, а потім скопіювавши видалений рядок назад, ви завершите дві клавіші для того ж хост, а ssh прийме будь-який.

(Ви також ssh-keygen -H -F <hostname>можете знайти рядки у вашому файлі знаних_хостів, які відповідають цьому імені хоста. Запустивши це після копіювання вилученого рядка, слід вказати дві записи.)

Якщо хтось знає, як змусити PuTTY зробити те саме, мені було б дуже цікаво почути про це.


4
Насправді, якщо у вас є клієнт Linux, вам навіть не потрібно видаляти порушувальну рядок, вам потрібно лише прокоментувати його з символом хеша ('#') в передній частині. Потім, як тільки ви прийняли новий ключ, ви можете просто відредагувати відомий файл_hosts і відмітити рядок зі старим ключем. Але так, це було б корисно і в Putty.
IllvilJa

1
Якщо є два хости з тим самим іменем, але різною IP-адресою та різним ключем хоста, це рішення також працює: коментуйте (або тимчасово видаляючи), тоді обидва рядки для цього хоста (той, що базується на IP-адресі, і той, що базується на хості ім'я), підключіться до ще невідомого хоста, а потім знову додайте рядки, які були прокоментовані або видалені.
Кай Петцке

13

Я виявив, що це може допомогти вам у тому, що ви хочете досягти.

Джерело: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Створіть конфігураційний файл у вашій .ssh каталозі наступним чином:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

Пояснення нижче (від man ssh_config)

CheckHostIP

Якщо цей прапор встановлений на "так", ssh (1) додатково перевірить IP-адресу хоста у відомому файлі_hosts. Це дозволяє ssh виявити, чи змінився хост-ключ через підробку DNS. Якщо для параметра встановлено значення "ні", перевірка не буде виконана. За замовчуванням - "так".

HostKeyAlias

Вказує псевдонім, який слід використовувати замість реального імені хоста при пошуку або збереженні ключа хоста у файлах бази даних хост-ключів. Цей параметр корисний для тунелювання SSH-з'єднань або для декількох серверів, що працюють на одному хості.

У рядку Ім'я користувача та Порт уникнути того, що вам потрібно буде надавати ці параметри і в командному рядку, тому ви можете просто використовувати:

% ssh server1
% ssh server2

Я бачив цю статтю, але вона не відповідає моєму випадку: два сервери відрізняються за номером порту в статті, а не в моєму випадку. Крім того, я хотів би зберегти додаткові шари безпеки, що вводяться соленими хешами в known_hostsі CheckHostIP.
Frédéric Grosshans

1
@ FrédéricGrosshans, я перевіряю, чи перевірено. Вам не потрібно мати окремі порти, і параметр HashKknownHosts добре працює з HostKeyAlias.
Zoredache

Нижній бік цього, якщо я не помиляюся, налаштовується на основі кожного клієнта, а прийнята відповідь налаштована лише на приймаючих ssh-серверах.
FreeSoftwareServers

2

Найпростіший спосіб вирішити свою проблему - дати кожному хосту власну / чітку IP-адресу. З 253 адресами, доступними у вашій (приватній) мережі та IPv4, це не зайве. Надайте їм фіксовані IP-адреси (як DHCP-сервер ідентифікує апарат на основі MAC-адреси мережевих карт, і обидва отримають однакову адресу). Я не бачу іншого рішення, якщо ви хочете дотримуватись заходів безпеки (які я б не відмовився від цього маленького "комфорту").


Власне, IP-адреса не 192.168.0.xxє і не є приватною. Це "справжня" IPv4-адреса, подана моїм університетом, яку я не вільний змінювати.
Frédéric Grosshans

Якщо ви звернетесь до Wikipedia , ви побачите 192.168.0.0 - 192.168.255.255 (у вашому питанні вказано 192.168.0.9, що потрапляє в цей діапазон) належить до "Приватних адресних просторів IPv4". Тож "приватним" я мав на увазі не "володіння" ним, а специфікаціями IETF . У своєму запитанні ви не вказали, що не можете змінити IP-адресу, вибачте - але з даними вводу моя відповідь підходила.
Іззи

Вибачте за погано сформульоване запитання. Я не спровокував.
Frédéric Grosshans

Ніяка проблема, а tnx для того, щоб дати мені знати, робить понижувальний потік менш обережним. Але інша ідея: я не впевнений, звідки у файлі known_hosts береться ім'я хоста, зворотній DNS або запропонований клієнтом. Ви можете спробувати перейменувати одного з своїх "хостів", щоб воно відображало інше ім'я хоста. Або додайте обидва хост-ключі: ssh повідомляє вам "рядок образи" у вашому файлі знаних_хостів (коли номер 1 міститься, коли ви з'єднуєтесь з №2). Тоді ви зможете скопіювати цей рядок в інший файл, видалити його з відомих_хостів, дозволити # 2 підключитися та додати його рядок, а потім видалити рядок назад. Не впевнений, чи працює, але можна спробувати.
Іззі

2

Я не стикаюся з цією проблемою під час підключення до різних VPS-боксів, що мають один і той же IP, оскільки кожен має інший порт SSH (20022,30022 тощо), тому вони реєструються як відомі хости з різними ключами.

Це може бути для вас вирішенням?


Привіт @Pyheme, ласкаво просимо до Супер Користувача! Зауважте, що це питання майже 4 роки. Нічого поганого в тому, щоб відповісти на нього, але пам’ятайте, що можливо, ви не отримаєте відповіді.
Hewbot

У мене вже немає жодної машини OS X, але ваша відповідь може бути корисною для когось іншого. У цьому вся суть обміну
стеками

@Hewbot ... дійсно, це я зараз бачу. Не знаю чому, вона з'явилася у списку останніх питань ...
Pyheme

1

Ще одна стаття , де описано кілька способів вирішення вашої проблеми:

Другий метод використовує два параметри openSSH:, StrictHostKeyCheckinі UserKnownHostsFile. Цей метод вводить SSH, налаштовуючи його на порожній файл відомих_хостів, а НЕ просити вас підтвердити ключ ідентичності віддаленого хоста.


У цьому документі йдеться про заборону перевірки ключів. Я хочу продовжувати перевірку ключів, і я не хочу забороняти її кожен раз hostnameпри перезавантаженні в Linut або OSX
Frédéric Grosshans

1
Ласкаво просимо до Супер Користувача! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки. Я включив коротку частину, але це може бути не те, що ви задумали ...
Тамара Війсман

1

Оскільки ви хочете тримати чітку перевірку ключів хоста, я б змусив їх використовувати різні known_hostsфайли. Для цього налаштуйте свій ~/.ssh/configфайл (або /etc/ssh/ssh_configфайл, якщо вам це потрібно для роботи в кількох локальних облікових записах користувачів) таким чином:

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

, $REALHOSTNAMEзвичайно замінюючи фактичним іменем хоста або IP-адресою. (Не має значення, який ви обираєте, до тих пір, поки ви виберете щось після "Імені хоста", яке б вирішило IP-адресу, але я б використовував ім'я хоста, а не IP-адресу, лише на загальних принципах.)

Тоді ssh myserver.linuxі, ssh myserver.osxтаким чином, можуть бути різні хост-ключі, але ви все одно отримаєте перевірку. Якщо Linux працює і ви вводите OS X (або навпаки), ви отримаєте попередження (на мою думку, це бажаний вплив).

Якби у мене була ця проблема, я б переконався, що в головному known_hostsфайлі було щось зовсім неправильне, що не відповідає жодному з них, так що якщо ви введете $REALHOSTNAMEзамість цього, myserver.osxви отримаєте попередження. :-) Я б це зробив, поставивши щось подібне

<ip-address-of-github.com> $REALHOSTNAME

по-моєму /etc/hosts, потім роблю ssh $REALHOSTNAMEі приймаю новий ключ, а потім виймаю цей запис.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.