git - Webapp 部署工作流和安全问题
问题描述
我目前正在开发一个网络应用程序。我现在需要将它部署在它应该运行的服务器上。
我在我的 git 存储库上创建了三个不同的分支:开发、登台和生产。我已经将我的developmnet 分支与暂存合并,对其进行了测试,然后将其合并到我的生产分支中。
我的问题是: 有没有办法只在服务器上签出生产分支?我已经在服务器上设置了部署密钥,但如果我只是 git clone,服务器将克隆所有分支。如果我只能将在生产分支上合并的提交发送到服务器,那就太好了。
有没有办法避免人们访问服务器来结帐不同的分支机构?实际上,还有其他人可以访问我正在处理的服务器。所以我想保护我的网络应用环境。有什么建议吗?
解决方案
如果您正在共享登录信息(尤其是与您显然不信任的人),那么您绝对无法使用 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
不仅包括P1
and P2
,还包括S1
throughS3
和D1
through D7
- 因为它们都是从production
分支“可访问的”(通过父指针)。
所以所有这些版本仍然在本地存在并且可用。您可以使用称为“浅层克隆”的功能(查找命令的--depth
选项clone
)来限制该问题(只要您始终如一地使用它) - 但当然每个生产版本仍将在本地可用。确保唯一的本地版本是正确版本的唯一方法是清除 repo 并重新克隆生产分支的单次提交浅历史。但是在这一点上,你已经跳过了足够多的障碍来将你的部署需求硬塞到 git 中,你不妨使用真正的部署工具来代替。
(实际上,使用 git 作为部署工具在 IMO 几乎总是一个坏主意,但由于某种原因它仍然很受欢迎。)
所有这一切只是为了防止他们做一些他们可能不会做的事情——更改你的网络应用程序的版本——而他们仍然有能力做一些事情,比如手动编辑你正在运行的版本以包含恶意软件,或者删除文件以禁用您的应用程序,或任何与共享登录名相关的事情。
推荐阅读
- r - 根据扩展网格类别汇总原始数据
- sql - 如何在更短的时间内应用以下内容
- python - 当特定列值为空时添加所有列的行值,直到它获得非空值?
- android - 通过sip调用android
- json - Flutter 将字符串转换为数组
- javascript - javascript中的函数参数来自哪里?
- git - 以编程方式检查 git 是否有新版本,如果然后拉
- perl - 使用 perlbrew 创建全新的一次性安装 perl 的最快、最便宜的方法?
- ios - 我可以在需要时在屏幕底部显示 UIView 并在其顶部显示键盘吗?
- javascript - 为什么重新定义变量不会在异步函数中引发错误