← Назад к вопросам

Где хранится fingerprint для подключения по ssh?

2.0 Middle🔥 181 комментариев
#Linux и администрирование#Безопасность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Расположение SSH Fingerprint (отпечатка ключа)

SSH fingerprint (отпечаток) — это криптографический хэш (чаще всего SHA256) открытого ключа SSH, используемый для удобной идентификации и проверки подлинности удалённого хоста или пользовательского ключа. Место его хранения зависит от того, чей именно отпечаток мы рассматриваем: удалённого сервера или локального пользовательского ключа.


1. Fingerprint удалённого SSH-сервера (проверка хоста)

При первом подключении к SSH-серверу клиент вычисляет fingerprint его открытого ключа хоста (host public key) и сохраняет его локально для последующей проверки, чтобы избежать атак "человек посередине" (man-in-the-middle). Этот сохранённый отпечаток хранится в файле:

~/.ssh/known_hosts

Формат записи в known_hosts (для современных систем):

[хост или ip]:порт ssh-тип-ключа открытый-ключ комментарий

Пример:

github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

Как посмотреть сохранённые fingerprint для конкретного хоста:

# Классический способ (показывает MD5-хэш)
ssh-keygen -l -f ~/.ssh/known_hosts

# Для просмотра SHA256 (современный стандарт)
ssh-keygen -l -f ~/.ssh/known_hosts -E sha256

# Искать конкретный хост
ssh-keygen -F github.com -f ~/.ssh/known_hosts

Важно: Сам сервер НЕ хранит свой собственный fingerprint. Он хранит только пары ключей хоста (публичный и приватный), обычно в:

/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ed25519_key

А fingerprint всегда вычисляется клиентом из полученного публичного ключа.


2. Fingerprint локального пользовательского SSH-ключа

Когда вы создаёте пару ключей для аутентификации (id_rsa, id_ed25519 и т.д.), fingerprint используется для удобного идентификатора вашего публичного ключа (например, при добавлении в GitHub или GitLab). Сам fingerprint нигде отдельно не "хранится" как файл — он динамически вычисляется из публичного ключа.

Как вычислить fingerprint своего ключа:

# Для ключа по умолчанию (~/.ssh/id_rsa.pub)
ssh-keygen -l -f ~/.ssh/id_rsa.pub

# С указанием алгоритма хэширования (SHA256)
ssh-keygen -l -f ~/.ssh/id_rsa.pub -E sha256

# Пример вывода (SHA256):
256 SHA256:jX3g5DcP2qLsTqNlLk1fY6g5b7n8vCx1z2a3s4d5f6g7 example@host (RSA)

Где это используется:

  • Git-платформы (GitHub/GitLab/Bitbucket) показывают fingerprint вашего добавленного ключа в настройках аккаунта.
  • Серверы могут использовать fingerprint в файле authorized_keys для более компактной записи (хотя обычно хранится целиком публичный ключ).
  • Инструменты управления инфраструктурой (Ansible, Terraform) могут использовать fingerprint для проверки ключей.

3. Практическое значение в DevOps

  1. Безопасность и аудит: Проверка fingerprint — обязательный шаг при первом подключении к новому продакшен-серверу. В DevOps это часто автоматизируется через SSHFP-записи DNS или внутренние CA (например, Hashicorp Vault SSH Secrets Engine).
  2. Автоматизация: В скриптах развёртывания (CI/CD) можно проверять fingerprint сервера перед подключением:
    # Пример строгой проверки через SSHFP
    ssh -o "VerifyHostKeyDNS=yes" user@host
    
    # Или явное сравнение
    EXPECTED_FINGERPRINT="SHA256:jX3g5DcP2qLsTqNlLk1fY6g5b7n8vCx1z2a3s4d5f6g7"
    ACTUAL_FINGERPRINT=$(ssh-keyscan -t rsa host 2>/dev/null | ssh-keygen -l -f - -E sha256 | awk '{print $2}')
    if [ "$EXPECTED_FINGERPRINT" = "$ACTUAL_FINGERPRINT" ]; then
        echo "Fingerprint verified"
    fi
    
  3. Управление доступом: В крупных инфраструктурах базы данных known_hosts централизованно управляются через конфигурационные менеджеры (Ansible, Chef, Puppet) или распределяются через образы систем.

Резюме: Физически fingerprint хранится только в файле ~/.ssh/known_hosts на клиентской машине (для серверов) или вычисляется "на лету" из публичного ключа пользователя. Понимание этого механизма критично для построения безопасных и автоматизированных подключений в DevOps-практике, где ручная проверка уступает место автоматизированным методам верификации на основе доверенных источников.