为什么名为“user”的用户的公钥可以用于名为“git”的用户的远程 Git 存储库?

为什么名为“user”的用户的公钥可以用于名为“git”的用户的远程 Git 存储库?

解决了 !

一些小事情导致了这种情况

  1. 我最初的误解是 ssh 密钥是特定于用户的
  2. 在我的测试中,有两件事导致了难以理解的结果:
    • 我发现我的 ssh 密码对于一个密钥不正确,但对于另一个密钥却有效(使用“$ssh-keygen -y”检查)
    • 在命令行上,ssh 需要 -i 而不是 -I 来指定密钥(呃)
  3. 我的配置文件如建议的那样。

谢谢大家的帮助,非常感谢。


我正在使用 SSH 身份验证在本地网络上设置 Git 存储库。我按照官方 Git 网站上的说明进行操作:“服务器上的 Git - 设置服务器

尝试找到一些背景知识以了解它应该如何工作以及为什么此设置不起作用。

我在用户工作站端运行Linux Mint 20,在Git服务器端运行CentOS 7.1。

我可以使用公钥认证user从 到my-workstationSSH 。gitserver

将 SSH 密钥复制usermy-workstationGit 用户.ssh目录gitserver

root@gitserver/srv # ls -l  
drwxrwx---. 7 git  git  4.0K 06/01/21 08:35 git
root@gitserver/srv # ls -ld git/.ssh/
drwx------. 2 git git 28 Jan  3 12:12 git/.ssh/
root@gitserver/srv # ls -l git/.ssh/
-rw-------. 1 git git 1.8K 03/01/21 21:45 authorized_keys

git当 SSH 认为我是使用以下命令的用户时,它将如何工作:

git remote add origin git@gitserver:/srv/git/project.git

我不明白 SSH 密钥如何user允许用户进行 ssh 身份验证git

存储库的权限gitserver适用于用户,git而不是用户“user”。

我正在使用一个配置文件进行正常的 SSH 访问,它确实有效,也许这就是问题所在?

User alan
IdentityFile /home/alan/.ssh/my-workstation_alan-id_ed25519
IdentityFile /home/alan/.ssh/my-workstation_alan-id_rsa
IdentitiesOnly yes
Host gitserver
HostName GitserverIpAddress

这适用于正常的“非 git”访问:

$ ssh gitserver

更新:

在调查配置文件时,又出现了一些问题:

  1. git用户工作站上没有用户或组。在这种情况下没有.ssh/config文件,我假设命令“$ git push origin master”以发出命令的用户身份访问 SSH 系统?
  2. 传统意义上的权限重要吗?我认为,当存储库仅允许用户和组访问时,命令$ git push origin master可以访问 Git 服务器上的存储库git

测试:

  1. 尽管最初出现错误消息,但首次连接仍然成功

用户@myworkstation〜/文件/ git /测试$ ssh -I user-id_ed25519 用户@gitserver

dlopen user-id_ed25519 失败:user-id_ed25519:无法打开共享对象文件:没有此文件或目录

输入密钥“/home/user/.ssh/user-id_ed25519”的密码:

上次登录:2021 年 1 月 12 日星期二 09:15:17 来自 aa.bb.cc.dd

用户@gitserver:$退出

登出

与 aa.bb.cc.dd 的连接已关闭。

  1. 第二次连接没有

用户@myworkstation〜/文件/ git /测试$ ssh -I user-id_ed25519 git@gitserver

dlopen user-id_ed25519 失败:user-id_ed25519:无法打开共享对象文件:没有此文件或目录

[电子邮件保护]:权限被拒绝(公钥)。

用户@myworkstation〜/文件/ git /测试$

答案1

首先,让我们解决一个根本性的误解: ssh钥匙是不是无论是从客户端还是服务器的角度来看,它都不是特定于用户的。无论公钥末尾的注释可能暗示什么,这都是正确的,注释通常包含生成密钥的用户的用户名。唯一重要的是您是否拥有与服务器接受的公钥相对应的私钥(例如在文件中authorized_keys)。

打个比方,想象一下现实世界中的门和钥匙。你可以有一把实体钥匙(类似于ssh 私人的您可以使用这把钥匙打开多扇门,门上的锁也可以接受这把钥匙。您甚至可以将这把实体钥匙借给朋友,他们可以打开这扇门,尽管这是更糟计算机安全领域的想法比现实世界中的想法更有意义。

然后完成类比:

  • 现实世界中的物理密钥 ==ssh私钥(例如id_rsaid_ed25519
  • 现实世界的门 ==ssh服务器
  • 现实世界的门锁==authorized_keys包含一个或多个民众键(例如 的内容id_rsa.pub

我们可以继续类比:您可以复制您的真实世界密钥,就像您可以复制您的私钥一样,但这与您的问题无关。

就你的情况而言,你有一个 git 服务器gitserver。你可以ssh以用户身份访问该服务器user,也可以使用已将相应公钥安装到该远程用户文件中的alan任何私钥。ssh~/.ssh/authorized_keys

现在回到您的实际问题,有几个可能的错误来源:

  1. 您提供的配置文件片段看起来很奇怪,该文件中可能存在错误。一般来说,文件中的条目~/.ssh/config如下所示:

     Host remote
       HostName remote.example.com
       User alan
    

    虽然缩进是可选的,但大多数用户对不同的主机都有多个条目,每个条目都是一个单独的块。您还可以使用通配符来应用于多个主机,甚至所有主机,如下所示:

     Host *
       IdentityFile /home/alan/.ssh/my-workstation_alan-id_rsa
    

    请注意,配置文件的规范和解析发生在“第一个答案获胜“模型 - 也就是说,您需要在结尾您的文件否则事情会变得复杂并且可能无法工作。

  2. 当您说“这不起作用”时,我认为我们还没有足够的信息。如果您尝试执行如下操作:

     ssh git@gitserver
    

    这可能不会像您直观预期的那样工作(即为您提供一个交互式 shell),因为 git 服务器软件为用户设置了git不同gitserver的 shell。查找/etc/password用户的 shell git- 可能是类似git-shell或 的内容gitaly。当您尝试简单地 时ssh gitserver,您隐式地要求获取一个交互式 shell,而常见的 git 服务器 shell(例如git-shell)不会这样做。

建议您查看您的配置,尝试一些方法,然后更新您的问题或发布更多详细信息的其他评论。如果需要,我会修改我的答案。

相关内容