Я хочу клонировать репо неинтерактивным способом. При клонировании git просит подтвердить отпечаток хоста:
The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? no
Как мне заставить «да» каждый раз, когда появляется этот вопрос? Я пробовал использовать yes yes | git clone ...
, но это не работает.
РЕДАКТИРОВАТЬ: Вот решение: Могу ли я автоматически добавлять новый хост в known_hosts? (добавляет элементы в known_hosts с помощью ssh-keyscan).
Ни "StrictHostKeyChecking no", ни "ssh-keyscan" не являются безопасными. ты необходимость ручная проверка отпечатка пальца в какой-то момент, чтобы избежать атаки MiTM, если вы придерживаетесь ssh.
На самом деле у вас есть 2 варианта:
Он не будет запрашивать у вас отпечаток пальца, потому что ssh не задействован, вместо этого используется https. С точки зрения безопасности вы доверяете корневым сертификатам, установленным в вашей ОС. Если вы используете минималистичный образ или Docker, вам может потребоваться установить пакет ca-сертификатов.
Вам действительно нужно добавить ключ во время выполнения? Это небезопасно, потому что вы не проверили отпечаток пальца, и это оставляет вас уязвимым для атак MiTM. Это не только теоретически, и это доказало свою эффективность.
Перед запуском вашего скрипта получите ключ из github (на вашем локальном компьютере):
ssh-keyscan github.com >> githubKey
Создайте отпечаток пальца:
ssh-keygen -lf githubKey
И проверьте это вручную против перечисленных на этой странице (хорошо, вы доверяете сертификатам https и OpenSSL, чтобы предоставить вам исходный веб-сайт github, но это все равно намного лучше, чем слепое принятие открытого ключа).
Затем вы жестко закодируете его в своем скрипте, добавив в него:
echo '<copy paste the content of 'cat githubKey' on your machine>' >> ~/.ssh/known_hosts
перед клоном git.
Открытый ключ GitHub изменится, только если они сочтут его взломанным (или недостаточно безопасным). Если это когда-либо так, вы хотеть ваш сценарий все равно не сработает.
Не думаю, что это лучшее решение, но это было решение для меня.
ОТВЕТ:
Добавление доменных имен в known_hosts
файл с помощью ssh-keyscan
команда решила проблему:
ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts
Добавление ключа к .ssh/known_hosts
кажется, это правильный поступок.
Хотя, когда вы автоматизируете задачу, вы хотите убедиться, что ключ еще не содержится и не добавлен на каждом clone
/pull
задачи.
Этот фрагмент добавит отпечаток пальца, только если он еще не найден:
if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi
Я считаю, что лучший вариант - создать резервную копию и очистить ~/.ssh/known_hosts
файл, вручную выполните SSH-соединение, проверив IP-адрес и отпечаток пальца, mv ~/.ssh/known_hosts ~/bitbucket_hosts
, затем используйте содержимое ~/bitbucket_hosts
в вашем скрипте, чтобы автоматически добавлять известные отпечатки пальцев в файл known_hosts (не забудьте восстановить исходный ~/.ssh/known_hosts
).
Этот шаг нужно выполнить только один раз (я полагаю, на любой машине), и как только у вас появятся отпечатки пальцев, вы можете включить их в свой сценарий автоматизации.
Хотя я, конечно, понимаю, что вы хотите автоматизировать такой процесс, делать это было бы неразумно. Причина, по которой SSH и связанные с ним сетевые подкомпоненты отказываются использовать безопасный протокол, состоит в том, чтобы ПРЕДУПРЕЖДЕНИЕ человека о том, что открытый ключ системы неизвестен. Это сделано намеренно - пользователь должен явно сообщить системе, какой хост ожидается. Вы бы не захотели автоматически принимать каждый предоставленный вам открытый ключ или часть безопасности в SSH или TLS / SSL может быть скомпрометирована. Одним из примеров является атака «человек посередине», например, когда программа-прокси представляет свой собственный ключ вместо ожидаемого хоста.
Действовать с осторожностью.
Если у вас нет опасений по поводу источника кода, передаваемого по сети, вы должны явно и исключительно использовать протокол git: // при клонировании - он без аутентификации и в виде открытого текста.
Как сказал Джефф Холл, это опасно, поскольку позволяет незаметно атаковать «злоумышленник в середине». Однако вы можете использовать StrictHostKeyChecking no
вариант в ssh, чтобы отключить проверку ключей хоста. Однако на вашем месте я был бы очень осторожен с этим вариантом.