我有一台 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 服务器提供大部分不可变的文件。部署脚本写入文件。
- 提供文件服务的用户不应该能够写入(几乎任何)其文件。
- 为 apache 部署站点的用户应该设置此类权限并避免在部署中期提供文件(开发人员可能没有想到在应用程序未完全复制时 apache 访问任何内容的副作用)
- 部署文件的用户应该具有 git 的只读权限,并且仅部署已提交和标记的版本(并以与开发人员已经做的方式签出)
- php 网络界面永远不应该处理任何邪恶的 shell 魔法。以任何方式(创建文件夹等)将网站标记为“需要部署”并完成它(不要在网络界面中同步部署)
- 部署脚本应该与它所部署的应用程序无关,除了一些通用标准(“apache 的文件位于文件夹 X 中”,“tmp 文件夹应该位于名称 Y 下”)
我在一个看似类似的设置中是如何做到的:一个脚本,由用户deploy
(组的一部分www-data
)拥有并按计划执行。用户deploy
拥有 git 服务器(在您的情况下,通过 gitlab 管理)的只读帐户的 ssh 密钥。脚本拾取已标记的存储库名称并按如下方式部署:
- 检查上次部署是否干净
- 检查是否需要部署任何站点
- 拆除(停止网络服务器提供半复制的网站)
- 如果有必要,获取一个克隆(在你的情况下,是 git 上的只读用户)
- 检查新版本(为了理智:与某些合理的正则表达式匹配的最新标记版本)
- 设置(将文件复制到当前目录中的 webroot,不建议在这种情况下,这是一个本地文件夹,将其更改为 www-data)
- 删除此站点的“需要部署”标记
- 将部署标记为成功