Как я могу добавить ключ хоста в SSH known_hosts
файл?
Я настраиваю машину для разработки и хочу (например) запретить git
выводить запрос, когда я клонирую репозиторий из github. com
с использованием SSH.
Я знаю, что могу использовать StrictHostKeyChecking = no
(например, этот ответ ), но это небезопасно.
Пока что я ' мы нашли ...
GitHub публикует их отпечатки ключей SSH по адресу https://help.github.com/articles/github-s-ssh-key-fingerprints/
Я могу использовать ssh -keyscan
, чтобы получить ключ хоста для github.com
.
Как мне объединить эти факты? Учитывая заранее составленный список отпечатков пальцев, как мне проверить, что вывод ssh-keyscan
может быть добавлен в файл known_hosts
?
Думаю, я спрашиваю следующее:
Как мне получить отпечаток ключа, возвращенный ssh-keyscan
?
Предположим, что я уже был MITM-ed для SSH, но я могу доверять странице HTTPS на GitHub (потому что у нее есть действующая цепочка сертификатов).
Это означает, что у меня есть некоторые (подозрительные) ключи хоста SSH (из ssh-keyscan
) и некоторые (доверенные) ключевые отпечатки пальцев. Как мне сравнить одно с другим?
Связано: как мне хэшировать хост-часть вывода из ssh-keyscan
? Или я могу смешивать хешированные / нехешированные хосты в known_hosts
?
Самая важная часть «безопасного» добавления ключа в файл 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
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
отключено.
Вы можете смешивать хэшированные/нехэшированные записи в вашем файле known_hosts.
Так что если вы хотите добавить ключ github, вы можете просто сделать :
ssh-keyscan github.com >> ~/.ssh/known_hosts
Если вы хотите, чтобы он был хэширован, добавьте -H
ssh-keyscan -H github. com >> ~/.ssh/known_hosts
Самый простой способ - это вручную получить ключи, используя 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)
и добавить их в свой скрипт, который будет нести в себе "авторитетный" открытый ключ.
.Я написал простой скрипт (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"
Я некоторое время пытался сделать это в Python на Jupyterhub, но ответ @Michael оказался действительно полезным!
Давайте внесем ясность – по замыслу этот шаг для подтверждения известного хоста НЕ должен быть автоматизирован, учитывая подверженность атакам «человек посередине» (дополнительная информация здесь, но должно быть очевидно, почему это вызывает беспокойство).
Небезопасный обходной путь -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
Спасибо и гораздо лучший обходной путь для игнорирования строгой проверки!