什么是让用户的Apache从同一台机器上进行SSH克隆的干净而安全的方法?

我有一个Apache服务器,将承载几个网站和一个私人的networking接口,旨在自动从一个git的SSHurl部署网站。 那些git repos在同一台机器上,由本地Gitlab实例持有,并由root拥有,所以需要SSH(或者我缺less一些东西)。

因此,我们将PHP运行的shell命令作为www-data从同一台计算机上的根受保护仓库克隆可公开访问的网站。

如果重要的话, mod_vhost_alias使用mod_vhost_alias进行pipe理。 我也知道cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

但是为www数据生成ssh密钥似乎不是一个好主意。

如果我为此创build专门的“web”用户并为其生成ssh密钥,那么www-data无法在该目录中克隆。 我可以在文件夹上使用ACL,但是仍然没有得到它的ssh访问权限

或者,也许我应该先用PHP的su web ? 在这种情况下,文件不会被www-data所拥有,这可能导致网站无法工作。

这就到了我失去了什么是好的,什么是安全的地步。 我终于可以find一个工作解决scheme,但它不会干净,可能不会安全。

附加信息 :

  • 这不是一个生产服务器。 所有的网站(一次10个左右)的stream量将非常有限,无论如何,我们大部分网站都会受到密码保护(我上面提到“可公开访问”以涵盖最极端的情况)。

  • 开发是在本地环境中进行的,使用git挂钩将更改推送到在线版本。

  • 只有一个Web界面可以启动部署过程。 只有less数信任的用户可以访问它。

  • 部署将不会更改Apacheconfiguration,因为mod_vhost_alias将处理虚拟主机,不需要其他任何东西。

  • 所有的网站将有一个公共文件夹,其余的文件将无法访问。 部署脚本在部署时已经写好,可以轻松用于此目的。

  • 中期部署问题不需要解决。

不要混合开发和生产。 理想情况下,生产服务器不包含VCS – 或任何其他开发工具链的痕迹。 由于您现在正在努力部署的自动化,请在您处于分立状态时加大分隔。

除此之外:单独的权限单独的任务。 pipe理界面请求部署。 Web服务器提供大多数不可变的文件。 部署脚本写入文件。

  1. 提供文件的用户不能写入(几乎任何)文件。
  2. 部署Apache的站点的用户应该设置这样的权限,避免文件的中间部署服务(开发人员可能没有想到Apache访问任何东西的副作用,而应用程序不是完全复制)
  3. 部署这些文件的用户应该拥有对git的只读权限,并且只能部署已提交和已标记的版本(并且以开发人员已经完成的类似方式进行签出)
  4. 一个PHP的Web界面不应该处理任何邪恶的魔法。 以任何方式将网站标记为“需要部署”(创build文件夹等)并完成它(不要在Web界面中asynchronous部署)
  5. 部署脚本应该不知道它正在部署的应用程序超出了一些通用的标准(“apache的文件在文件夹X中”,“tmp文件夹应该放在Y的名字下面)”

我如何在一个明显相似的设置中完成它:一个脚本,由用户deploy (组www-data )拥有和cron执行。 用户deploy有一个只读帐户的SSH密钥的git服务器(在你的情况下,通过gitlabpipe理)。 脚本获取已标记和部署的存储库名称,如下所示:

  1. 检查最后部署是否干净
  2. 检查是否需要部署任何站点
  3. 拆除(停止服务器半服务器网站)
  4. 如果需要的话可以得到一个克隆(在你的情况下,在git上只读用户)
  5. 结帐新版本(理智:最新的标签匹配一些合理的正则expression式)
  6. 设置(复制文件到webroot,在当前, 不可取的情况下,这是一个本地文件夹,chown到万维网数据)
  7. 删除标记“需要部署”为这个网站
  8. 将部署标记为成功