@levinzhang
2023-04-09T17:18:19.000000Z
字数 4193
阅读 287
by
构建安全的软件会是一件复杂和耗时的事情。通过采用GitOps模型,安全性可以从开发中分离出来,从而简化交付过程并提高敏捷性。
跟过去相比,如今的企业必须要更快地响应激烈的竞争压力,提高运行效率,并适应来自外界的持续破坏性。达成这一目标的关键是实现越来短的软件交付周期,并且不能以牺牲可靠性、安全性或合规性为代价。这正是集成DevSecOps策略的目标。但是,如今的DevSecOps实现需要开发人员理解并参与交付流水线的搭建,并且需要在涉及安全问题时保持警觉,否则与网络犯罪和法规合规性失败相关的风险会迅速增长。
GitOps提供了一个解决方案。通过将GitOps集成到DevSecOps工作流中,企业可以利用Git的优势大幅简化软件交付工作流,包括生产环境的发布,同时还可以在后台自动化搭建流水线,并将安全性和合规性相关的任务交给相关团队。
GitOps的目标是以Git作为交付服务状态的事实来源(source of truth),实现软件交付和基础设施的配置。GitOps还可以通过开发人员熟悉的工作流和工具来实现软件交付的操作,使DevOps流程几乎没有任何额外的障碍。
通过GitOps交付模式,企业安全团队可以指定适用于软件交付流程的安全策略,这极大地提升了应用交付的安全性。例如,安全团队可以要求部署到特定环境的应用要执行动态应用安全性测试(dynamic application security test,DAST),并确保检查结果符合预期。
将这样的安全策略声明为代码的方式,不仅可以作为安全策略的文档,还有助于这些策略的自动化合规检查。此外,安全策略作为代码,会由独立于软件开发过程的安全团队管理,并且与开发人员使用的工具进行集成,这可以显著提升所交付软件的安全性。
这种分离对于围绕软件发布开发一个零信任的环境至关重要。在安全问题出现时,通过将其暴露出来,这能够加速新软件的交付,从而消除了进行单独安全审查的所耗费的时间和复杂性。
尽管与软件交付生命周期相关的风险在不断增加,但是大多数的组织都在努力让他们的运维、产品开发和安全团队进行协作,以提升安全性,同时不增加繁琐的流程步骤,避免最终减缓软件交付的生命周期。DevSecOps基于如下原则在软件交付生命周期中建立了这种协作:
在整个软件交付工作流中提供对安全问题的可见性
安全团队、开发人员和项目经理应该都能看到综合安全性测试的结果,包括应用安全性测试(application security test,SAST)、动态应用安全性测试(dynamic application security test,DAST)、模糊测试、依赖性扫描和二进制扫描、许可证合规性和secret探测。
在软件交付生命周期中尽早发现安全问题
风险和漏洞越早发现,就能越快、越容易进行补救。我们应该使用自动化来消除对构建、测试、部署和生产阶段所产生的大量日志和度量指标的手工审查。
在整个工作流中实现安全策略的自动执行
应用安全包括确保生产环境的软件符合不断变化的监管需求,尤其是与数据隐私相关的需求,并减少违规的风险。它还包括确保版本符合内部策略,如部署前的所有审查步骤。
目前流行的DevSecOps的流水线模型符合了这些原则。AWS和Google Cloud都为这种方法给出了最佳实践。使用编排器工具,如Spinnaker,Git或其他源码仓库的变更会触发一个自动化的工作流(“推送模型”),该工作流会通过必要的步骤将应用程序部署到目标环境。这些步骤通常表示为有向无环图(directed acyclic graph),其中包含运行工作流中某个stage/step的要求,以及基于该阶段的状态或输出而运行的依赖stage/step。该模型允许所有的利益相关者(开发、运维、安全、SRE等)对所有的步骤实现可见性。它将规则/需求编码为护栏(guardrail)或闸门(gate),这也会暴露给交付生态系统中的所有利益相关者。
但是,这种流水线模型给开发人员带来了巨大的负担,他们需要熟悉整个流程,包括如何使用和配置编排器。这意味着它需要一个苛刻的任职流程,才能让开发人员有能力使用该系统。
GitOps模型能够让开发人员只需简单地在Git中提交他们的代码即可。他们不需要在交付过程中使用新的工具来运行或跟踪任何东西。他们不需要理解和使用编排器。相反,SecOps能够将必要的可见性、风险识别和规则执行放到Git中,使Git成为所有必要的流程控制的唯一来源,这些流程控制在后台运行,对开发人员不可见。
GitOps模型依赖于Kubernetes的原生能力。Kubernetes支持以声明式模型运行应用程序,应用程序服务所需的配置可以作为声明式规范在配置文件中指定。然后,可以通过Kubernetes API应用这些规范,Kubernetes会推断出为达到配置文件中声明的状态需要执行的操作,并执行这些操作。这种模式允许检测Git中的预期状态和实际运行状态之间的变化(漂移检测),从而实现纠正措施。
Kubernetes有一个扩展功能,可以扩展其基本功能,允许将额外的检查作为部署需求验证的一部分。Kubernetes准入控制(Kubernetes Admission Control,KAC)机制在简化GitOps并为交付提供所需的可靠性和安全性方面发挥了关键作用。
KAC还提供了一项关键的能力,将流程要求的企业策略与开发流程区分开来,允许策略变化独立于开发流程。例如,为了确保与SOX合规性的要求保持一致,也就是确保有一个以上的人参与验证对生产环境的修改,在允许部署之前,准入控制策略可以验证Git PR审查和QA批准是由两个不同的人进行的。
利用这些能力,GitOps模型可以实现如下功能:
配置监控
运维团队可以在Git仓库中声明配置,然后通过监控Git配置变化的控制器模块将该配置应用到目标环境中。
控制器还可以监控目标环境,检测与Git中所声明配置的漂移,然后同步至目标环境,使应用程序符合预期的配置。
自由使用IDE和Git工具
后台的规范允许在交付过程中使用适当的闸门和护栏。这使得开发人员可以继续使用他们熟悉的工具,同时还能够达到软件交付所需的安全性和可靠性等级。
这种模式对开发人员的巨大优势在于,他们只需要采取一个步骤即可参与DevSecOps的工作流,即在目标环境中寻找变更并进行协调(reconcile)。在他们的DevOps流程中,不需要执行像安全检查、测试、设置策略或寻求批准这样的独立步骤。
在GitOps模型中,可以要求DevOps工具异步地执行它们的行动,以代替顺序的编排步骤,然后在部署时,验证所需的步骤是否均已经按照指定的策略执行完成。
例如,代码检入(check-in)执行持续集成(CI)的单元测试,允许开发人员拥有更快的开发/测试周期。而二进制扫描、动态扫描和其他策略检查是与开发人员的工作流异步进行的。测试用例可以自动运行,或手动进行集成测试,并将结果发布到同一个或另外的中央仓库中。存储在中央仓库中的结果会与已签名二进制制品相关联,以便于进行验证。这通常是通过CI的输出来完成的,例如,一个可以进行签名的容器。对于生产环境的部署,Git配置会随着新的版本清单而进行更新。
当新版本的配置更新到Git仓库时,将会触发Kubernetes命名空间的部署。然后,准入控制器的配置将触发基于容器签名元数据的检查,以确定是否允许部署。这些检查将确定静态扫描、动态扫描、合规性要求(如SOX)和测试结果是否可以接受部署,从而批准或拒绝部署,并向用户发送关于失败原因的通知。
开放策略代理(Open Policy Agent,OPA)网关和Kyverno是实现部署准入控制检查的示例框架。它们可以被配置为Kubernetes的扩展,并包括一个开放策略代理或Kyverno,以验证安全策略。当一个新的应用程序或Git变更得到应用时,该扩展会识别新的部署需求,并运行安全策略检查,以确定是否满足所有指定的安全性和合规性要求。然后,它可以批准部署或停止部署。
虽然这些都是帮助实现GitOps模型的优秀框架,但它们还不支持以下功能:
这意味着,尽管GitOps模型有可能使开发人员的生活更简单,但还需要额外的工具来实现实时可见性和协作的能力。
在企业环境中,安全团队应该能够查看所有应用程序的合规状态,包括为特定的应用程序设置例外。系统应该能够通知开发人员组的违规行为,并与安全团队合作解决特定问题,例如,在已部署的应用程序中发现的新漏洞。这些功能对于在不影响软件交付速度的前提下确保安全性至关重要。
软件交付工作流中的速度是至关重要的。但没有安全性和合规性的速度是鲁莽的行为。用于DevSecOps的GitOps模型提供了最好的方案。它可以让开发人员专注于他们的项目,而不必了解安全性相关的问题,并在快速的开发/测试周期中学习使用编排器工具,同时允许他们继续使用原来所选择的工具。另外,它可以使SecOps在软件交付工作流中添加所需的护栏,并在风险出现时将其暴露出来,从而更快、更容易地解决它们,以实现更安全、更可靠的软件发布。只不过,我们还没有完全达到这个目标,但在未来一两年内,预计会有大量的解决方案进入市场,使真正的GitOps成为现实。
Gopinath Rebala是OpsMx的CTO,他全面负责Spinnaker的OpsMx企业版的机器学习和数据处理架构。Rebala还与客户保持着密切联系,领导战略实施的设计和架构。他是持续交付领域和Spinnaker社区的演讲者和知名领导者。在此之前,Rebala是N42公司的联合创始人和首席技术官,该公司提供机器学习工具以提高大规模分布式系统的可靠性。
查看英文原文:Accelerating the Secure Software Delivery Lifecycle with GitOps