Вопрос: Могу ли я автоматически добавить новый хост к known_hosts?


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

Проблема, с которой я сталкиваюсь, заключается в том, что первая ssh команда запускается против нового виртуального экземпляра, всегда появляется интерактивная подсказка:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

Есть ли способ, которым я могу обойти это и получить новый хост, который будет уже известен на клиентской машине, возможно, используя открытый ключ, который уже запел в образ виртуальной машины? Мне бы очень хотелось, чтобы я не мог использовать Expect или что-то еще, чтобы ответить на интерактивное приглашение, если смогу.


212
2018-04-16 04:15


Источник


Для тестовой среды, которая является автономной и физически безопасной, автоматическое принятие ключа может работать нормально. Но автоматическое принятие открытых ключей в производственной среде или в ненадежной сети (например, в Интернете) полностью исключает любую защиту от атак типа «человек-в-середине», которые SSH мог бы себе позволить. только действительный способ убедиться, что вы защищены от атак MITM, заключается в проверке открытого ключа хоста через какой-то небезопасный канал. Нет надежного способа автоматизировать его, не создавая достаточно сложную инфраструктуру подписи ключей. - Eil


Ответы:


Установить StrictHostKeyChecking вариант no, либо в файле конфигурации, либо через -o :

ssh -o StrictHostKeyChecking=no username@hostname.com


123
2018-04-16 04:34



Это дает вам возможность открыться человеку в середине атаки, вероятно, не очень хорошая идея. - JasperWallace
@JasperWallace, в то время как это, как правило, хороший совет, конкретный вариант использования (развертывание тестовых виртуальных машин и отправка им команд) должны быть достаточно безопасными. - Massimo
Это дает Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts. Чтобы избежать предупреждения и не добавлять запись в файл known_hosts, я делаю следующее: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com - Peter V. Mørch
Downvoting, поскольку это не отвечает на вопрос и открывает серьезные уязвимости безопасности. - marcv81
@Mnebuerquo: Если вы беспокоились о безопасности, то у вас не было бы вообще никакого отношения к этому вопросу. У вас должен быть правильный ключ хоста перед вами, собранный с консоли системы, к которой вы хотите подключиться, и вы вручную проверите ее при первом подключении. Вы, конечно, ничего не сделали бы «автоматически». - Ignacio Vazquez-Abrams


ИМО, лучший способ сделать это:

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

Это позволит убедиться, что нет дубликатов записей, которые вы покрыли как для имени хоста, так и для IP-адреса, а также для хэш-вывода - дополнительной меры безопасности.


203
2017-09-27 20:51



Зачем вам все 3 ssh-keyscan? Разве вы не можете справиться с первым, так как он работает как для hostname, так и для ip? - Robert
Можете ли вы быть уверены, что машина, отвечающая на запрос ssh-keyscan, действительно та, с которой вы хотите поговорить? Если нет, вы открыли себя человеку в средней атаке. - JasperWallace
@JasperWallace Да, для этого вам нужно хотя бы отпечаток пальца или даже лучший открытый ключ, и в этом случае вы можете добавить его непосредственно к known_hosts, превратив этот вопрос в спорный вопрос. Если у вас есть только отпечаток пальца, вам придется написать дополнительный шаг, который проверяет загруженный открытый ключ с вашим отпечатком пальца ...
Звонки на ssh-keyscan были неудачными для меня, потому что мой целевой хост не поддерживает тип ключа по умолчанию версии 1. Добавление -t rsa,dsa к команде исправлено это. - phasetwenty
Вероятно, это плохая идея. Вы открываете себя атаке «человек в середине», обновляя эти ключи. Чтобы избежать дублирования записей, проверьте статус возврата ssh-keygen -F [address] вместо. medium.com/@wblankenship/... - retrohacker


Для ленивых:

ssh-keyscan <host> >> ~/.ssh/known_hosts

71
2017-09-25 10:03



+1 за то, что он виновен по обвинению. Благодарю. - SaxDaddy
Уязвим к атакам MITM. Вы не проверяете ключевой отпечаток. - Mnebuerquo
@Mnebuerquo Вы говорите, что делать, а не как, что было бы полезно. - Jim
@jameshfisher Да, он уязвим для атак MITM, но вы когда-либо сравнивали отпечаток RSA, который был показан вам на самом деле на одном из серверов, когда вы делали это вручную? Нет? Итак, этот ответ - способ сделать это за вас. Если да, вы не должны использовать этот ответ и выполнять его вручную или выполнять другие меры безопасности ... - fivef
@Mnebuerquo Я был бы очень рад, если бы вы также сообщили нам о более эффективном способе справиться с этим, когда нам нужно клонировать репо с использованием пакетных скриптов без участия, и мы хотим обойти это приглашение. Прошу пролить свет на реальное решение, если вы считаете, что это неверный! - Waqas Shah


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

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

Вышесказанное сделает трюк, чтобы добавить хост, ТОЛЬКО, если он еще не добавлен. Это также не совместимо с безопасностью; вы не должен выполнять фрагмент на одной и той же машине происхождения более одного раза в одно и то же время, так как файл tmp_hosts может получить clobbered, в конечном итоге приводит к тому, что файл known_hosts становится раздутым ...


37
2018-03-06 09:00



Есть ли способ проверить, находится ли ключ в known_hosts до  ssh-keyscan? Причина в том, что для этого требуется некоторое время и дополнительное сетевое подключение. - utapyngo
Оригинальная версия этого файла cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts, но последующее редактирование изменило его на >>, С помощью >> является ошибкой. Он побеждает цель уникальности в первой строке и заставляет ее сбрасывать новые записи в known_hostsкаждый раз, когда он работает. (Просто опубликовано редактирование, чтобы изменить его.) - paulmelnikow
Это относится к тем же атакам MITM, что и к другим. - Mnebuerquo
@utapyngo ssh-keygen -F даст вам текущий отпечаток. Если он возвращается с кодом возврата 1, то у вас его нет. Если он что-то печатает, а код возврата равен 0, он уже присутствует. - Rich L
Это не способ сделать это. MITM. - jameshfisher


Вы можете использовать ssh-keyscan команду захватить открытый ключ и добавить это к вашему known_hosts файл.


18
2018-04-16 05:09



Убедитесь, что вы проверяете отпечаток пальца, чтобы убедиться, что это правильный ключ. В противном случае вы открываете себе атаки MITM. - Mnebuerquo
@Mnebuerquo Справедливая точка в общем контексте, но почему кто-то пытается программно собирать ключи, если они уже знают, что такое правильный ключ? - Brian Cline
Это не способ сделать это. MITM. - jameshfisher


Вот как вы можете включить SSH-keyscan в вашу игру:

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

6
2018-02-03 03:12



Вы загружаете известный действительный файл known_hosts или делаете ssh-keyscan и выгружаете вывод в known_hosts без проверки отпечатков пальцев? - Mnebuerquo
Это просто сбрасывает вывод keyscan, да. Таким образом, это то же самое, что и StrictHostKeyChecking = нет, просто с молчаливым обновлением known_hosts без использования параметров ssh. Это решение также плохо работает из-за того, что ssh-keyscan возвращает несколько строк, что заставляет эту задачу всегда помечать как «измененную», - Zart
Это не способ сделать это. MITM. - jameshfisher
@jameshfisher Я был бы очень рад, если бы вы также дали нам знать, как лучше справиться с этим, когда нам нужно клонировать репо с использованием пакетных скриптов без участия, и мы хотим обойти это приглашение. Прошу пролить свет на реальное решение, если вы считаете, что это неверный! Пожалуйста, сообщите нам, как это сделать, если вы считаете, что это неправильный способ сделать это! - Waqas Shah


это было бы полным решением, впервые принимающим ключ хоста

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

5
2017-11-23 13:51



Это не способ сделать это. MITM. - jameshfisher


Итак, я искал мирский способ обойти рутинное взаимодействие без участия рутинного git repo, как показано ниже:

brad@computer:~$ git clone git@bitbucket.org:viperks/viperks-api.git
Cloning into 'viperks-api'...
The authenticity of host 'bitbucket.org (104.192.143.3)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)?

Обратите внимание на отпечаток ключа RSA ...

Итак, это SSH, это будет работать на git over SSH и просто связанные с SSH вещи вообще ...

brad@computer:~$ nmap bitbucket.org --script ssh-hostkey

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT
Nmap scan report for bitbucket.org (104.192.143.3)
Host is up (0.032s latency).
Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
| ssh-hostkey:
|   1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA)
|_  2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA)
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds

Сначала установите nmap на ваш ежедневный драйвер. nmap очень полезен для некоторых вещей, таких как обнаружение открытых портов и это - ручная проверка отпечатков SSH. Но вернемся к тому, что мы делаем.

Хорошо. Я либо скомпрометирован в нескольких местах и ​​машинах, которые я проверил, либо более правдоподобное объяснение всего, что происходит, - это то, что происходит.

Это «отпечаток пальца» - это просто строка, сокращенная с помощью одностороннего алгоритма для нашего удобства людей, рискуя, что более одной строки разрешится в один и тот же отпечаток пальца. Это происходит, их называют столкновениями.

Несмотря на это, вернемся к исходной строке, которую мы увидим в контексте ниже.

brad@computer:~$ ssh-keyscan bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
no hostkey alg
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123
no hostkey alg

Итак, раньше времени у нас есть способ запросить форму идентификации от исходного хоста.

На этом этапе мы вручную так же уязвимы, как и автоматически: строки соответствуют, у нас есть базовые данные, которые создают отпечаток пальца, и мы могли бы запросить данные базы (предотвращая столкновения) в будущем.

Теперь, чтобы использовать эту строку таким образом, чтобы не спрашивать о подлинности хостов ...

Файл known_hosts в этом случае не использует записи открытого текста. Вы будете знать хешированные записи, когда увидите их, они выглядят как хеши со случайными символами вместо xyz.com или 123.45.67.89.

brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==

Первая строка комментариев бесстрашно появляется - но вы можете избавиться от нее с помощью простой переадресации через соглашение «>» или «>>».

Поскольку я сделал все возможное, чтобы получить неиспользуемые данные, которые будут использоваться для идентификации «хоста» и доверия, я добавлю этот идентификатор в файл known_hosts в каталоге ~ / .ssh. Поскольку он теперь будет идентифицирован как известный хост, я не буду получать подсказку, упомянутую выше, когда вы были молодым.

Спасибо, что присоединился ко мне, вот и все. Я добавляю ключ RSA bitbucket, чтобы я мог взаимодействовать с моими репозиториями git там неинтерактивным способом как частью рабочего процесса CI, но что бы вы ни делали, что хотите.

#!/bin/bash
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts

Итак, вот как вы остаетесь девственницей на сегодняшний день. Вы можете сделать то же самое с github, следуя аналогичным направлениям в свое время.

Я видел так много сообщений о переполнении стека, в которых вам было предложено программно добавить ключ вслепую без какой-либо проверки. Чем больше вы проверяете ключ с разных компьютеров в разных сетях, тем больше у вас доверия, если хост является тем, о котором он говорит, и это лучшее, что вы можете надеяться из этого уровня безопасности.

НЕПРАВИЛЬНО ssh -oStrictHostKeyChecking = no hostname [команда]

НЕПРАВИЛЬНО ssh-keyscan -t rsa -H имя_хоста >> ~ / .ssh / known_hosts

Не делайте ни одной из вышеуказанных вещей, пожалуйста. Вам предоставляется возможность увеличить ваши шансы избежать того, чтобы кто-то подслушивал ваши передачи данных через человека в средней атаке - воспользуйтесь этой возможностью. Разница заключается в буквальном подтверждении того, что у вас есть RSA-ключ, и вы знаете, как получить эту информацию, чтобы сравнить их, чтобы вы могли доверять соединению. Просто помните, что больше сравнений с разных компьютеров и сетей обычно увеличивает вашу способность доверять соединению.


4
2017-10-05 21:18



Я думаю, что это лучшее решение этой проблемы. Однако будьте очень осторожны при использовании Nmap на чем-то вроде Amazon EC2, я получил предупреждение о сканировании портов, которое делает Nmap! Заполните их форму перед выполнением portscanning! - Waqas Shah
...Ну, да. Я не знаю, зачем вам сканировать порт с EC2. Если вы вошли в свою учетную запись, вы можете просто получить ключи от реальных компьютеров. Это больше для машин, на которые у вас нет контроля. Я предполагаю, что у вас будет локальная машина, не подлежащая ограничениям сканирования портов AWS. Но, если вы находитесь в ситуации с крайним случаем, когда вы должны запускать nmap с помощью AWS, я полагаю, что это предупреждение было бы полезно. - BradChesney79
Использование nmap для чтения ключа хоста SSH с вашей рабочей станции, а затем доверие к этому значению ничем не отличается от подключения через SSH с отключением StructHostKeyChecking. Его так же уязвимы для атаки «человек в середине». - Micah R Ledbetter
... @ MicahRLedbetter, поэтому я предположил, что «больше сравнений с разными компьютерами и сетями обычно увеличивает вашу способность доверять соединению». Но, это моя точка зрения. Если вы только когда-либо проверяете свой целевой хост из одного набора условий среды, то как бы вы узнали о каких-либо расхождениях? У вас были какие-то лучшие предложения? - BradChesney79
Это театр безопасности. Выполнение чего-то сложного для создания большей безопасности. Неважно, сколько разных методов вы используете для запроса хоста для своего ключа. Например, вы спрашиваете одного и того же человека несколько раз, если можете им доверять (может быть, вы звоните, по электронной почте, текстовой и уличной почте). Они всегда будут говорить «да», но если вы спрашиваете не того человека, это не имеет значения. - vastlysuperiorman


У меня была аналогичная проблема, и выяснилось, что некоторые из предоставленных ответов позволили мне частично перейти к автоматическому решению. Следующее - это то, что я использовал, надеюсь, что это поможет:

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

Он добавляет ключ к known_hosts и не запрашивает пароль.


3
2017-10-21 17:27



Уязвим к атакам MITM. Вы не проверяете отпечаток пальца. - Mnebuerquo
Никто не проверяет отпечаток пальца. - Brendan Byrd
Это не способ сделать это. MITM. - jameshfisher


Я выполняю однострочный скрипт, немного длинный, но полезный для выполнения этой задачи для хостов с множественными IP-адресами, используя dig а также bash

(host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts

3
2018-04-18 21:01