Git 为每次推送继续构建我的 'known_hosts' 文件
Git Keeps Building on my 'known_hosts' File For Every Push
我创建了一个本地 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 远程 link 上的格式,它与 Github 格式略有不同,如上所示。当您在 CodeCommit 上创建存储库时,它会提供一个远程 link:
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?
可能是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
我不建议将 UserKnownHostsFile /dev/null
添加到您的 SSH 配置。它确实停止了主机缓存,但仍然需要您每次都接受未知主机。如果您使用某些 git 客户端,如 SourceTree,这将自动接受。 归根结底,你不再真正检查你正在连接的是谁,这是一个安全漏洞! 由于你仍在使用 Public 密钥身份验证,因此很难伪造最终主机但并非不可能。
@Dan Lowe 是正确的,它在负载平衡器后面,每次连接时您都会被重定向到不同的 IP 地址。我和你对数百个 known_hosts 的发现有相同的发现,它们都是代码存储库,github.com、bitbucket.org、gitlab.com 等。不同之处在于商业负载平衡器主机密钥都是一样的。检查您的 known_hosts 文件是否属于这种情况。 github.com有这个配置。
这意味着您可以设置主机密钥以匹配域,同时忽略不断变化的 IP 地址。 HostKeyChecking 仍会进行,您将预先批准有效密钥,因此您不会每次都接受未知主机。
推荐(我做的)
按照有关此 serverfault 答案的说明进行操作。它将帮助您正确地进行 ssh-keyscan 并将主机密钥添加到 known_hosts 文件。我建议清除您的旧 known_hosts 文件 ($> mv known_hosts known_hosts.bkup && touch known_hosts
),并且仅将备份用作您过去连接的内容的参考。
注意:host_key_types有不同的类型但是目前最多的common/compatible和recommended是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=
为了 known_hosts 的未来维护,我建议将步骤 1 中手动安装的域主机密钥放入 /etc/ssh/ssh_known_hosts 供所有用户使用。这样,当您下次审核自己时,这些主机密钥就不会隐藏在您接受 "The authenticity of host can't be established. Are you sure you want to continue to connect?" 列表中。使用以下方式保护这些手动验证:
# 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
将 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
如果你还没有,我也会使用 chmod 440 ~/.ssh/config
将你的 SSH 配置设为只读
仅供参考
如果您的网络上有其他主机(通常是本地主机)您经常使用 ssh 访问,也可以利用这个机会设置它们的主机密钥。在 /etc/ssh/ssh_known_hosts
中,您可以为主机设置域名和特定 IP 地址(& 端口)。仅当您在 LAN 路由中设置了 DHCP 地址预留时,特定 ip 才有效 table.
# 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==
我创建了一个本地 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 远程 link 上的格式,它与 Github 格式略有不同,如上所示。当您在 CodeCommit 上创建存储库时,它会提供一个远程 link:
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?
可能是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
我不建议将 UserKnownHostsFile /dev/null
添加到您的 SSH 配置。它确实停止了主机缓存,但仍然需要您每次都接受未知主机。如果您使用某些 git 客户端,如 SourceTree,这将自动接受。 归根结底,你不再真正检查你正在连接的是谁,这是一个安全漏洞! 由于你仍在使用 Public 密钥身份验证,因此很难伪造最终主机但并非不可能。
@Dan Lowe 是正确的,它在负载平衡器后面,每次连接时您都会被重定向到不同的 IP 地址。我和你对数百个 known_hosts 的发现有相同的发现,它们都是代码存储库,github.com、bitbucket.org、gitlab.com 等。不同之处在于商业负载平衡器主机密钥都是一样的。检查您的 known_hosts 文件是否属于这种情况。 github.com有这个配置。
这意味着您可以设置主机密钥以匹配域,同时忽略不断变化的 IP 地址。 HostKeyChecking 仍会进行,您将预先批准有效密钥,因此您不会每次都接受未知主机。
推荐(我做的)
按照有关此 serverfault 答案的说明进行操作。它将帮助您正确地进行 ssh-keyscan 并将主机密钥添加到 known_hosts 文件。我建议清除您的旧 known_hosts 文件 (
$> mv known_hosts known_hosts.bkup && touch known_hosts
),并且仅将备份用作您过去连接的内容的参考。注意:host_key_types有不同的类型但是目前最多的common/compatible和recommended是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=
为了 known_hosts 的未来维护,我建议将步骤 1 中手动安装的域主机密钥放入 /etc/ssh/ssh_known_hosts 供所有用户使用。这样,当您下次审核自己时,这些主机密钥就不会隐藏在您接受 "The authenticity of host can't be established. Are you sure you want to continue to connect?" 列表中。使用以下方式保护这些手动验证:
# 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
将
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
如果你还没有,我也会使用
chmod 440 ~/.ssh/config
将你的 SSH 配置设为只读
仅供参考
如果您的网络上有其他主机(通常是本地主机)您经常使用 ssh 访问,也可以利用这个机会设置它们的主机密钥。在 /etc/ssh/ssh_known_hosts
中,您可以为主机设置域名和特定 IP 地址(& 端口)。仅当您在 LAN 路由中设置了 DHCP 地址预留时,特定 ip 才有效 table.
# 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==