Надежно добавьте хост (например, GitHub) в файл SSH known_hosts

Как я могу добавить ключ хоста в SSH known_hosts файл?

Я настраиваю машину для разработки и хочу (например) запретить git выводить запрос, когда я клонирую репозиторий из github. com с использованием SSH.

Я знаю, что могу использовать StrictHostKeyChecking = no (например, этот ответ ), но это небезопасно.

Пока что я ' мы нашли ...

  1. GitHub публикует их отпечатки ключей SSH по адресу https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Я могу использовать ssh -keyscan , чтобы получить ключ хоста для github.com .

Как мне объединить эти факты? Учитывая заранее составленный список отпечатков пальцев, как мне проверить, что вывод ssh-keyscan может быть добавлен в файл known_hosts ?


Думаю, я спрашиваю следующее:

Как мне получить отпечаток ключа, возвращенный ssh-keyscan ?

Предположим, что я уже был MITM-ed для SSH, но я могу доверять странице HTTPS на GitHub (потому что у нее есть действующая цепочка сертификатов).

Это означает, что у меня есть некоторые (подозрительные) ключи хоста SSH (из ssh-keyscan ) и некоторые (доверенные) ключевые отпечатки пальцев. Как мне сравнить одно с другим?


Связано: как мне хэшировать хост-часть вывода из ssh-keyscan ? Или я могу смешивать хешированные / нехешированные хосты в known_hosts ?

20
задан 24 June 2019 в 18:33
6 ответов

Самая важная часть «безопасного» добавления ключа в файл known_hosts - это получение отпечатка ключа от администратора сервера. Отпечаток ключа должен выглядеть примерно так:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

В случае GitHub обычно мы не можем напрямую поговорить с администратором. Однако,они помещают ключ на свои веб-страницы, чтобы мы могли восстановить информацию оттуда.

Установка ключа вручную

1) Возьмите копию ключа с сервера и получите его отпечаток пальца. NB: сделайте это перед проверкой отпечатка пальца.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Получите копию отпечатка ключа у администратора сервера - в этом случае перейдите на страницу с информацией на github.com

  1. Перейдите на github.com
  2. Перейдите на страницу справки (в меню справа, если вы вошли в систему; в противном случае внизу домашней страницы).
  3. В разделе Получение Начатый раздел перейдите к Подключение к GitHub с помощью SSH
  4. Перейдите к Тестирование SSH-соединения
  5. Скопируйте отпечаток SHA256 с этой страницы в текстовый редактор для дальнейшего использования.

3) Сравните ключи из двух источников

Поместив их друг над другом в текстовом редакторе, легко увидеть, не изменилось ли что-то

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

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

Если ключи разные ab или выполните процедуру и свяжитесь со специалистом по безопасности

4) Если ключи сравниваются правильно, вам следует установить ключ, который вы уже загрузили

cat github-key-temp >> ~/.ssh/known_hosts

, или установить для всех пользователей в системе (как root):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Автоматическая установка ключа

Если вам нужно добавить ключ во время процесса сборки, вы должны выполнить шаги 1-3 описанного выше ручного процесса.

После этого изучите содержимое вашего github -key-temp и создайте сценарий для добавления этого содержимого в ваш файл известных хостов.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Теперь вы должны избавиться от любых команд ssh , которые имеют ] StrictHostKeyChecking отключено.

10
ответ дан 2 December 2019 в 20:10

Вы можете смешивать хэшированные/нехэшированные записи в вашем файле known_hosts.

Так что если вы хотите добавить ключ github, вы можете просто сделать :

ssh-keyscan github.com >> ~/.ssh/known_hosts

Если вы хотите, чтобы он был хэширован, добавьте -H

ssh-keyscan -H github. com >> ~/.ssh/known_hosts

17
ответ дан 2 December 2019 в 20:10

Самый простой способ - это вручную получить ключи, используя ssh-клавишиcan, проверить их вручную:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

и добавить их в свой скрипт, который будет нести в себе "авторитетный" открытый ключ.

.
6
ответ дан 2 December 2019 в 20:10

Я написал простой скрипт (add_to_known_hosts), чтобы справиться с этим:

Он не будет создавать повторяющиеся записи в known_hosts, и он будет проверять, соответствует ли отпечаток пальца одному, указанному в качестве второго аргумента.

#!/usr/bin/env bash
# First argument should be hostname (or IP)
# Second argument should be referential fingerprint
# Example: add_to_known_hosts github.com SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8

host=$1
fingerprint=$2

ip=$(getent hosts $1 | awk '{ print $1 }')
echo $ip

keys=$(ssh-keyscan -t rsa $host $ip)

# Iterate over keys (host and ip)
while IFS= read -r key; do
    # Extract Host name (or IP)
    key_host=$(echo $key | awk '{ print $1 }')

    # Extracting fingerprint of key
    key_fingerprint=$(echo $key | ssh-keygen -lf - | awk '{ print $2 }')

    # Check that fingerprint matches one provided as second parameter
    if [[ $fingerprint != $key_fingerprint ]]; then
      echo "Fingerprint match failed: '$fingerprint' (expected) != '$key_fingerprint' (got)";
      exit 1;
    fi

    # Add key to known_hosts if it doesn't exist
    if ! grep $key_host ~/.ssh/known_hosts > /dev/null
    then
       echo "Adding fingerprint $key_fingerprint for $key_host to ~/.ssh/known_hosts"
       echo $key >> ~/.ssh/known_hosts
    fi
done <<< "$keys"
4
ответ дан 19 March 2020 в 10:00

Чтобы сгенерировать файл known_hosts, после создания закрытого и открытого ключей и копирования открытого ключа на site.com, вы можете сделать

ssh -T account@site.com
0
ответ дан 29 January 2021 в 21:18

Автоматизация проверки отпечатков пальцев SSH Known_Hosts

Я некоторое время пытался сделать это в Python на Jupyterhub, но ответ @Michael оказался действительно полезным!

Давайте внесем ясность – по замыслу этот шаг для подтверждения известного хоста НЕ должен быть автоматизирован, учитывая подверженность атакам «человек посередине» (дополнительная информация здесь, но должно быть очевидно, почему это вызывает беспокойство).

Ручная проверка SSH RSA Fingerprint для GitHub.com с помощью Python и Bash

Небезопасный обходной путь -o «StrictHostKeyChecking no» был удобен для тестирования, но рад иметь альтернативу.

  • Обратите внимание, я использую ! нажмите в Jupyter, чтобы вызвать команду bash для ssh-keyscan и cat
# MANUALLY GET TRUSTED RSA FINGERPRINT FOR GITHUB
# https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints

rsa_pubkey_fingerprint = 'SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8'

# Get the host rsa info for github, write to a file
# pipe to get the RSA FingerPrint, and finally write that fingerprint to file

!ssh-keyscan -t rsa github.com | tee ./github_ssh_test | ssh-keygen -lf - >> ./fingerprint_rsa

Утвердить совпадение отпечатков пальцев для подтверждения известных хостов

Теперь вы можете использовать утверждение python, чтобы убедиться в подлинности нашего доверенный отпечаток RSA против отпечатка RSA, отсканированного через ваш Интернет:

assert(rsa_pubkey_fingerprint == open("./fingerprint_rsa", "r").read().split()[1])

# if the assertion passes and the trusted matches the scanned
# it'll write to your known_hosts file!

!cat ./github_ssh_test >> $HOME/.ssh/known_hosts

# you are now good to test your SSH connection
!ssh -T git@github.com

Спасибо и гораздо лучший обходной путь для игнорирования строгой проверки!

1
ответ дан 1 April 2021 в 23:13

Теги

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