Назад | Перейти на главную страницу

Неинтерактивный git clone (запрос отпечатка ssh)

Я хочу клонировать репо неинтерактивным способом. При клонировании 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 варианта:

Используйте протокол https вместо git

Он не будет запрашивать у вас отпечаток пальца, потому что ssh не задействован, вместо этого используется https. С точки зрения безопасности вы доверяете корневым сертификатам, установленным в вашей ОС. Если вы используете минималистичный образ или Docker, вам может потребоваться установить пакет ca-сертификатов.

Если вам действительно нужен протокол git + ssh

Вам действительно нужно добавить ключ во время выполнения? Это небезопасно, потому что вы не проверили отпечаток пальца, и это оставляет вас уязвимым для атак 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, чтобы отключить проверку ключей хоста. Однако на вашем месте я был бы очень осторожен с этим вариантом.