Git продолжает использовать мой файл «known_hosts» при каждом нажатии

Я создал локальный репозиторий git, который хочу разместить как на Github, так и на Amazon CodeCommit.

Я установил два пульта ДУ и назвал их соответственно:

git remote add github [email protected]:mygit/myrepo.git

а также

git remote add codecommit ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/myrepo

Репозиторий Github работает нормально. Репозиторий CodeCommit работает, но каждый раз, когда я запускаю push с:

git push -u codecommit master

он добавляет в мой файл '~ / .ssh / known_hosts' при каждом нажатии. Если я продолжу, в моем файле «known_hosts» будет миллион записей.

Единственное различие, которое я вижу, - это форматирование удаленной ссылки CodeCommit, которое немного отличается от формата Github, как показано выше. Когда вы создаете репо на CodeCommit, он предоставляет удаленную ссылку:

git clone ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/myrepo

Поскольку я отправляю локальное репозиторий git на CodeCommit, я удалил часть git clone и заменил ее на:

git remote add codecommit ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/myrepo

CodeCommit также требует, чтобы вы создали файл '~ / .ssh / config' с:

Host git-codecommit.*.amazonaws.com
  User Your-IAM-SSH-Key-ID-Here
  IdentityFile ~/.ssh/Your-Private-Key-File-Name-Here

Я создал этот файл в соответствии с инструкциями.

Кто-нибудь сталкивался с этой проблемой при использовании двух пультов: Github и CodeCommit?


person Community    schedule 07.01.2017    source источник


Ответы (2)


Вероятно, CodeCommit находится за балансировщиком нагрузки, и каждый узел имеет свой собственный ключ хоста SSH. Когда вы попадаете в разные узлы, они предоставляют вам свой собственный ключ хоста, который ваш ssh-клиент кэширует в known_hosts.

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

В ~/.ssh/config просто добавьте пару параметров к уже добавленной записи.

Host git-codecommit.*.amazonaws.com
  User Your-IAM-SSH-Key-ID-Here
  IdentityFile ~/.ssh/Your-Private-Key-File-Name-Here
  UserKnownHostsFile /dev/null
  CheckHostIP no
person Dan Lowe    schedule 07.01.2017
comment
Привет, Дэн, и спасибо за ответ. Я продолжил тестирование и, выполнив более 10 пушей на каждой платформе, обнаружил, что Github делает то же самое. И CodeCommit, и Github извлекали IP-адреса нескольких хостов. Я не совсем уверен, откуда они. Я могу с уверенностью сказать, что как только все эти IP-адреса хоста будут зарегистрированы, он перестанет добавлять их в мои ~ / .ssh / known_hosts. Раньше я действительно думал, что он собирает IP-адреса из здания, в котором я нахожусь, но я думаю, что ошибался. Еще раз спасибо и хороших выходных. - person ; 08.01.2017

Я не рекомендую добавлять UserKnownHostsFile /dev/null в вашу конфигурацию SSH. Он останавливает кеширование хостов, но по-прежнему требует, чтобы вы каждый раз принимали неизвестный хост. И если вы используете какой-то клиент git, например SourceTree, это будет автоматически принято. В конце концов, вы больше не проверяете, к кому вы подключаетесь, что является недостатком безопасности! Поскольку вы все еще используете аутентификацию с открытым ключом, подделать конечный хост сложно, но возможно.

@Dan Lowe правильно, что он находится за балансировщиком нагрузки, и вы будете перенаправлены на разные IP-адреса каждый раз, когда вы соединять. У меня было то же открытие, что и у вас с сотнями known_hosts, которые все должны были кодировать репозитории, github.com, bitbucket.org, gitlab.com и т. Д. Разница в том, что с коммерческим балансировщиком нагрузки все ключи хоста одинаковы. Убедитесь, что это так в вашем файле known_hosts. github.com имеет такую ​​конфигурацию.

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

Рекомендация (что я сделал)

  1. Следуйте этим инструкциям в ответе serverfault. Это поможет вам правильно выполнить сканирование ssh-ключей и добавить ключи хоста в файл known_hosts. Я рекомендую стереть ваш старый файл known_hosts ($> mv known_hosts known_hosts.bkup && touch known_hosts) и использовать резервную копию только в качестве справочника для того, с чем вы связались в прошлом.

    Примечание. Существуют разные типы host_key_types, но наиболее распространенным / совместимым и рекомендуемым является ssh-rsa по адресу на этот раз

    # known_hosts
    # each entry should have a domain host_key_type host_key
    github.com ssh-rsa AAAAB3NzaC1yc2E...A8VJiS5ap43JXiUFFAaQ==
    git-codecommit.*.amazonaws.com <host_key_type> <host_key>
    # If there is a specific port
    [domain]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbm...FEQVnnyjKaQ=
    
  2. Для будущего обслуживания known_hosts я рекомендую поместить ключи хоста домена из ручной установки на шаге 1 в / etc / ssh / ssh_known_hosts для всех пользователей. Таким образом, эти ключи хоста не будут скрыты в вашем согласии с тем, что «Подлинность хоста не может быть установлена. Вы уверены, что хотите продолжить соединение?» перечислите, когда будете одитировать себя в следующий раз. Защитите эти ручные проверки с помощью:

    # This prevents tampering unless someone has root access to your system
    $> chmod 444 /etc/ssh/ssh_known_hosts
    $> sudo chown root:wheel /etc/ssh/ssh_known_hosts
    
    # leave your ~/.ssh/known_hosts as writable by you so that you may accept other SSH host keys in the future, unless you want to prevent this and only allow manual host verification
    $> ls -l ~/.ssh/known_hosts
    # -rw------- 1 username  staff  0  date  /home/username/.ssh/known_hosts
    
  3. Добавьте CheckHostIP no в свой ~/.ssh/config только для тех ключей хоста на уровне домена с известными балансировщиками нагрузки, которые вы добавили. Я НЕ рекомендую устанавливать это для Host * (все).

    Host git-codecommit.*.amazonaws.com
      User Your-IAM-SSH-Key-ID-Here
      IdentityFile ~/.ssh/Your-Private-Key-File-Name-Here
      CheckHostIP no
    
  4. Если вы этого не сделали, я бы также сделал вашу конфигурацию SSH доступной только для чтения с помощью chmod 440 ~/.ssh/config

К вашему сведению

Если у вас есть дополнительные хосты (обычно локальные) в вашей сети, к которым вы регулярно используете ssh, используйте эту возможность, чтобы также установить их ключи хоста. В /etc/ssh/ssh_known_hosts вы можете установить домен и конкретный IP-адрес (& порт) для хоста. Конкретный IP-адрес работает только в том случае, если в таблице маршрутизации локальной сети настроено резервирование адреса DHCP.

# LAN domain = <computer_name>.local or <computer_name>.<lan_domain>
computer_name.local,10.0.0.3 ssh-rsa AAAAB3NzaC1yc2EAAA...FVBoGqzHM9yXw==
[computer_name.local]:2222,[10.0.0.3]:2222 ssh-rsa AAAAB3NzaC1yc2EAAA...FVBoGqzHM9yXw==
person codejedi365    schedule 06.06.2020