ПРЕДУПРЕЖДЕНИЕ -> Будьте внимательны при чтении этого описания проблемы. Когда я писал этот вопрос, у меня были некоторые предположения, которые не были правильными. Обязательно прочтите мой ответ, объясняющий, в чем я ошибся!
У меня есть хост 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.
Как отпечатки пальцев могут отличаться, но ключ по-прежнему позволяет мне подключиться?
Здесь задействованы 2 пары ключей:
демон ssh на сервере имеет набор закрытых ключей, созданных и сохраненных в / etc / ssh /
папка
Отпечаток RSA, который вы получаете с сервера, исходит из открытого ключа, соответствующего / etc / ssh / ssh_host_rsa_key
закрытому ключу
Это ваша пара ключей. Закрытый ключ должен надежно храниться на вашем компьютере и использоваться для аутентификации на сервере. Открытый ключ находится на сервере в файле authorized_keys вашего профиля: ~ / .ssh / authorized_keys
Таким образом, существует 2 разных открытых ключа, и их отпечатки пальцев не будут совпадать, если вы не используете тот же закрытый ключ, что и один. на сервере, что маловероятно.
Чтобы избавиться от предупреждения, сделайте именно то, что он просил: поместите отпечаток сервера в файл /var/lib/jenkins/.ssh/known_hosts
.
Если я правильно вас понял, файл закрытого ключа находится в вашем распоряжении, и вы хотите получить его отпечаток, чтобы добавить его в свой файл 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
.
Моя основная путаница была что я думал, что у меня точно такая же пара закрытого и открытого ключей, что и на сервере. Вместо этого происходит следующее: когда я создаю пару ключей и назначаю ее новому экземпляру EC2, экземпляр EC2 получает открытый ключ этой пары, помещенный в его authorized_keys, что позволяет мне подключиться к нему с помощью закрытого ключа, который я загружаю при создании пару в AWS.
Я могу использовать команду fingerprinting, которая поставляется с AWS, но это хорошо только для проверки того, что мой закрытый ключ соответствует сохраненному ими открытому ключу и будет помещен в authorized_keys.
Каждый раз, когда появляется новый экземпляр EC2, он генерирует набор собственных закрытых / открытых ключей для различных алгоритмов, таких как RSA и DSA. Теперь я должен очистить журналы, чтобы получить отпечатки этих ключей, чтобы я мог убедиться, что они соответствуют хосту, к которому я подключаюсь.
Итак, шаги таковы.
Имейте в виду, что важная проблема здесь заключается в том, что вы не можете быть уверены, что хост, к которому вы подключаетесь, не является человеком в центре атаки. Если вы вслепую примете ключ, не подтвердив его отпечаток пальца на шаге 4, возможно, вы не подключаетесь к серверу, на котором рассчитываете. Проверяя на шаге 4, вы знаете, что ваше соединение безопасно (из-за криптографии SSH), но, что очень важно, вы также знаете, к кому вы подключены, потому что только один человек будет иметь отпечаток пары ключей, соответствующий ожидаемому.
EDIT: команда get-console-output не надежна для автоматизации. Он предназначен ТОЛЬКО для специального поиска и устранения неисправностей. Основная проблема заключается в том, что AWS будет произвольно вырезать части журнала и / или буферизовать его таким образом, что вам придется долго ждать, чтобы увидеть полную запись.
Вместо этого я пытаюсь загрузить ключи в сценарий пользовательских данных, выключите систему, очистите сценарий пользовательских данных, чтобы он стал недоступен (потому что в нем есть закрытый ключ), а затем верните экземпляр в рабочее состояние. Мне все равно нужно перезагрузить его, потому что для обновленных пакетов может потребоваться перезагрузка, чтобы я мог убить двух зайцев здесь.