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

20

Как можно безопасно добавить ключ хоста в known_hostsфайл SSH ?

Я настраиваю машину для разработки и хочу (например) запретить 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?

Роджер Липскомб
источник
Почему это не будет безопасно для вашего варианта использования?
quadruplebucky
StrictHostKeyChecking=noуязвим для MITM. ssh-keyscanЗащищен ли он от MITM?
Роджер Липскомб
Я не понимаю, почему я слишком волнуюсь из-за того, что кто-то выдает себя за незнакомца, которого я никогда не встречал, и которому я достаточно доверяю, чтобы написать код, который я собираюсь загрузить и запустить ...
quadruplebucky
1
Потому что это мой исходный код в частном репозитории на github, и я не хочу, чтобы MITM (например) вводил злонамеренные изменения, когда я нажимаю коммиты. Это только один пример.
Роджер Липскомб
Я (к лучшему или к худшему) предпочитаю доверять github. Я не хочу доверять каждой случайной сетевой ссылке между мной и ними.
Роджер Липскомб

Ответы:

12

Самая важная часть «безопасного» добавления ключа в 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

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

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

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

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

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

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

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

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

Сделав это, изучите содержимое вашего github-key-tempфайла и создайте скрипт для добавления этого содержимого в ваш известный файл hosts.

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отключены.

Майкл
источник
17

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

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

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

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

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

маленький
источник
1
В чем разница между хэшированным / не хэшированным? Я знаю, что такое хеширование, но не знаю, почему оно применяется в этом контексте.
Глен Томас
3
Хэширование ваших записей позволяет скрыть информацию о хостах, к которым вы подключаетесь. Проверьте обслуживаемого ответ на security.stackexchange.com/questions/56268/...
Wee
4
Это не отвечает на вопрос. Использование ssh-keyscan зависит от человека, находящегося в середине атаки, что означает, что ключ, который вы храните, может быть ключом, принадлежащим атакующему, пытающемуся проникнуть в вашу систему. Пожалуйста, смотрите мой ответ для способа проверить вещи.
Майкл
Att. Получение внимания к ответам, которые всегда были неверными - «два главных ответа на самом деле небезопасны»
Питер Мортенсен
6

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

$ 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)

И добавьте их в свой скрипт, который затем будет содержать «авторитетный» открытый ключ.

Jakuje
источник
У меня есть ключи, как вы сказали, как мне «добавить их в мой сценарий»?
Глен Томас,
Либо в виде отдельного файла, либо в виде строки в вашем скрипте.
Jakuje
Этот ответ опасен, потому что скрыто в «проверить их вручную» это целый сложный процесс. Ниже я добавил ответ, который пытается объяснить, как это сделать и безопасно использовать результаты.
Майкл
Att. Получение внимания к ответам, которые всегда были неверными - «два главных ответа на самом деле небезопасны»
Питер Мортенсен
1
@RogerLipscombe Я согласен, что ответ можно было бы интерпретировать надежно - «проверить их вручную» не объясняется, но если вы понимаете, что это означает «следуя инструкциям на странице руководства ssh», то это, вероятно, будет хорошо. Риск здесь заключается в том, что кто-то может этого не понимать и может, например, попробовать небезопасные вещи, такие как проверка ключа после входа на сервер. Вот почему я назвал этот ответ «опасным», а другой - «небезопасным». Важным моментом является подробность проверки вручную. Спасибо за согласие.
Майкл