Вопрос или проблема
Я всегда замечаю, что получаю это сообщение, когда я ssh
на новую машину:
12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53
Что это значит? Будет ли у каждой машины одинаковый отпечаток каждый раз?
Как генерируются эти отпечатки? От каких параметров они зависят?
Отпечаток основывается на открытом ключе хоста, обычно находящимся в файле /etc/ssh/ssh_host_rsa_key.pub
. Обычно это нужно для удобной идентификации/проверки хоста, к которому вы подключаетесь.
Вы можете просмотреть содержимое файла, выполнив cat /etc/ssh/ssh_host_rsa_key.pub
. Чтобы просмотреть этот открытый ключ в формате отпечатка, выполните ssh-keygen -lvf /etc/ssh/ssh_host_rsa_key.pub
.
Если отпечаток изменяется, это значит, что машина, к которой вы подключаетесь, изменила свой открытый ключ. Это не всегда плохо (это происходит после переустановки ssh), но это также может указывать на то, что вы подключаетесь к другой машине в том же домене/IP (это происходит, когда вы подключаетесь через что-то вроде балансировщика нагрузки) или что вы подвергаетесь атаке «человек посередине», где атакующий каким-то образом перехватывает/передает ваше ssh-соединение, чтобы подключиться к другому хосту, который может шпионить за вашим именем пользователя/паролем.
Итог: если вам предупреждают о измененном отпечатке, будьте осторожны и дважды проверьте, что вы действительно подключаетесь к правильному хосту через защищенное соединение. Хотя в большинстве случаев это безвредно, это может быть признаком потенциальной проблемы.
Смотрите: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
и: http://en.wikipedia.org/wiki/Public_key_fingerprint
Вы можете сгенерировать отпечаток для открытого ключа, используя ssh-keygen
, следующим образом:
ssh-keygen -lf /path/to/key.pub
Конкретный пример (если вы используете открытый ключ RSA):
$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)
Первая часть (2048)
– это длина ключа в битах, вторая часть (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)
– это отпечаток открытого ключа, а третья часть – это расположение самого файла открытого ключа.
В более новых версиях OpenSSH вместо шестнадцатеричного MD5 показывается закодированный в Base64 SHA-256. Чтобы показать хеш в старом стиле, используйте
$ ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub
Отпечаток – это MD5 от двоичных данных внутри открытого ключа, закодированного в Base64.
$ ssh-keygen -f foo
Генерация пары открытого/закрытого ключа rsa.
Введите пароль (оставьте пустым для отсутствия пароля):
Введите тот же пароль еще раз:
Ваша идентификация сохранена в foo.
Ваш открытый ключ сохранен в foo.pub.
Отпечаток ключа:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
Случайное изображение ключа:
+--[ RSA 2048]----+
| +*..+* |
| =. +.= |
| . . .o . |
| o+ E |
| S= . + o |
| . o o + |
| . . |
| |
| |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
| base64 -D | md5
6530389635564f6464e8e3a47d593e19
md5sum 6530389635564f6464e8e3a47d593e19 – это отпечаток, отображаемый при генерации ключа, только без разделяющих двоеточий.
Тем не менее, если вы имеете дело с отпечатками, которые Amazon показывает в консоли EC2 Key Pairs, к сожалению, это может быть другое дело. Если это 32-значная шестнадцатеричная строка, это стандартный MD5 SSH открытого ключа выше. Но если это 40 шестнадцатеричных цифр, на самом деле это отпечаток, вычисленный путем взятия SHA1 закрытого ключа в формате PKCS#8:
$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
Если вы хотите проверить файл SSH-ключа, чтобы увидеть, совпадает ли он с тем, что сообщается как “Deploy key” в github, это для вас…
С частного URL: https://github.com/<username>/<repo_name>/settings/keys вы увидите
В терминале:
$ ls -l id*
-rw------- 1 bruno staff 1675 Mar 29 17:03 id_rsa
-rw-r--r-- 1 bruno staff 416 Mar 29 17:03 id_rsa.pub
$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)
$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)
Вы заметите, что получаете одинаковый отпечаток для как закрытых, так и открытых ключей.
Вот одна команда, которую вы можете использовать, чтобы воспользоваться этим.
$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done
key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz
key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Для проверки отпечатка, который присутствует в Azure Devops, вы можете использовать
$ ssh-keygen -E md5 -lf .ssh/id_rsa.pub
2048 MD5:ba:42:24:87:d6:7b:71:a2:3e:b5:9a:31:b2:2c:e0:00 CrazyGirrafe@Australasia (RSA)
ssh-keygen -r host.name.com
Выведет отпечатки для всех настроенных открытых ключей на экземпляре sshd.
Их можно затем поместить в DNS SSHFP записи.
С OpenSSH 7.8 или более поздней версии, при использовании ключей RSA это приведет к совпадению отпечатка с тем, который AWS показывает в своем списке ключей.
ssh-keygen -ef $path_to_private_key -m PEM | openssl rsa -RSAPublicKey_in -outform DER | openssl md5 -c
Вот еще один способ получить отпечаток, используя общие утилиты в debian/ubuntu. Это может помочь понять, что делает ssh-keygen за кулисами.
cat ~/.ssh/id_rsa.pub | awk '{print $2}' | base64 -d | md5sum
Пример вывода:
abcdabcd123123123123123123123123 –
Объяснение:
- cat для чтения файла открытого ключа
- awk для выбора второго слова из файла открытого ключа
- base64 -d для декодирования ключа
- md5sum для отображения контрольной суммы (отпечатка)
Ответ или решение
Что такое отпечаток SSH-ключа и как он генерируется?
Определение отпечатка SSH-ключа
Отпечаток SSH-ключа (SSH key fingerprint) представляет собой уникальный идентификатор, который позволяет пользователю безопасно проверять подлинность удаленного сервера при установлении соединения через SSH (Secure Shell). Это короткая строка, основанная на публичном ключе сервера, которая обычно отображается в шестнадцатеричном формате, например:
12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53
Отпечаток помогает предотвратить манипуляции с соединением, такие как атаки "человек посередине" (man-in-the-middle), когда злоумышленник может подменить удаленный сервер.
Генерация отпечатков
Отпечатки генерируются на основе публичного ключа, который передается через SSH. Обычно это файл, расположенный по пути /etc/ssh/ssh_host_rsa_key.pub
для RSA ключей. Генерация отпечатка происходит с использованием стандартных криптографических хеш-функций.
Процесс формирования отпечатка
Формирование отпечатка включает в себя несколько этапов:
-
Чтение публичного ключа: С помощью команды
cat /etc/ssh/ssh_host_rsa_key.pub
можно просмотреть содержимое публичного ключа. -
Получение отпечатка: Для получения отпечатка используется команда
ssh-keygen
, которая применяет хеширование к бинарным данным публичного ключа. Пример команды:ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
-
Алгоритмы хеширования: Для создания отпечатка может использоваться MD5 или SHA-256. В новых версиях OpenSSH хеширование выполняется с помощью SHA-256, вместо устаревшего MD5. Для старого формата (MD5) используется команда:
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_rsa_key.pub
-
Формат вывода: При выполнении вышеуказанной команды, вывод будет включать длину ключа, сам отпечаток и путь к файлу с публичным ключом. Например:
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /path/to/key.pub (RSA)
Зависимость от параметров
Отпечаток SSH-ключа зависит от следующих параметров:
- Тип ключа: Например, RSA, DSA, ECDSA или ED25519. Каждый тип ключа будет иметь свой специфический алгоритм генерации.
- Длина ключа: Более длинные ключи обеспечивают более высокий уровень безопасности.
- Содержимое публичного ключа: Изменение в самом публичном ключе немедленно отразится на его отпечатке.
- Версия OpenSSH: Новые версии могут использовать более современные хеш-функции.
Заключение
Отпечаток SSH-ключа является критически важным элементом для обеспечения безопасности соединений через SSH. Понимание его значения и процесса генерации позволяет пользователям более уверенно подключаться к удалённым серверам, минимизируя риски, связанные с безопасностью. Всегда следует быть внимательным к предупреждениям о смене отпечатка, так как это может сигнализировать о потенциальной угрозе или изменениях в серверной инфраструктуре.