作者:
姚圣伟(现就职天津引元科技 天津市区块链技术创新中心)
研发效能(DevOps)工程师认证学员
DevOps 最开始最要是强调开发和运维的协作与配合,至今,已不仅仅涉及开发和运维团队。为了更好地发挥出 DevOps 作用,就必须将IT全流程,各工种,融入应用的整个生命周期中 。
虽然 DevOps 的工作方式让开发团队能够更快地部署应用程序,但这就像想要在悬崖上走得更快一样,并没有什么安全可言!
在当下,凭借云,DevOps 团队可以获得前无所有的基础结构和规模。但随之而来的,互联网上一些怀有恶意最多的行动者也可以迅速通过云来接近这些团队,团队每次部署应用程序时都会给业务带来安全风险。
在这样的分布式环境中,外围类别的安全性不再可行,所以公司必须在应用程序和基础结构中采用更多微观级别的安全性,并设立多道防线。
如何通过持续集成和交付来确保应用程序是安全的并保持安全?在早期阶段如何找出安全问题并进行修复呢?这要从通常被称为 DevSecOps 的做法开始。
DevSecOps 是“开发、安全和运营”的缩写,它可在软件开发生命周期的各个阶段自动集成安全性 - 从最初的设计到集成、测试、部署,一直到软件交付[1]。
DevSecOps 代表着开发组织实施安全性的自然且必要的发展过程。过去,安全性总是由单独的安全团队在开发周期结束时(几乎是事后)添加到软件中,并由单独的质量保证 (QA) 团队进行测试。
传统的安全开发流程
在传统的安全开发流程中,安全团队地介入,相对靠后,基本上是产品发布前的一道防线,客观上造成了开发和测试是按照敏捷以及DevOps的流程在运行,到最后一步,有回到了瀑布式的方式进行安全测试,造成了发布的“肠阻塞”。
如果每年只发布一两次软件更新,这种方法还能够应付。但是,随着软件开发人员采用了敏捷和 DevOps 实践,软件开发周期就缩短到几周甚至几天,传统的“添加式”安全方法就造成了让人无法接受的瓶颈。
DevSecOps 可将应用和基础架构安全性无缝集成到敏捷和 DevOps 流程和工具中。它可以在安全问题一出现就解决这些问题,处理起来更加得心应手、速度更快,且成本更低,并且不会将这些问题带入生产环境。此外,DevSecOps 使应用和基础架构安全性成为开发、安全和 IT 运营团队的共同责任,而不仅仅是安全团队一方的责任。它支持“更安全、更迅速地交付软件”- 这是 DevSecOps 的座右铭,可在不减慢软件开发周期的情况下自动交付安全的软件。
DevOps和DevSecOps对照
DevSecOps 将安全团队及其能力整合到 DevOps 做法中,使安全性成为团队中所有人的责任。不再事后考虑安全性,而是在过程的每一步骤中都进行安全性评估。
DevSecOps评估程序安全的四个维度
确保应用程序安全是一个持续的过程,其中包括保护基础结构、设计具有分层安全性的体系结构、持续安全验证和监视攻击。
在IDCF研发效能(DevOps)技术工程师认证培训中,庄老师在介绍常见的安全漏洞一节课程中,有提到SQL注入问题。OWASP 组织 (Open Web Application Security Project) 在其 OWASP Top 10 2017 文档中将注入列为 Web 应用程序安全性的头号威胁。我们从课程中,可以发现SQL注入的一些特点:
SQL注入的危害不容小觑,历史上有很多著名的SQL注入事件,例如:
2008年,美国俄亥俄州大学的数据库被SQL注入攻击,导致超过36万条敏感数据被泄露,包括学生、教职员工和校友的姓名、社会安全号码、出生日期等。
2011年,索尼PlayStation网络遭到SQL注入攻击,导致超过7700万用户的个人信息被盗取,包括姓名、地址、电子邮件、密码等。索尼因此损失了约1.7亿美元,并面临多起诉讼。
2015年,英国电信公司TalkTalk遭到SQL注入攻击,导致超过150000名客户的个人信息被泄露,包括姓名、地址、电话号码、银行账户等。TalkTalk因此损失了约6千万英镑,并失去了10万名客户。
SQL 注入攻击属于最早、最常见和最危险的 Web 应用程序漏洞。
OWASP Top 10 2017和2021榜单对比
而在不久之前公布的OWASP Top 10 2021榜单[2]中,我们也从榜单中看到,访问控制失效(Broken Access Control)从第五位上升到了第一位。94%的应用程序都经过了某种形式的访问控制失效测试。映射到访问控制失效的34个CWE在应用程序中的出现频率比其他任何类别都要多。
访问控制是指对经过身份验证的用户执行超出其权限级别的操作的限制。当此类限制未正确配置时,就会出现访问控制中断。这可能导致对敏感信息未授权访问以及修改或破坏。
访问控制失效会造成以下严重后果:
访问控制失效的危害不容小觑,历史上有很多著名的访问控制失效事件,例如:
访问控制失效的例子有很多,但大致可以分为以下几种类型:
下面是一些具体的访问控制失效的例子:
1.假设一个网站有两种角色,分别是普通用户和管理员。普通用户可以查看自己的个人信息,管理员可以查看所有用户的个人信息。正常情况下,应用程序会根据用户的角色,生成不同的URL,例如:
https://example.com/app/getUserInfo (普通用户)
https://example.com/app/admin_getUserInfo (管理员)
如果应用程序没有对URL进行访问控制检查,那么一个普通用户可以通过修改URL为管理员的URL,从而查看所有用户的个人信息。这就是一个基于URL的访问控制失效的例子。
2、假设一个网站有一个订单系统,每个订单都有一个唯一的订单ID。正常情况下,应用程序会根据用户输入的订单ID,生成如下的SQL语句:
SELECT * FROM orders WHERE order_id = '123456';
如果用户输入正确的订单ID,那么这条语句会返回该订单的信息,否则返回空。但是如果应用程序没有对订单ID进行访问控制检查,那么一个用户可以通过修改订单ID为其他用户的订单ID,从而查看或修改其他用户的订单信息。这就是一个基于ID的访问控制失效的例子。
3、假设一个网站有一个文件管理系统,用户可以上传、下载或删除自己的文件。正常情况下,应用程序会根据用户使用的HTTP方法,执行不同的操作,例如:
GET /files/filename.txt (下载文件)
POST /files/filename.txt (上传文件)
DELETE /files/filename.txt (删除文件)
如果应用程序没有对HTTP方法进行访问控制检查,那么一个用户可以通过使用DELETE方法,删除其他用户的文件。这就是一个基于方法的访问控制失效的例子。
4、假设一个网站使用了JWT(JSON Web Token)来验证用户的身份和权限。正常情况下,应用程序会根据用户登录时生成的JWT,判断用户是否有权访问某些资源或功能。但是如果应用程序没有对JWT进行有效性或完整性检查,那么一个用户可以通过修改或伪造JWT,绕过身份验证或提升权限。这就是一个基于元数据的访问控制失效的例子。
5、假设一个网站有一个API,允许用户从不同的域名访问一些公开的资源。为了实现这个功能,应用程序使用了CORS(跨域资源共享)机制,设置了如下的响应头:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
这意味着应用程序允许任何域名访问该API,并且允许发送Cookie等凭证。但是如果应用程序没有对API进行访问控制检查,那么一个攻击者可以通过构造一个恶意的网页,从不同的域名访问该API,并且利用用户的Cookie等凭证,执行一些不应该被授权的操作。这就是一个基于CORS的访问控制失效的例子。
我们可以看到安全问题暴露在整个软件开发周期中,我们需要遵循安全软件开发的要求,迈向更安全编码的第一步。
要遵循安全软件开发的最佳做法,就必须将安全性集成到软件开发生命周期的每个阶段(从需求分析到维护),而无论项目方法如何(Waterfall、Agile 或 DevOps)。随着引入关注的数据泄露和运营方面的安全缺陷被利用等情况的发生,越来越多的开发人员理解了解决安全性问题是需要贯穿整个开发过程的。
在开发生命周期中,解决问题的时间越晚,那么解决问题要耗费的成本也就越高。
安全性问题也不例外。如果在软件开发早期阶段漠视安全问题,那么后面的每个阶段可能会继承前面的阶段中存在的漏洞。最终产品将会积累很多安全问题,还可能会发生数据泄露。将安全性融入开发生命周期的每个阶段,会有助于及早发现问题,并且有助于降低开发成本。
我们按照安全开发生命周期 (Security Development Lifecycle,简称SDL) 的各个阶段来介绍,你可以利用它们在生命周期的各个阶段中完成安全软件开发实践[3]。
SDL 各阶段包括:
安全开发生命周期
由于DevSecOps是对现有软件开发实践的扩展或增强,因此最简单的做法是从敏捷的角度考虑DevSecOps框架,以此来进行规划和设计、编写代码、测试、部署和持续运维。
DevSecOps 不仅仅指有安全意识的代码标准和同行评审。同时还意味着将安全置于代码库管理和维护的中心,以避免引入漏洞。确保代码提交和管理的安全的常用技术包括:
测试可以检测应用程序的缺陷和安全问题。构建、测试和发布流水线的自动化和编排应该包括当代码部署测试时运行的安全工具,如,在单元测试期间检查漏洞。DevSecOps 框架的常见测试注意事项如下:
即便构建成功,也并不意味着再也不会出现安全问题。DevSecOps 实践通过以下方式进入部署和运维环境:
当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段,软件架构师可以使用威胁建模工具提前识别这些问题。因此,它能大幅减少开发总成本。考虑到非安全方面的专家,该工具通过提供有关创建和分析威胁模型的明确指导,使所有开发人员可以更轻松地进行威胁建模。
任何人都可以使用该工具来实现以下目的:
该工具的部分功能和创新:
威胁建模有五个主要步骤:
威胁建模的五个步骤
威胁建模应是典型安全开发生命周期的一部分,从而让我们可以优化威胁模型并逐渐降低风险。
0、下载并安装 Threat Modeling Tool。访问 https://aka.ms/threatmodelingtool
1、启动 Microsoft Threat Modeling Tool
Microsoft Threat Modeling Tool
2、选择“创建模型”选项。
点击“创建模型”选项
添加 Azure App Service Web App
添加 Azure SQL Database
3、在右侧面板中,搜索并添加 Azure App Service Web App 和 Azure SQL Database,将它们链接起来以显示如下图所示的请求和响应流。
形成请求和响应流
4、在工具栏菜单中,选择“视图”->“分析”视图。分析视图将显示按严重性分类的威胁的完整列表。
5、若要生成威胁的完整报表,请在工具栏菜单中选择“报表”->“创建完整报告”,然后选择保存报表的位置。
系统将生成一份完整报表,其中包括威胁的详细信息、适用的 SLDC 阶段、可能的缓解措施和指向详细信息的链接。
威胁建模工具可帮助解答某些问题,例如:
1、攻击者如何更改身份验证数据?
2、如果攻击者可以读取用户配置文件数据,将造成哪种影响?
3、如果拒绝访问用户配置文件数据库,将发生什么情况?
STRIDE 模型
为了更好地阐明此类突出问题,Microsoft 使用了 STRIDE 模型,它可以将不同类型的威胁分类,简化整体安全交流。
我们可以针对不同的威胁进行状态标注、优先级更改、批示备注等操作。
威胁建模工具风险缓解
当我们使用微软威胁建模工具,创建、配置和分析模型,即完成定义安全要求、创建应用程序关系图、识别威胁后。我们需要进行威胁的缓解,我们可以参考风险缓解类别进行后续步骤。
风险缓解类别
威胁建模工具缓解措施根据 Web 应用程序安全框架分类[5],包括:
它可以帮助识别:
因此,可以使用这些类别来重点完成并优化安全工作,以便在输入验证、身份验证和授权类别中出现最流行的安全问题时,可以从这些位置着手。最终验证威胁是否得到缓解。
引用:
[1]什么是 DevSecOps?| IBM
(https://www.ibm.com/cn-zh/topics/devsecops)
[2]OWASP Top 10:2021榜单
(https://owasp.org/Top10/)
[3]Microsoft Azure 上的安全开发最佳做法 | Microsoft Learn
(https://learn.microsoft.com/zh-cn/azure/security/develop/secure-dev-overview)
[4] Microsoft Threat Modeling Tool 概述 - Azure | Microsoft Learn
(https://learn.microsoft.com/zh-cn/azure/security/develop/threat-modeling-tool)
[5]风险缓解 - Microsoft 威胁建模工具 - Azure | Microsoft Learn
(https://learn.microsoft.com/zh-cn/azure/security/develop/threat-modeling-tool-mitigations)