live
我有一个开发 git 服务器,当分支被推送到时,它会部署到实时服务器。每个用户都有自己的登录名,因此post-receive
执行实时部署的钩子是在他们自己的用户下运行的。
因为我不想必须将用户公钥作为远程实时服务器上的授权密钥来维护,所以我编写了一组“属于”git 系统的密钥来添加到远程实时服务器(在钩子中post-receive
我使用$GIT_SSH
该选项设置私钥-i
)。
我的问题是,由于所有用户可能都想要部署到实时系统,所以 git 系统的私钥必须至少是组可读的,而 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
我四处寻找,希望找到强制 ssh 完成连接的方法,但我什么也没找到,只是人们盲目地说你不应该允许除单个用户之外的任何人访问。
答案1
这是一个简单且安全的方法。
为 ssh 传输创建一个新用户,我将其命名为 git-sync。在服务器上创建一个具有 git 存储库组成员身份的类似用户。将 sync-user 的公钥添加到该用户的 authorized_keys2 文件中。我假设 git 用户都是 gitgroup 的成员。确保 git-sync 用户也是该组的成员。
现在编辑 /etc/sudoers 文件以包含如下行:
%gitgroup ALL=(git-sync) NOPASSWD: /usr/bin/git
这将允许 gitgroup 组的任何成员以 git-sync 身份运行命令 /usr/bin/bit,无需密码。
现在将类似这样的内容放入你的 post-receive 钩子中:
sudo -u git-sync /usr/bin/git push origin
答案2
你能使用组可读身份文件,除非您是密钥的所有者。因此,只需将身份文件设置为由 root 用户拥有,然后所有 git 存储库用户都可以使用。
这样做的一个好处是您不需要 sudo - 解决方案将更简单。
请注意,如果您使用 root 身份推送到 git repo,这将再次遇到原始问题。
答案3
Permissions 0640 for 'id_rsa' are too open.
私钥必须保密。您不应允许任何人读取它。
因为我不想必须将用户公钥作为远程实时服务器上的授权密钥来维护,所以我编写了一组“属于”git 系统的密钥来添加到远程实时服务器(在钩子中
post-receive
我使用$GIT_SSH
该选项设置私钥-i
)。
- 设置密钥对,以便从开发服务器 ssh 到生产服务器
在
post-receive
钩子脚本中,尝试如下操作:if [ "live" == "$branch" ]; then ssh -t user@prod "git --work-tree=... --git-dir=... checkout -f" fi