我有一个开发的git服务器,部署到一个活的服务器,当分支被推送到。 每个用户都有自己的login,因此实时部署的post-receive hook是在自己的用户下运行的。
因为我不想把用户公钥作为远程活动服务器上的授权密钥来维护,所以我组成了一组'属于git系统的密钥,以便添加到远程活动服务器中(在post-receive hook我正在使用$GIT_SSH设置私钥与-i选项)。
我的问题是,因为所有的用户可能想要部署到现场,git系统的私钥至less必须是可读的,SSH真的不喜欢这个。
这是一个错误的例子:
XXXX@XXXX /srv/git/identity % ssh -i id_rsa XXXXX@XXXXX @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0640 for 'id_rsa' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. bad permissions: ignore key: id_rsa
我环顾四周期待find一些迫使ssh只能通过连接的方式,但除了一些用户之外,我什么也没有发现,只是一味的说,你不应该允许访问任何东西。
这是一个很好的简单和安全的方法。
为ssh传输创build一个新用户,我将其称为git-sync。 在服务器上用git存储库的组成员身份创build一个类似的用户。 将sync-user的公钥添加到该用户的authorized_keys2文件中。 我假设git用户都是gitgroup的成员。 确保git-sync用户也是这个组的成员。
现在编辑你的/ etc / sudoers文件来包含一行:
%gitgroup ALL=(git-sync) NOPASSWD: /usr/bin/git
这将允许gitgroup组的任何成员运行命令/ usr / bin / bit作为git-sync没有密码。
现在把这样的东西放在你的post-receive钩子里:
sudo -u git-sync /usr/bin/git push origin
您可以使用组可读身份文件,除非您是密钥的所有者。 所以,只要将身份文件设置为由root用户拥有,然后您的所有git存储库用户都将被设置为去。
这样做的好处是你不需要sudo – 解决scheme将会更简单。
请注意,如果您使用root来推送到您的git仓库,这将再次遇到原来的问题。
Permissions 0640 for 'id_rsa' are too open.
私钥必须保持私密。 你不应该让任何人阅读它。
因为我不想把用户公钥作为远程活动服务器上的授权密钥来维护,所以我组成了一组'属于git系统的密钥,以便添加到远程活动服务器中(在
post-receivehook我正在使用$GIT_SSH设置私钥与-i选项)。
在post-receive钩子脚本中,尝试如下所示:
if [ "live" == "$branch" ]; then ssh -t user@prod "git --work-tree=... --git-dir=... checkout -f" fi