3

我创建了一个本地 git 存储库,我想将它推送到 Github 和 Amazon 的 CodeCommit。

我设置了两个遥控器并相应地命名它们:

git remote add github git@github.com:mygit/myrepo.git

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

Github 存储库工作正常。CodeCommit 存储库有效,但每次我运行推送时:

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?

4

2 回答 2

4

可能是 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
于 2017-01-07T16:52:48.467 回答
0

我不建议添加UserKnownHostsFile /dev/null到您的 SSH 配置中。它确实停止了主机的缓存,但仍然需要您每次都接受未知主机。如果你使用一些像 SourceTree 这样的 git 客户端,它会自动接受。 归根结底,您不再实际检查您正在连接的是谁,这是一个安全漏洞! 由于您仍在使用公钥身份验证,因此很难伪造终端主机,但并非不可能。

@Dan Lowe是正确的,它位于负载均衡器后面,每次连接时您都会被重定向到不同的 IP 地址。我发现与您对数百个 known_hosts 的发现相同,它们都用于编码存储库、github.com、bitbucket.org、gitlab.com 等。不同之处在于商业负载均衡器的主机密钥都是相同的。检查您的 known_hosts 文件是否属于这种情况。github.com 有这个配置。

这意味着您可以设置主机密钥以匹配域,同时忽略不断变化的 IP 地址。HostKeyChecking 仍将进行,您将预先批准有效密钥,因此您不会每次都接受未知主机。

推荐(我做了什么)

  1. 请按照有关此服务器故障答案的这些说明进行操作。它将帮助您正确地 ssh-keyscan 并将主机密钥添加到 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/configHost *建议为(全部)设置此设置。

    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 地址(和端口)。仅当您在 LAN 路由表中设置了 DHCP 地址保留时,特定 ip 才有效。

# 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==
于 2020-06-06T18:17:09.760 回答