检查authorized_keys以查看哪个密钥用于推送提交。

3

假设在Git仓库所在的服务器上的~/.ssh/authorized_keys文件中有一个大型的ssh公钥列表,其一般格式为“ user@mail.com”。

我想为pre-receive挂钩编写bash脚本,以检查是哪个SSH密钥用于推送提交,并在提交被接收之前对其执行某些操作。因此,脚本的大致概述如下...

#!/bin/sh
#
<Check key which was used from authorized_keys for the commit>
<Print email corresponding to the SSH key to a file as a log>
<Do some other stuff here>

但是由于服务器存储公钥,而私钥用于推送提交,是否可以检查使用了哪个密钥?如果可以,如何检查?

如果我漏掉了一些明显的东西,很抱歉,我只需要一些指导来开始。

非常感谢任何帮助。


1
这正是gitolite完成其工作的具体方式,需要一些特定的管道。 - Etan Reisner
谢谢指出。我正在研究gitolite,看起来很有前途。 不过,我仍然认为有一些方法可以使用ssh和bash将提交的密钥与授权密钥进行比较。 - Ankit
@Ankit,“which SSH key was used to do the commit”是什么意思?提交是在客户端完成的,不需要任何SSH密钥。你是想说哪个SSK密钥用于PUSH吗? - Joseph K. Strauss
gitolite通过控制运行的命令来实现这一点,您可能不需要完全按照此方式操作以获得所需结果,但我认为(至少默认情况下)正在运行的shell会话并不知道使用的ssh密钥。 - Etan Reisner
@JosephK.Strauss 是的!很抱歉没有说清楚。提交将在客户端上进行,推送需要使用已被授权的密钥中的SSH密钥。 - Ankit
2个回答

2
您可以编辑您的~/.ssh/authorized_keys文件,以包括与每个密钥相关联的环境变量或自定义命令。
假设您的authorized_keys文件中有以下公钥:
ssh-rsa AAAA.... usera@hosta
ssh-rsa AAAA.... usera@hostb
ssh-rsa AAAA.... userb@hostc

您想要能够获取与每个用户关联的电子邮件。您可以编辑authorized_keys,使其读取如下内容:
environment="EMAIL=usera@example.com" ssh-rsa AAAA.... usera@hosta
environment="EMAIL=usera@example.com" ssh-rsa AAAA.... usera@hostb
environment="EMAIL=userb@example.com" ssh-rsa AAAA.... userb@hostc

现在在您的脚本中,您可以直接访问EMAIL变量:
#!/bin/sh

sendmail "$EMAIL" <<EOF
To: $EMAIL
From: admin@example.com

This is a test message
EOF

请注意,如果您信任用户,此机制应用于方便,而不是用于安全,如果您希望此机制无法被破坏,则需要使用强制命令功能,其中所有访问都通过包装命令进行,该命令仅允许运行特定的Git命令。您可以为此编写自己的包装器,但如果您要选择这条路,只使用 gitolite可能是最好的解决方案。如果您确实想要自己实现这个功能, gitolite有一个页面解释了它是如何工作的

太棒了!这可能有效。这不是为了安全,我正在寻求标准化用户提交到git仓库的提交,因为我们有人使用相同的ssh密钥提交多个电子邮件地址。这应该会有所帮助。 - Ankit

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接