Вот моя ситуация: я устанавливаю тестовую систему, которая с центрального клиента запускает несколько экземпляров виртуальной машины, а затем выполняет команды на них через 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 или чего-либо еще, чтобы ответить на интерактивное приглашение, если смогу.
источник
Ответы:
Установите
StrictHostKeyChecking
опциюno
, либо в файле конфигурации, либо через-o
:ssh -o StrictHostKeyChecking=no username@hostname.com
источник
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
ИМО, лучший способ сделать это заключается в следующем:
Это позволит убедиться, что нет повторяющихся записей, что вы застрахованы как для имени хоста, так и для IP-адреса, а также будет хэшировать вывод, что является дополнительной мерой безопасности.
источник
ssh-keyscan
мне не удавались, потому что мой целевой хост не поддерживает тип ключа версии 1 по умолчанию. Добавление-t rsa,dsa
в команду исправило это.ssh-keygen -F [address]
вместо. medium.com/@wblankenship/...Для ленивых:
-H хеширует имя хоста / IP-адрес
источник
Как уже упоминалось, использование сканирования клавиш было бы правильным и ненавязчивым способом сделать это.
Вышеприведенный способ поможет добавить хост, ТОЛЬКО если он еще не добавлен. Это также не безопасно для параллелизма; Вы не должны выполнять сниппет на одном и том же компьютере-источнике более одного раза в одно и то же время, поскольку файл tmp_hosts может быть засорен, что в конечном итоге приведет к раздутию файла known_hosts ...
источник
ssh-keyscan
? Причина в том, что для этого требуется некоторое время и дополнительное сетевое соединение.cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts
, но последующее редактирование изменило его на>>
. Использование>>
это ошибка. Это побеждает цель уникальности в первой строке, и заставляет это выгружать новые записи вknown_hosts
каждый раз, когда это выполняется. (Только что опубликовал изменения, чтобы изменить его обратно.)Вы можете использовать
ssh-keyscan
команду, чтобы получить открытый ключ и добавить его в свойknown_hosts
файл.источник
Вот как вы можете включить ssh-keyscan в свою игру:
источник
это было бы полным решением, принимая ключ хоста только в первый раз
источник
У меня была похожая проблема, и я обнаружил, что некоторые из предоставленных ответов лишь частично помогли мне найти автоматизированное решение. Вот то, что я в конечном итоге использовал, надеюсь, это поможет:
Он добавляет ключ
known_hosts
и не запрашивает пароль.источник
Итак, я искал простой способ обойти неизвестное взаимодействие с хостом при клонировании git-репо, как показано ниже:
Обратите внимание на отпечаток ключа RSA ...
Итак, это SSH, это будет работать для git over SSH и просто для SSH в целом ...
Сначала установите nmap на свой ежедневный драйвер. Nmap очень полезен для определенных вещей, таких как обнаружение открытых портов и это - ручная проверка отпечатков SSH. Но вернемся к тому, что мы делаем.
Хороший. Я либо скомпрометирован в нескольких местах и машинах, которые я проверил, либо более правдоподобным объяснением того, что все происходит так, как надо, является то, что происходит.
Этот «отпечаток пальца» - это просто строка, сокращенная с помощью одностороннего алгоритма для удобства человека, и существует риск того, что более одной строки будут преобразованы в один и тот же отпечаток пальца. Бывает, они называются столкновениями.
Независимо от этого, вернемся к исходной строке, которую мы можем увидеть в контексте ниже.
Итак, заблаговременно, у нас есть способ запросить форму идентификации у оригинального хоста.
На данный момент мы вручную так же уязвимы, как и автоматически: строки совпадают, у нас есть базовые данные, которые создают отпечаток, и мы можем запросить эти базовые данные (предотвращая столкновения) в будущем.
Теперь, чтобы использовать эту строку таким образом, чтобы не спрашивать о подлинности хостов ...
Файл known_hosts в этом случае не использует незашифрованные записи. Вы увидите хэшированные записи, когда увидите их, они выглядят как хэши со случайными символами вместо xyz.com или 123.45.67.89.
Первая строка комментария выводит из себя, но вы можете избавиться от нее простым перенаправлением через соглашение «>» или «>>».
Поскольку я сделал все возможное, чтобы получить незапятнанные данные, которые будут использоваться для идентификации "хоста" и доверия, я добавлю эту идентификацию в мой файл known_hosts в моем каталоге ~ / .ssh. Поскольку теперь он будет определен как известный хост, я не получу подсказку, упомянутую выше, когда вы были ребенком.
Спасибо, что остались со мной, вот и все. Я добавляю ключ bitbucket RSA, чтобы я мог взаимодействовать со своими репозиториями git неинтерактивным способом как часть рабочего процесса CI, но независимо от того, что вы делаете, что хотите.
Итак, вот как ты остаешься девственницей на сегодня. Вы можете сделать то же самое с GitHub, следуя аналогичным инструкциям в свое время.
Я видел так много сообщений о переполнении стека, в которых говорилось, что вы должны программно добавлять ключ вслепую без какой-либо проверки. Чем больше вы проверяете ключ на разных машинах в разных сетях, тем больше вы можете быть уверены, что хост - это тот, о котором он говорит, - и это лучшее, на что вы можете надеяться на этом уровне безопасности.
НЕПРАВИЛЬНО
ssh -oStrictHostKeyChecking = нет имени хоста [команда]НЕПРАВИЛЬНО
ssh-keyscan -t rsa -H имя хоста >> ~ / .ssh / known_hostsНе делайте ничего из вышеперечисленного, пожалуйста. Вам предоставляется возможность повысить ваши шансы избежать того, чтобы кто-то подслушивал ваши передачи данных через человека, находящегося в середине атаки - воспользуйтесь этой возможностью. Разница заключается в том, что вы в буквальном смысле проверяете, что у вас есть ключ RSA, принадлежащий добросовестному серверу, и теперь вы знаете, как получить эту информацию для сравнения, чтобы вы могли доверять соединению. Просто помните, что больше сравнений с разных компьютеров и сетей, как правило, увеличит вашу способность доверять соединению.
источник
Я делаю однострочный скрипт, немного длинный, но полезный, чтобы выполнить эту задачу для хостов с несколькими IP-адресами, используя
dig
иbash
источник
Следующее избегает повторяющихся записей в ~ / .ssh / known_hosts:
источник
mkdir -p ~/.ssh/known_hosts;
Как вы строите эти машины? Вы можете запустить скрипт обновления DNS? Вы можете присоединиться к домену IPA?
FreeIPA делает это автоматически, но по сути все, что вам нужно - это записи SSHFP dns и DNSSEC в вашей зоне (freeipa предоставляет в качестве настраиваемых параметров (dnssec отключен по умолчанию)).
Вы можете получить существующие записи SSHFP с вашего хоста, запустив.
ssh-keygen -r jersey.jacobdevans.com
затем, после публикации, вы добавите
VerifyHostKeyDNS yes
в свой ssh_config или ~ / .ssh / configЕсли / когда Google решит включить DNSSEC, вы можете войти в ssh без запроса hostkey.
ssh jersey.jacobdevans.com
НО мой домен еще не подписан, так что пока вы увидите ....
источник
Чтобы сделать это правильно, вы действительно хотите собрать открытые ключи хоста виртуальных машин по мере их создания и поместить их в файл в
known_hosts
формате. Затем вы можете использовать-o GlobalKnownHostsFile=...
указатель на этот файл, чтобы убедиться, что вы подключаетесь к хосту, к которому, по вашему мнению, вы должны подключаться. Однако то, как вы это сделаете, зависит от того, как вы настраиваете виртуальные машины, но чтение этой информации из виртуальной файловой системы, если это возможно, или даже получение хоста для печати содержимого/etc/ssh/ssh_host_rsa_key.pub
во время конфигурации может помочь.Тем не менее, это может не стоить того, в зависимости от того, в какой среде вы работаете и кто ваши предполагаемые противники. Выполнение простого «сохранения при первом подключении» (посредством сканирования или просто во время первого «реального» подключения), как описано в нескольких других ответах выше, может быть значительно проще и все же обеспечивает некоторую степень безопасности. Тем не менее, если вы сделаете это, я настоятельно рекомендую вам изменить файл hosts (
-o UserKnownHostsFile=...
), известный пользователю, на файл, специфичный для этой конкретной тестовой установки; это позволит избежать загрязнения вашего личного известного хост-файла тестовой информацией и упростит очистку теперь бесполезных открытых ключей при удалении ваших виртуальных машин.источник
Весь этот
бизнес продолжал раздражать меня, поэтому я выбрал
Один сценарий, чтобы управлять ими всеми
Это вариант сценария на https://askubuntu.com/a/949731/129227 с ответом Амаду Баха https://serverfault.com/a/858957/162693 в цикле.
пример вызова
./sshcheck somedomain site1 site2 site3
Сценарий зацикливает имена сайтов, изменяет файлы .ssh / config и .ssh / known_hosts и выполняет ssh-copy-id по запросу - для последней функции только вызовы теста let ssh завершатся неудачно, например, нажав 3 раза на enter запрос пароля.
скрипт sshcheck
источник
Вот как сделать коллекцию хостов
определить коллекцию хостов
Затем определите две задачи для добавления ключей к известным хостам:
источник
Лучше всего, вы проверите отпечаток каждого нового сервера / хоста. Это единственный способ аутентификации сервера. Без этого ваше SSH-соединение может подвергнуться атаке «человек посередине» .
Если вы действительно уверены, что хотите игнорировать проверку отпечатка пальца, то используйте второй лучший, менее безопасный вариант
StrictHostKeyChecking=accept-new
, который был представлен в версии 7.6 OpenSSH (2017-10-03) :Не используйте старое значение,
StrictHostKeyChecking=no
которое никогда не проверяет подлинность сервера вообще. (Хотя значение этого=no
параметра будет изменено позже ).источник