如何使用 webhook 安全地触发 git 拉取?

How to securely trigger a git pull using a webhook?

我已经设置了一个 github webhook 来与我的网络服务器 api 通信(服务器是 apache2)。我使用负载加密安全地检查 github 秘密,如他们的帮助页面上所指定。

在 Web 应用程序的存储库上完成推送到 master 后,将通过 <?php exec 触发脚本 (deploy.sh)。如果我以 root 身份手动触发此脚本,一切就完美了。当然,正常情况下触发脚本的用户是 www-data.

我的问题是 www-data 对新存储库进行 git 拉取的最佳做法是什么?我基本上放弃了执行 exec sudo,但也许就是这样。在使 www-data 触发 git 拉动时,我面临的众多问题之一是 ~/.ssh/id_rsa 文件仅为 root 设置(在 [= 上构建服务器映像时26=]).它是一个只读的 ssh 密钥。

这是一个遗留应用程序,所以真正让我担心的是,通过某些 php 漏洞利用,有人可以在不成为 github 的情况下执行 exec。然后从那里升级以获得对存储库的读取权限或更糟糕的东西。

真正的问题是,使用 webhook 更新 Web 应用程序的最佳做法是什么

解决方案是允许 www-data sudo 部署命令:

echo 'www-data ALL=(ALL) NOPASSWD: /var/my-cool-scripts/deploy.sh' | sudo EDITOR='tee -a' visudo

在 php 上:

exec('sudo -n /var/my-cool-scripts/deploy.sh')

PS:实际上使用了这个巧妙的技巧来知道执行没问题

$did_the_script_run_okay = exec('sudo -n /var/my-cool-scripts/deploy.sh') == "okay" || false;

deploy.sh的最后一行:

echo "okay"

exec 命令returns 命令回显的最后一行,所以我检查以确保完整执行