有什么干净且安全的方法可以让用户 Apache 从同一台机器进行 SSH 克隆?

有什么干净且安全的方法可以让用户 Apache 从同一台机器进行 SSH 克隆?

我有一台 Apache 服务器,它将托管多个网站,还有一个私人 Web 界面,旨在自动从 git SSH URL 部署网站。这些 git 存储库位于同一台机器上,由本地 Gitlab 实例持有并归 root 所有,因此需要 SSH(否则我遗漏了某些东西)。

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

如果这很重要,虚拟主机由 管理mod_vhost_alias。我也知道cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

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

如果我为此创建一个专用的“web”用户并为其生成 ssh 密钥,则 www-data 无法在该目录中克隆。我可以对该文件夹使用 ACL,但它仍然无法获得 ssh 访问权限。

或者我应该su web先使用 PHP 吗?在这种情况下,文件将不属于 www-data,这可能导致网站无法正常工作。

这让我分不清什么是好的,什么是安全的。我最终可以找到一个可行的解决方案,但它不会很干净,也可能不安全。

附加信息 :

  • 这不是生产服务器。所有网站(一次大约 10 个)的流量都非常有限,而且大多数网站都会受到密码保护(我上面说的“公开访问”是为了涵盖最极端的情况)。

  • 在本地环境进行开发,通过 git hooks 将变更推送至线上版本。

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

  • 部署不会改变 Apache 配置,因为mod_vhost_alias它将处理虚拟主机,并且不需要任何其他操作。

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

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

答案1

不要将开发和生产混为一谈。理想情况下,生产服务器不包含 VCS 或任何其他开发工具链的痕迹。由于您现在正在努力实现部署自动化,因此请在进行此操作时增加分离。

除此之外:为不同的任务设置不同的权限。管理界面请求部署。Web 服务器提供大部分不可变的文件。部署脚本写入文件。

  1. 提供文件服务的用户不应该能够写入(几乎任何)其文件。
  2. 为 apache 部署站点的用户应该设置此类权限并避免在部署中期提供文件(开发人员可能没有想到在应用程序未完全复制时 apache 访问任何内容的副作用)
  3. 部署文件的用户应该具有 git 的只读权限,并且仅部署已提交和标记的版本(并以与开发人员已经做的方式签出)
  4. php 网络界面永远不应该处理任何邪恶的 shell 魔法。以任何方式(创建文件夹等)将网站标记为“需要部署”并完成它(不要在网络界面中同步部署)
  5. 部署脚本应该与它所部署的应用程序无关,除了一些通用标准(“apache 的文件位于文件夹 X 中”,“tmp 文件夹应该位于名称 Y 下”)

我在一个看似类似的设置中是如何做到的:一个脚本,由用户deploy(组的一部分www-data)拥有并按计划执行。用户deploy拥有 git 服务器(在您的情况下,通过 gitlab 管理)的只读帐户的 ssh 密钥。脚本拾取已标记的存储库名称并按如下方式部署:

  1. 检查上次部署是否干净
  2. 检查是否需要部署任何站点
  3. 拆除(停止网络服务器提供半复制的网站)
  4. 如果有必要,获取一个克隆(在你的情况下,是 git 上的只读用户)
  5. 检查新版本(为了理智:与某些合理的正则表达式匹配的最新标记版本)
  6. 设置(将文件复制到当前目录中的 webroot,不建议在这种情况下,这是一个本地文件夹,将其更改为 www-data)
  7. 删除此站点的“需要部署”标记
  8. 将部署标记为成功

相关内容