- Понимание файла SSH known_hosts
- Понимание SSH known_hosts
- Формат файла known_hosts
- Назначение файла known_hosts
- Добавление открытого ключа в known_hosts вручную
- Как просмотреть файл ssh know_hosts?
- Где я должен хранить файл ssh know_hosts?
- Каковы некоторые распространенные проблемы с файлом ssh know_hosts?
- Похожие записи:
- What is the known_hosts File for ssh in Linux?
- Purpose of Known_hosts file
- Example
- Conclusion
- About the author
- Karim Buzdar
- Что записано в файле .ssh/known_hosts
- Имя сервера
Понимание файла SSH known_hosts
Статьи
Файл ssh known_hosts — это файл, в котором хранится открытый ключ всех серверов, к которым вы подключились с помощью ssh. Этот файл используется для проверки идентичности серверов в будущем. Ssh может автоматически добавлять ключи в этот файл, но их можно добавить и вручную.
Понимание SSH known_hosts
В SSH для аутентификации компьютеров и пользователей используется криптография с открытым ключом. Ключи хоста аутентифицируют хосты. Уполномоченные ключи и ключи идентификации аутентифицируют пользователей. В OpenSSH коллекция известных ключей хостов хранится в /etc/ssh/known_hosts и в .ssh/known_hosts в домашнем каталоге каждого пользователя. При первом подключении к хосту ssh обычно добавляет открытый ключ удаленного хоста в файл known_hosts пользователя.
Формат файла known_hosts
Формат представляет собой один открытый ключ или сертификат на одну непрерывную строку. Каждая строка содержит имя хоста, количество битов, экспоненту и модуль. В начале строки находится либо имя хоста, либо хэш, представляющий имя хоста. Можно использовать список хостов, разделенных запятыми, в поле имени хоста, если хост имеет несколько имен или если один и тот же ключ используется на нескольких машинах в пуле серверов.
Вот один из примеров ключа хоста с IP:
192.168.0.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIPV.
Назначение файла known_hosts
Этот файл является локальным для учетной записи пользователя и содержит известные ключи для удаленных хостов. Как и ключи, хранящиеся в файле ~/.ssh/known_hosts, эти ключи используются для проверки «личности» удаленного узла, защищая его от атак типа «человек посередине».
При каждом последующем подключении ключ сравнивается с ключом, предоставленным удаленным сервером. Если ключ совпадает, соединение будет продолжено. Если совпадение не произошло, ssh выдаст сообщение об ошибке. Если для удаленного узла нет ключа, то будет показан отпечаток ключа, и появится возможность автоматически добавить ключ в файл. Этот файл можно создать и отредактировать вручную, но если он не существует, он будет создан автоматически ssh при первом подключении к удаленному узлу.
Добавление открытого ключа в known_hosts вручную
Мы можем использовать ssh-keygen с опцией -F для поиска файла known_hosts.
ssh-keygen -F server.example.com .
По умолчанию будет искаться файл ~/.ssh/known_hosts, и ключ будет напечатан, если он будет найден. С помощью опции -f можно искать в другом файле. Если ключ должен быть удален из файла, опция -R работает аналогично поиску по хосту и затем удаляет его, если он найден, даже если имя хоста хэшировано.
ssh-keygen -R serverё.example.com -f ~/.ssh/known_hosts
Когда ключ будет удален, он будет добавлен в файл ~/.ssh/known_hosts.old на случай, если он понадобится позже. Если с помощью -F или -R используется файл не по умолчанию, то имя, включая путь, должно быть указано с помощью -f. Но -f необязателен, если используется файл по умолчанию.
Как просмотреть файл ssh know_hosts?
Чтобы просмотреть файл ssh know_hosts в вашей системе Linux, вы можете использовать следующую команду:
Чтобы добавить новый хост в файл ssh know_hosts, вы можете использовать следующую команду:
ssh-keyscan -t rsa [remote.server.com] >> ~/.ssh/known_hosts ssh-keyscan -H remote.server.com >> ~/.ssh/known_hosts
Чтобы удалить хост из файла know hosts, вы можете использовать следующую команду:
ssh-keygen -R [remote.server.com] ssh-keygen -r [remote.server.com]
Где я должен хранить файл ssh know_hosts?
Файл ssh know_hosts должен храниться в каталоге ~/.ssh. Например, полный путь к файлу ssh know_hosts следующий: ~/.ssh/known_hosts.
Каковы некоторые распространенные проблемы с файлом ssh know_hosts?
Файл ssh know_hosts — это файл, в котором хранится информация о хостах, к которым вы подключились с помощью ssh. Этот файл может помочь предотвратить атаки типа «человек посередине», проверяя ключ хоста перед подключением.
Частая проблема с файлом ssh know_hosts — это когда вы пытаетесь подключиться к хосту и получаете сообщение об ошибке: «WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!». Обычно это происходит, если вы поменяли оборудование на сервере, к которому подключаетесь, или если на удаленном сервере изменились настройки.
Если вы получили это сообщение об ошибке, вы можете исправить ее, удалив хост из файла ssh know_hosts и добавив его обратно:
ssh-keygen -R [remote.server.com]
ssh-keyscan -t rsa [remote.server.com] >> ~/.ssh/known_hosts
ssh-keyscan -H remote.server.com >> ~/.ssh/known_hosts
Другая распространенная проблема с файлом ssh know_hosts — это когда вы пытаетесь подключиться к хосту и получаете сообщение об ошибке: «WARNING: POSSIBLE DNS SPOOFING DETECTED!». Обычно это происходит, когда вы пытаетесь подключиться к несуществующему узлу.
Если вы получили это сообщение об ошибке, проверьте файл /etc/hosts и убедитесь, что имя удаленного сервера там есть и ему присвоен действительный IP-адрес.
Похожие записи:
What is the known_hosts File for ssh in Linux?
SSH, known as Secure Shell protocol, manages and accesses the remote systems by using an encrypted connection between the users and remote machine. In Linux systems, SSH is the most common method to connect to your servers or machines remotely and make the connection more secure through dual-key encryption remotely. It is important for both remote and client machines to make sure that they are connected with the correct intended machine.
When the first-time connection is established, the client stores the host keys of the host. The host key is an encrypted key that is used to verify the machine’s identity. These hosts keys are stored at locations ‘/etc/ssh/known_hosts’ and ‘.ssh/known_hosts’ in each user’s home directory. In this article, we will talk about what is known_hosts file for ssh in Linux distribution and how you can list its content through terminal.
Purpose of Known_hosts file
The known_hosts File is a client file containing all remotely connected known hosts, and the ssh client uses this file. This file authenticates for the client to the server they are connecting to. The known_hosts file contains the host public key for all known hosts. The use of this file is optional, but, if used then it is prepared by the system administrator. It automatically maintains the per-user file in the system. Each time a user connects with an unknown host and the unknown host key is added to this file. However, if the machine hacks or gets compromised, hackers can use the know_hosts file, view the list of all machines connected to this machine, and target those machines. To avoid this risk, not all IP addresses in the known_host key are defined in the plaintext format.
To access the content of the known_host file, type the following command to open this file in your favorite text editor through the terminal:
Example
The format of the known_hosts file is given below:
Conclusion
We have explained in this article what the purpose of is known_hosts file for ssh in Linux and how you can access its content through the command line. After reading this article, I hope you have a piece of good knowledge about the known_hosts file.
About the author
Karim Buzdar
Karim Buzdar holds a degree in telecommunication engineering and holds several sysadmin certifications. As an IT engineer and technical author, he writes for various web sites. He blogs at LinuxWays.
Что записано в файле .ssh/known_hosts
Каждый раз, когда мы подключаемся по протоколу ssh к серверу, ssh клиент проверяет совпадает ли публичный ключ для этого сервера с тем, который был прошлый раз (по крайней мере так рекомендует делать стандарт ssh). В OpenSSH список известных ключей серверов хранится в файле known_hosts. Под катом коротко о том, что и как конкретно там хранится.
Все эксперименты проводились на Linux (Debian/Mint/Ubuntu). За расположение и содержание файлов в других ОС не ручаюсь.
Подключаясь первый раз к ssh серверу, мы видим примерно такое сообщение:
The authenticity of host ‘192.168.0.2 (192.168.0.2)’ can’t be established.
RSA key fingerprint is SHA256:kd9mRkEGLo+RBBNpxKp7mInocF3/Yl/0fXRsGJ2JfYg.
Are you sure you want to continue connecting (yes/no)?
|1|CuXixZ+EWfgz40wpkMugPHPalyk=|KNoVhur7z5NAZmNndtwWq0kN1SQ= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCeiF4OOOUhWvOYrh/e4q91+iz+i9S0s3M2LPq+GAhRlhKt5vKyEVd6x6m26cc98Y+SQXnCB9GWeVYk8jlFHEXnY4YWeWLDwXIhHBJYt5yz3j5Wkg95x+mPvO9FLSBk/Al2GbH5q6F+hZIlLmO6ciISmX4TtcG1sw4SwoTADrrhdM0OJd+c5CU8iqCbc6PznYbLZXCvqPZTWeSbTLUcUu1Ti+7xGwT8DF+tIyLFcU+zxd0QnwJIbNvewkHs0LsMOWFVPz/Nd0XiVXimX+ugCDBZ/4q8NUwH9SGzCMAvnnr+D1I8X2vhSuRsTsQXL5P3vf8elDxPdDrMJzNtlBCbLWzV
Тут через пробел записаны три элемента: хэш от имени сервера, название используемого ассиметричного алгоритма и публичный ключ сервера. Разберём их по очереди.
- в начале строки может находиться пометка «@cert-authority» или “@revoked”, означающие, соответственно, что в этой строке записан публичный ключ ЦА или что этот ключ был отозван и не может быть использован.
- в конце строки может быть произвольный комментарий
Имя сервера
На самом деле тут может быть записано и имя хоста в открытом виде или маска, задающая множество допустимых имён. Но у меня по умолчанию сохраняется хэшированое имя. Запись разделена на 3 части символом «|». Первая часть — алгоритм хэширования. «1» соответствует HMAC-SHA1 (других не видел). Вторая часть — соль (ключ для HMAC). Третья часть — собственно хэш (вывод HMAC).
from base64 import b64decode import hmac salt = b64decode("CuXixZ+EWfgz40wpkMugPHPalyk https://tools.ietf.org/html/rfc4253">RFC-4253 перечислены 4 ассиметричных алгоритма: ssh-dss (по стандарту обязательный, но считается слабым и начиная с OpenSSH7.0 выключен по-умолчанию), ssh-rsa (рекомендуемый), pgp-sign-rsa (опциональный), pgp-sign-dss (опциональный). По умолчанию в Linux генерируются ключи первых двух видов и для не упомянутых в RFC алгоритмов на эллиптических кривых. Предпочтение отдаётся последним, однако клиент может выбрать алгоритм опцией HostKeyAlgorithms.
Как проверить нужный (не по-умолчанию) отпечаток ключаЭто может быть полезно если, например, при первом заходе на сервер вы хотите проверить отпечаток ключа, а знаете только отпечаток ключа ssh-rsa. Тогда можно подключиться такой командой:
ssh root@192.168.0.2 -o HostKeyAlgorithms=ssh-rsa
Если нужно задать ещё и алгоритм хэширования ключа, то можно использовать опцию FingerprintHash. Например, если известен только md5 от ssh-rsa можно подключиться так:
ssh root@192.168.0.2 -o HostKeyAlgorithms=ssh-rsa -o FingerprintHash=md5
Публичный ключ
Публичный ключ в known_hosts совпадает с тем, который записан в файле /etc/ssh/ssh_host_rsa_key.pub на сервере (вместо rsa подставить название используемого алгоритма). Если снять Base64 кодирование, то внутри будет ещё раз название алгоритма и собственно компоненты ключа.
А чего бы и не снять Base64b'\x00\x00\x00\x07ssh-rsa\x00\x00\x00\x03\x01\x00\x01\x00\x00\x01\x01\x00\x9e\x88^\x0e8\xe5!Z\xf3\x98\xae\x1f\xde\xe2\xafu\xfa,\xfe\x8b\xd4\xb4\xb3s6,\xfa\xbe\x18\x08Q\x96\x12\xad\xe6\xf2\xb2\x11Wz\xc7\xa9\xb6\xe9\xc7=\xf1\x8f\x92Ay\xc2\x07\xd1\x96yV$\xf29E\x1cE\xe7c\x86\x16yb\xc3\xc1r!\x1c\x12X\xb7\x9c\xb3\xde>V\x92\x0fy\xc7\xe9\x8f\xbc\xefE- d\xfc\tv\x19\xb1\xf9\xab\xa1~\x85\x92%.c\xbar"\x12\x99~\x13\xb5\xc1\xb5\xb3\x0e\x12\xc2\x84\xc0\x0e\xba\xe1t\xcd\x0e%\xdf\x9c\xe4%
Видно, что идут 4 байта, в которые записана длина поля, потом само поле и т.д. Первое поле — название алгоритма, остальные зависят от конкретного алгоритма. В приведённом выше ключе 3 поля:
b'ssh-rsa' - название b'\x01\x00\x01' - публичная экспонента b'\x00\x9e\x88^\x0e8\xe5!Z\xf3\x98\xae\x1f\xde\xe2\xafu\xfa,\xfe\x8b\xd4\xb4\xb3s6,\xfa\xbe\x18\x08Q\x96\x12\xad\xe6\xf2\xb2\x11Wz\xc7\xa9\xb6\xe9\xc7=\xf1\x8f\x92Ay\xc2\x07\xd1\x96yV$\xf29E\x1cE\xe7c\x86\x16yb\xc3\xc1r!\x1c\x12X\xb7\x9c\xb3\xde>V\x92\x0fy\xc7\xe9\x8f\xbc\xefE- d\xfc\tv\x19\xb1\xf9\xab\xa1~\x85\x92%.c\xbar"\x12\x99~\x13\xb5\xc1\xb5\xb3\x0e\x12\xc2\x84\xc0\x0e\xba\xe1t\xcd\x0e%\xdf\x9c\xe4%
Отпечаток ключа (Fingerprint)
Отпечаток ключа, который предлагается сверить при первом подключении — это соответствующий хэш (в примере — SHA256) от публичного ключа из прошлого пункта и из /etc/ssh/ssh_host_rsa_key.pub, закодированный в base64 для хэш функций семейства SHA или в hex для MD5.
from hashlib import sha256 from base64 import b64decode, b64encode pub_key_bin = b64decode("AAAAB3NzaC1yc2EAAAADAQABAAABAQCeiF4OOOUhWvOYrh/e4q91+iz+i9S0s3M2LPq+GAhRlhKt5vKyEVd6x6m26cc98Y+SQXnCB9GWeVYk8jlFHEXnY4YWeWLDwXIhHBJYt5yz3j5Wkg95x+mPvO9FLSBk/Al2GbH5q6F+hZIlLmO6ciISmX4TtcG1sw4SwoTADrrhdM0OJd+c5CU8iqCbc6PznYbLZXCvqPZTWeSbTLUcUu1Ti+7xGwT8DF+tIyLFcU+zxd0QnwJIbNvewkHs0LsMOWFVPz/Nd0XiVXimX+ugCDBZ/4q8NUwH9SGzCMAvnnr+D1I8X2vhSuRsTsQXL5P3vf8elDxPdDrMJzNtlBCbLWzV") hash = sha256(pub_key_bin).digest() fingerprint = b64encode(hash) print(fingerprint) > b'kd9mRkEGLo+RBBNpxKp7mInocF3/Yl/0fXRsGJ2JfYg='