Как я могу добавить запись отпечатка закрытого ключа .pem в known_hosts перед подключением по ssh?

ПРЕДУПРЕЖДЕНИЕ -> Будьте внимательны при чтении этого описания проблемы. Когда я писал этот вопрос, у меня были некоторые предположения, которые не были правильными. Обязательно прочтите мой ответ, объясняющий, в чем я ошибся!

У меня есть хост A в AWS в качестве экземпляра EC2.

У меня есть закрытый ключ, встроенный в файл .PEM, который я могу использовать для хоста A с ключом SSH Z. Это работает, если я передаю его команде ssh с аргументом -l , И если я отключите строгую проверку хоста с помощью -o StrictHostKeyChecking = no .

Я бы настоятельно предпочел оставить строгую проверку хоста, даже если я «знаю», что это правильный хост, потому что я взаимодействую с интерфейсом AWS, получаю от них IP / DNS, и я нахожусь внутри своего собственного маленький мир VPC.

Похоже, что единственный способ предоставить отображение отпечатка пальца -> хост - это указать его в файле known_hosts .

Верно?

Если это верно, как я могу взять закрытый ключ, встроенный в файл .PEM, который у меня есть, из AWS и создать правильную запись для единственного отпечатка пальца -> сопоставление хоста для временного файл known_hosts , который я могу прочитать при входе в экземпляр EC2?

ЧТО Я НЕ ХОЧУ ДЕЛАТЬ

  • Используйте ssh-keyscan .Все это означает слепое принятие отпечатка пальца удаленного клиента без проверки его соответствия ключу. Думаю?
  • Отключить StrictHostKeyChecking . Я хочу внедрить передовой опыт на раннем этапе, и мне нужно знать, как это сделать сейчас, потому что мне нужно будет знать, как это делать в целом. (Под этим я имею в виду, как использовать отпечатки пальцев SSH для проверки идентичности хоста, к которому я подключаюсь, на основе ключа, который у меня есть.)
  • Возиться с ssh-add . Я хочу записать это в файл, к которому легко заблокировать доступ, а не помещать его в запущенный процесс.

РЕДАКТИРОВАТЬ: Как ни странно, когда я пытаюсь извлечь отпечаток пальца из файла pem, он не соответствует отпечатку пальца, который я вижу при подключении, и он запрашивает меня.

ИЗВЛЕЧЕНИЕ ОТПЕЧАТКА ПАЛЬЦА ИЗ PEM

bash-4.2$ ssh-keygen -l -E md5 -f ./blah.PEM
2048 MD5:be:b1:d7:e1:f0:0f:ce:41:60:fa:97:dc:b8:2c:ed:08 no comment (RSA)
bash-4.2$ ssh-keygen -l -E sha1 -f ./blah.PEM
2048 SHA1:g2PDmIcw19Z/v7HTco6xRWxQ88c no comment (RSA)

ОТОБРАЖЕНИЕ ОТПЕЧАТКА ПАЛЬЦА ВО ВРЕМЯ УПРАВЛЕНИЯ SSH

bash-4.2$ ssh -i ./blah.PEM ubuntu@ip-172-31-6-91.us-east-2.compute.internal
The authenticity of host 'ip-172-31-6-91.us-east-2.compute.internal (172.31.6.91)' can't be established.
ECDSA key fingerprint is SHA256:ibwhkrF5oMapJla4cKuXgePT5lHmg08L7yMp6auCpgo.
ECDSA key fingerprint is MD5:ba:82:53:ee:89:22:26:63:26:11:21:93:63:1f:1d:d1.

Как отпечатки пальцев могут отличаться, но ключ по-прежнему позволяет мне подключиться?

6
задан 14 May 2019 в 03:59
3 ответа

Здесь задействованы 2 пары ключей:

  1. Закрытый / открытый ключ сервера.

демон ssh на сервере имеет набор закрытых ключей, созданных и сохраненных в / etc / ssh / папка

Отпечаток RSA, который вы получаете с сервера, исходит из открытого ключа, соответствующего / etc / ssh / ssh_host_rsa_key закрытому ключу

  1. Закрытый / открытый ключ пользователя ключ.

Это ваша пара ключей. Закрытый ключ должен надежно храниться на вашем компьютере и использоваться для аутентификации на сервере. Открытый ключ находится на сервере в файле authorized_keys вашего профиля: ~ / .ssh / authorized_keys


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

Чтобы избавиться от предупреждения, сделайте именно то, что он просил: поместите отпечаток сервера в файл /var/lib/jenkins/.ssh/known_hosts .

7
ответ дан 3 December 2019 в 00:07

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

$ ssh-keygen -yf /path_to_private_key/key_file_name

Результатом будет что-то вроде:

ssh-rsa AAAAB3NzaC....

Наконец, добавьте к этому префиксу IP-адрес, на который вы используете SSH, чтобы у вас было следующее:

10.200.25.5 ssh-rsa AAAAB3NzaC....

и вы можете добавить это как строка в вашем файле known_hosts .

4
ответ дан 3 December 2019 в 00:07

Моя основная путаница была что я думал, что у меня точно такая же пара закрытого и открытого ключей, что и на сервере. Вместо этого происходит следующее: когда я создаю пару ключей и назначаю ее новому экземпляру EC2, экземпляр EC2 получает открытый ключ этой пары, помещенный в его authorized_keys, что позволяет мне подключиться к нему с помощью закрытого ключа, который я загружаю при создании пару в AWS.

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

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

Итак, шаги таковы.

  1. Создайте экземпляр EC2, сохраните ключ, который вы получите .
  2. Передайте этот ключ от шага 1 Дженкинсу, чтобы он мог подключиться к хосту.
  3. Используйте команду get-console-output, чтобы очистить отпечатки ключей от журналов.
  4. Попытка подключиться к удаленный момент с ключом из шага 1. Используйте отпечаток ключа из этого сообщения об ошибке для проверки по отпечатку пальца, который вы скопировали на шаге 3.
  5. После того, как вы подтвердили, вы знаете, что можно безопасно добавить удаленный хост. 1236] Прибыль !!!

Имейте в виду, что важная проблема здесь заключается в том, что вы не можете быть уверены, что хост, к которому вы подключаетесь, не является человеком в центре атаки. Если вы вслепую примете ключ, не подтвердив его отпечаток пальца на шаге 4, возможно, вы не подключаетесь к серверу, на котором рассчитываете. Проверяя на шаге 4, вы знаете, что ваше соединение безопасно (из-за криптографии SSH), но, что очень важно, вы также знаете, к кому вы подключены, потому что только один человек будет иметь отпечаток пары ключей, соответствующий ожидаемому.

EDIT: команда get-console-output не надежна для автоматизации. Он предназначен ТОЛЬКО для специального поиска и устранения неисправностей. Основная проблема заключается в том, что AWS будет произвольно вырезать части журнала и / или буферизовать его таким образом, что вам придется долго ждать, чтобы увидеть полную запись.

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

https://alestic.com/2012/04/ec2-ssh-host-key/

2
ответ дан 3 December 2019 в 00:07

Теги

Похожие вопросы