通过DevOps确保可靠和有效的信息安全
DevOps 是一组关注于改善开发与运维团队之间的沟通与协作的原则与最佳实践。这些实践已经被希望开发健壮技术解决方案,以便其可靠性能得到确保并且可以被便捷升级的技术专家所广泛接受。对于DevOps最初始的关注是帮助开发人员与运维专家能更有效地沟通和一起工作,但其他的利益相关人,例如质量保证、测试和信息安全(InfoSec)团队也同样重要。
DevOps 在确保开发人员与运维人员能一起工作并且更有效率方面非常成功。通过DevOps,运维团队可以获得他们所需要用于了解如何建立有效和可靠应用程序构建、打包和部署过程方面的信息。而信息安全组也同样有许多与运维团队一样的需求。此外,InfoSec还需要获得他们需要用于确保整个系统是安全和可靠方面的信息。正如DevOps帮助开发和运维团队能更有效地一起工作一样,DevOps也可以帮助开发和信息安全团队更有效地一起工作。在DevOps中,持续部署已经成为DevOps的一个关键实践,并且关注于通过自动化的构建、打包和部署来自动化部署流水线。通过提供一个平台可以在开发生命周期里尽早访问和定位安全问题,信息安全团队也同样能够从部署流水线上得到显著的获益。只要一旦有风险评估被介入,有效的安全保障就应当永远与之同步进行。
作为软件或系统开发工作的一部分,风险需要被理解和定位。安全保障不能仅仅在开发过程的末尾才加入进来。系统需要在开发生命周期的最开始,就将安全保障与设计和开发一道同时得到关注。DevOps提供了必需的构造来帮助定位众多安全风险,这是创建任何复杂技术系统的内在要求。
安全漏洞往往是各种事件的直接后果。例如,在C/C++系统中进行不恰当的编码实践就可能导致缓冲溢出条件有机会被恶意攻击者用于实施越级程序权限。缓冲溢出攻击经常被攻击者所利用,来获得系统的控制权,甚至可以很有效地获得root权限。
运行时事件的发生也可能导致不恰当的安全控制,例如发生在不同组件之间的身份验证与授权。一个常见的安全问题根源就是来自于由于某次部署所应用的不正确的访问权限。
另外一个安全问题领域是确保所部署的是正确的代码。在部署过程中所带来的错误有可能会暴露给恶意攻击者。
在不同接口之间的配置问题经常会曝露给攻击者,以被其用于尝试侵入系统。一旦系统缺乏防范措施,不恰当的安全控制问题就有可能导致非授权的变更变得非常难以识别,而且难于执行鉴定证明来查清到底有哪些变更是由于错误或是由于恶意目的所造成的。
InfoSec 方面的技术专家非常罕有,而且在开发过程的早期也很难有足够恰当的测试环境来实施有效的安全相关测试。许多组织甚至无法在最开始提供所需的服务器并且部署应用,这样的条件限制意味着响应安全破坏通常都是一个极其严苛的工作,这项工作需要尝试准确理解代码存在什么问题以及安全威胁如何能够被排除。
这些风险实在是太常见了。它们导致许多系统停机事故,这种情况影响了很多的银行和交易系统,甚至交易活动本身都因此受到影响。如果我们无法在项目的末尾简单地加入安全保障,那么我们又该如何在最开始就构建安全的系统呢
质量管理大师W. Edwards Deming非常明智地指出,质量需要从最开始构建。DevOps依赖于有效的源代码管理来创建自动化的构建、打包和部署脚本,从而构成部署流水线。
有效的源代码管理包括:
版本控制系统
为代码可靠建立基线的能力
使用流和组件进行软件架构建模的技术
对代码多重变体的支持
将所有的源代码放入到版本控制系统中,使InfoSec可以扫描源代码来发现安全漏洞。健壮的版本控制系统同样使得安全分析师可以通过对组件结构、组件间的接口进行建模以理解系统是如何构建的,尤其是组件间的接口,它们经常是恶意攻击所攻击的目标。
DevOps 及部署流水线帮助有效地创建和提供测试环境,以用于评估和测试在组件间接口上的安全漏洞。通过以及时到位的方式提供一个健壮的测试环境可以增强安全性,通过提供一个自动化的测试平台可以用于识别需要被定位的安全问题。一旦代码中的问题被找到,它们就能被定位作为缺陷或变更请求,从而在它们的整个生命周期中被追踪到,以确保已被识别的风险可以被定位。
健壮的源代码管理解决方案可以帮助管理应用的生命周期,通过提供一组工具和过程来帮助驱动整个开发,涵盖从选择正确的需求到管理在系统还处于产品阶段的缺陷等各个方面。追踪需求和缺陷是基于任务的开发(Task-based development)的核心方面。
信息安全团队通常非常缺乏足够能理解复杂系统常见的内在自有安全漏洞方面的技术专家。正如DevOps能改善开发与运维之间的沟通,DevOps同样能增强信息安全团队的能力,它允许信息安全团队完全理解整个应用以及它是如何构建、打包和部署的。这一知识可以帮助InfoSec维护一个相关的和有效的关注。通过理解系统的基础架构,InfoSec同样可以帮助理解何时安全会被突破以及应该采取什么样的措施应对该安全漏洞,尤其在基础设施自身缺乏安全免疫力的前提下。在许多案例中,这对使用自动化的过程重建服务器来说非常关键。
基于任务的开发(Task-based development)涉及了对诸如任务、缺陷和需求等工作项的创建,以及在为开发相关代码所创建的变更集中追踪这些工作项。通过追踪需求与任务和缺陷之间的联系,通常由于一个核心需求的实现失败而导致的安全问题就可以得到避免。
追踪需求与测试案例之间的联系也是基于任务开发一个重要的方面,因为它可以确保每一个需求可以得到验证(verified)和检验(validated)。这一可追溯性对于避免由于缺陷而导致的安全漏洞来说非常关键。定义和追踪工作项可以帮助管理开发工作的复杂性。代码同样可以被机制化以帮助建立安全测试。
可以以多种方式来创建自动化过程来构建、打包和部署代码来支持敏捷迭代开发。自动化构建过程是实现持续集成(continuous integration)和持续交付(continuous delivery)的一个前提条件。构建过程应当自动化地嵌入不可改变的版本ID到每一个由构建过程所使用或所创建的配置项(configuration item,CI)中。
这也是加密哈希值(hash)应当被创建的地方,以便在下文将要介绍的应用程序部署过程中用于验证。冲刺里程碑发布版本(Sprint milestone release)可以被用于测试和验证在项目启动阶段(inception)尚未被完全理解的需求。更加重要的是,关于如何构建每一个组件的技术细节可以被隐含性地文档记录,并可以被包括了信息安全方面的感兴趣的利益相关者所审阅。在代码中创建变体可以建立应用程序的测试,包括机制化代码来建立与安全相关的测试。
将代码机制化涉及了结合代码库来运行代码,以便可以更加容易地扫描运行时代码的安全漏洞。 DevOps在代码被构建、打包和部署到一个以识别安全漏洞为目的的测试机器方面担当了一个关键的角色。为了保持DevOps关注于尽早定位问题,对一个应用程序的安全分析需要在整个应用生命周期的过程中贯彻执行。尝试在生命周期的后期修复一个安全问题会比在开发工作的前期及早期定位它更加困难。通过参与到整个应用生命周期当中,安全分析师可以更加有效地识别系统中存在的任何问题。
如同谚语所说的,“链条的坚固程度取决于它最薄弱的环节” (”a chain is only as strong as its weakest link”)。通过考察系统最全面的视图,安全分析师可以识别出针对某一个特定组件或组件间接口所存在的问题。面向遗留系统的接口通常是必须的。它们也同样是链条中最薄弱的环节。在漏洞被识别为风险之后,应用程序可以被测试来找到潜在的安全问题。可以采取相应的步骤用于减小风险,并定位安全漏洞。这些技术对于建立早期入侵测试来说非常有用。
部署流水线提供了一个有效的框架来创建所必须的测试环境来执行入侵测试。通过DevOps,入侵测试可以在整个软件和系统生命周期中贯彻进行。通过改善开发和信息安全团队之间的沟通,DevOps 及InfoSec都可以在通常专门为入侵测试所留出的短小时间片断里设计和执行更加有效的入侵测试。部署流水线同样可以使信息安全人员可以获得对于有效评估安全漏洞来说非常关键的技术信息。
安全专家认为大多数的系统都是缺乏免疫力的,而且一旦环境被入侵,恶意代码通常都可以随之被卷入。通常黑客会入侵没有恰当安全保护的系统,然后使用这些系统来攻击其他更安全的机器。此类的攻击通常都涉及到拒绝服务攻击(denial of service attack),由此可以追溯到被用于攻击的机器。在拒绝服务攻击中,受信任的受害者会发现他们自身被告发参与发起对另外一个系统的攻击,并被要求解释为何他们的机器被用于恶意目的。
当一个系统缺乏免疫时,最佳的直接行动就是彻底清除和重新准备服务器。DevOps提供了许多智能的过程从包括操作系统和应用程序基础等方面来通过完全自动化的流程构建服务器。这种通过编程化构建基础设施的能力也被称为基础设施即代码(Infrastructure as Code)。DevOps 中这一关键的实践通常用于支持基于云的基础设施。这些技术也被称作敏捷系统管理(agile systems administration)一个引用自与 DevOps 在敏捷开发环境中所提供的价值相关的术语。
基础设施即代码(Infrastructure as Code)通过提供自动化过程来配置和验证操作系统符合已建立的行业安全标准,例如被广泛遵从的互联网安全中心安全标杆(Center for Internet Security (CIS) Security benchmark),可以被用于实现安全的系统。这些标杆精确定义了操作系统应当如何被配置。
对操作系统的准备和对安全配置的验证这两方面都可以使用由CIS规范所提供的指南被完全地脚本化。脚本使服务器可以通过一个自动化的过程被完全准备好和提供支持。为了确保一个可靠和安全的平台,应当从一个完全安全并被正确配置的服务器开始。在您的服务器基础设施被准备好和可以被验证之后,就可以使用相同的原则以一个安全和可验证的方式来部署应用程序基础。通过嵌入版本ID到每一个配置项中,包括代码组件、配置和属性文件,这一自动化构建过程可以确保代码一旦被部署就可以被验证。
加密哈希值(Cryptographic hash)应当被创建用在应用程序部署的验证当中。
部署应用程序本身与提供一个完全安全可信的应用程序基础同样非常重要,而且不仅仅只是验证,还应进行安全漏洞的侦测,包括非授权的变更。为部署验证构建包含嵌入版本ID的代码,以及使用加密技术来识别非授权的变更,使得您可以创建一个安全可信的应用程序基础。
为了确保可信的应用程序基础,应当使用可以安全识别准确二进制代码以及所有其他配置项(包括 XML及属性配置文件)的过程来构建应用程序代码,以便您可以毫无疑问地证明正确的代码确实被部署和确认没有非授权的变更发生。
这些过程通常会使用在应用程序自动化构建和打包过程中就首先创建的加密哈希值。一旦代码被部署,哈希值就可以被重新计算来验证所有的代码是否被正确部署。
这些相同的过程可以被用于建立可靠的基线和用于识别任何非授权的变更,通常这些变更会由于人为错误或恶意目的而潜在发生。
从一个安全可信的应用程序基础开始工作,可以确保系统被可靠和准确地部署,并使之更加容易地识别和定位任何可能的安全缺口。当非授权的变更被实现之后,基线应当能被更新来进行记录并追踪变更。这些技术被描述在许多行业标准和框架当中,包括被广泛遵从的ITIL v3框架,该框架提供了关于如何构建和维护可靠服务的指南。
标准和框架提供了关于如何实现安全可靠系统的专家指南。这当中许多功能和过程被描述在这些指南中,包括监控和追踪代码基线的能力。ITIL v3框架描述了服务资产配置管理(Service Asset & Configuration Management,SACM),可以捕获基线并存储在配置管理系统(configuration management system,CMS)。这些基线可以通过配置管理数据库(configuration management database,CMDB)进行监控,并且将差异报告到CMS中。最终介质库(Definitive Media Library,DML)包含了基线、正式发布版本可以作为一部分部署用于准备服务器。
这些技术,包括使用入侵预防系统(Intrusion Prevention System,IDS)来监控基线的最佳实践,被作为业界最佳实践而得到广泛注重。DevOps 方式提供了自动化和框架来实现这些过程。但即使采用了最佳预防实践,入侵仍然可能发生。侦测和响应事故的能力是非常关键的。
当非授权变更发生时,无论是因为人为错误还是恶意攻击,它们都应被立即侦测到并触发事故响应。DevOps方式提供了流程来让非授权变更可以更容易被侦测和主动定位到,以实现对用户最小的影响。它们还提供了准备服务器和立即部署系统来重建系统恢复到一个可靠的基线上的基本条件。这些技术需要在关键利益相关者之间的协作以及优异的沟通,这包括了开发、运维、质量保证、测试和信息安全等团队。
结论
DevOps在关注于帮助开发人员与运维人员一起更加有效的工作方面非常知名。信息安全及质量保证和测试团队,也同样是应当在DevOps框架中被展现的关键利益相关者。 DevOps帮助改善沟通,并帮助从编写代码的开发人员处传递核心技术知识给负责确保实现无中断服务运维和安全专业人员。通过DevOps已有的结构,InfoSec可以决定明智的决策,以帮助保护系统基础设施和应用程序免于发生任何有可能导致系统产生危险的非预期事件,无论这些事件是由于无意的错误或恶意攻击。保持系统安全帮助避免系统灾难,并确保无中断的服务。DevOps方式以及部署流水线使得您的团队可以产出既同时满足您业务需求,又能提供安全可信应用程序基础的功能特性。
相关文章
- 1条评论
- 孤央而川2022-05-30 10:44:43
- 案例中,这对使用自动化的过程重建服务器来说非常关键。 基于任务的开发(Task-based development)涉及了对诸如任务、缺陷和需求等工作项的创建,以及在为开发相关代码所创建的变更集中追踪这些工作项。通过追踪需求与任务和缺陷之间的联系,通常由于一