我已经设置了自己的私人git服务器,并拥有一个由5名成员组成的团队。我有他们的用户帐户所有设置,但我如何防止随机奇怪的帐户提交遥控器。因为我的一些团队也使用github并且不希望他们的用户名出现在日志中,而是他们的用户名我分配它们。
为了防止人们使用“随机怪异帐户”进行提交,您可以设置一个git pre-receive
挂钩,以根据有效名称列表验证传入提交的提交者/作者名称。但是这不提供身份验证组件。
为了防止模仿,您可以简单地要求所有提交都是gpg签名(git commit -S ...
),并且让pre-receive
钩子验证服务器上的gpg密钥环的签名。
根据人们连接到远程服务器的方式,如果您有权访问,则还可以将提交者/作者名称与用于连接的用户名明确匹配。
更新1
如果您的提交者通过ssh推送到您的服务器,那么上面的第三个选项可能是最简单的。在.ssh/authorized_keys
文件中,为标识用户的每个键设置一个环境变量:
environment="SSH_USER=lars" ssh-rsa ...
然后在你的pre-receive
钩子中,你可以使用该环境变量来查找某些表的有效提交者名称/电子邮件。你可以在pre-receive
手册页中阅读有关githooks(5)
钩子的信息,他们在stdin上收到以下形式的行:
<oldrev> <newrev> <refname>
您可以从<newrev>
获取提交名称,如下所示:
commiter_name=$(git show -s --format='format:%cn' <newrev>)
和邮件使用%ce
而不是%cn
。
更新2
或者,就是忘记查表。在你的.ssh/authorized_keys
文件中:
environment="ALLOWED_NAME=Bob Jones",environment="[email protected]" ssh-rsa ...
然后在你的预接收挂钩:
#!/bin/sh
while read oldrev newrev refname; do
cn=$(git show -s --format='format:%cn' $newrev)
ce=$(git show -s --format='format:%ce' $newrev)
[ "$cn" = "$ALLOWED_NAME" ] || {
echo "*** Inalid committer name"
exit 1
}
[ "$ce" = "$ALLOWED_EMAIL" ] || {
echo "*** Inalid committer email"
exit 1
}
done
而且我认为你有你想要的东西。
更新3
您可以使用http身份验证完成类似的操作,因为在pre-receive
脚本中,您可以访问REMOTE_USER
环境变量,该变量包含经过身份验证的远程用户的名称。您可能需要使用某种表查找来获取已批准的名称和电子邮件地址的值。