首页 > 解决方案 > Webapp 部署工作流和安全问题

问题描述

我目前正在开发一个网络应用程序。我现在需要将它部署在它应该运行的服务器上。

我在我的 git 存储库上创建了三个不同的分支:开发、登台和生产。我已经将我的developmnet 分支与暂存合并,对其进行了测试,然后将其合并到我的生产分支中。

我的问题是: 有没有办法只在服务器上签出生产分支?我已经在服务器上设置了部署密钥,但如果我只是 git clone,服务器将克隆所有分支。如果我只能将在生产分支上合并的提交发送到服务器,那就太好了。

有没有办法避免人们访问服务器来结帐不同的分支机构?实际上,还有其他人可以访问我正在处理的服务器。所以我想保护我的网络应用环境。有什么建议吗?

标签: gitsecuritydeployment

解决方案


如果您正在共享登录信息(尤其是与您显然不信任的人),那么您绝对无法使用 git 来确保情况安全。时期。

首先,他们可以对您的 webapp 做更糟糕的事情,然后将其切换到您尚未准备好发布的版本。

但是,好的,对于练习,让我们假设出于某种原因,他们可能会做的唯一恶意的事情是过早地发布一个功能。所以你从评论中尝试这个--single-branch想法。

但这不是安全功能。它不会阻止某人获取其他分支,它只是使其默认行为仅获取该一个分支。因此,现在的问题是如何保护您的遥控器。每次需要访问遥控器时都输入密码吗?如果没有,那么其他用户(毕竟,与您使用相同的帐户登录)可以获取他们想要的任何内容。

因此,如果您将 git 配置为不使用 ssh,并且不存储您的密码,并且实际上要求您在每次获取/拉取时手动登录;然后你做了一个--single-branch克隆(假设这个人没有其他方法来访问远程仓库;这实际上变成了你的远程托管方式/位置的问题),那么他们将无法访问未来版本的应用程序。他们仍然可以访问导致当前生产版本的每个过去版本,包括那些从未打算用于生产版本的版本;因为single-branch仍然克隆完整的历史。因此,可以说您的production分支除了从暂存分支合并之外永远不会收到更改。你有

D1 -- D2 -- D3 -- D4 -- D5 -- D6 -- D7 -- D8 -- D9 <--(dev)
        \           \                 \     \
         S1 -------- S2 -------------- S3 -- S4 <--(staging)
                       \                 \
                        P1 -------------- P2 <--(production)

现在,克隆--single-branch --branch production不仅包括P1and P2,还包括S1throughS3D1through D7- 因为它们都是从production分支“可访问的”(通过父指针)。

所以所有这些版本仍然在本地存在并且可用。您可以使用称为“浅层克隆”的功能(查找命令的--depth选项clone)来限制该问题(只要您始终如一地使用它) - 但当然每个生产版本仍将在本地可用。确保唯一的本地版本是正确版本的唯一方法是清除 repo 并重新克隆生产分支的单次提交浅历史。但是在这一点上,你已经跳过了足够多的障碍来将你的部署需求硬塞到 git 中,你不妨使用真正的部署工具来代替。

(实际上,使用 git 作为部署工具在 IMO 几乎总是一个坏主意,但由于某种原因它仍然很受欢迎。)

所有这一切只是为了防止他们做一些他们可能不会做的事情——更改你的网络应用程序的版本——而他们仍然有能力做一些事情,比如手动编辑你正在运行的版本以包含恶意软件,或者删除文件以禁用您的应用程序,或任何与共享登录名相关的事情。


推荐阅读