前言
敏捷开发是现在主流的开发模式,相对于传统的瀑布式开放,它通过快速的迭代来响应和展示客户的需求,敏捷开发的优点已经是众所周知了。但是敏捷开发已经实施了很多年了,项目安全问题还是和瀑布开发开放模式一样没有得到解决,都是到项目上线前一两个礼拜才进行安全测试和渗透测试。
这种模式有非常大的弊端,第一,很多安全问题应该在架构设计和coding的时候就要考虑到的,在项目快结束的时候去解决已经太晚了。第二,从我的经历来看,大多数项目由于各种原因都会有延迟的情况,这个时候上线压力非常大。即使发现了很多安全漏洞,由于修复代价非常的高,项目经理通常会采取折中的方案来保障上线。任何折中方案都会导致漏洞直接上线,暴露在黑客面前,给产品带来非常大的风险。
将安全问题留到最后解决是非常危险的,但是在立项的时候就把安全问题全部放到项目开始阶段也并不是非常可取的,软件架构包含很多跨功能的需求,比如性能、扩展性以及安全。这些需求通常应该在代码设计前设计和决定如何实施,因为这个时间点才会有足够的信息来做正确的决定。太早的时候决定这些跨功能需求由于没有足够的信息会带来安全风险,等发现想修改架构时因为代价太高,已经太晚了。
将安全问题放在项目开始或者结束的时候来考虑都是极端的做法,那在敏捷开发的项目如何解决安全问题呢?正确的做法是在项目开始时考虑好项目安全需要做哪方面的工作,需要什么样的架构设计,在开发过程中始终考虑安全因素,在项目结束时进行必要的安全测试。
从笔者的个人项目经验,做到以下几点也可以让安全也可以敏捷起来。
1. 贯彻安全编码规范
如果每个开发人员都知道如何编写安全的代码那么很多应用程序的安全漏洞都能够避免。比如:在处理用户输入时,应该知道如何做输入校验。在将用户信息存入数据库时,应该知道讲敏感信息进行加密或者混淆。在进行数据传输时要确保传输通道安全及对内容加密。在返回错误信息和log时要对输出进行消毒等等。精通OWASP Top 10应用安全漏洞是每个应用程序开发人员的必备技能。WebGoat是一个非常好的学习的网站,网络上也有很多相关的支援。中国古话说得好“磨刀不误砍柴工”,在项目开始对程序员举行必要的安全等方面的培训是非常有必要的。
2. 每个项目组应该有一名安全专家
坦率讲让每个程序对安全有深的理解是不现实的,有很多安全问题是需要专家的眼睛才能发现。安全专家是刚需,强烈推荐每个项目组有一个在应用安全领域有比较深研究和理解的资深程序员。需要安全专家的级别和能力可以根据项目对安全的要求来定,当然有条件的情况,专家能力越强对项目的安全保障越好。在没有请安全专家能力的团队可以由安全经验丰富的资深工程师来担任也是可以的。安全专家的主要职责包括:
- 在开发安全敏感度非常高的用户故事时和工程师们结对编程
- 对工程师的代码进行安全评审,确保代码在提交到代码库前没有安全问题
- 在选择使用哪些商业代码,开源库,公共API等第三方库时进行安全分析和决定
- 帮助QA人员测试安全敏感度高的用户故事,确保程序安全。
除了这些以外,安全专家还应该帮助程序员熟悉安全编码,将安全知识分享给每个程序员,提高程序员的安全意识。
- 识别安全敏感度高的用户故事
八二原则在安全也是适用的,80%的安全问题是由20%的用户故事导致的,安全专家要识别出安全敏感度高的用户故事,将有限的资源有限放在这些故事里。安全专家可以在每个迭代开始前利用计划会议将这些安全敏感度的故事识别出来并标志出来。让每个程序员对这些用户故事在安全方面加以重视。举几个应该标为安全敏感度高的用户故事:
- 包含用户输入选项(比如输入框,选择框等等)
- 存储数据到数据库
- 数据传输到外部系统
- 处理外部系统传入的数据
- 输出信息到外部系统和文件等。
- 处理验证和认证流程
4. 每个安全敏感用户故事都应该有恶意测试
每个用户故事都事先设计可接受条件,项目负责人可以在安全专家的帮助下从安全的角度设计可接受条件,安全专家应该写一些恶意的或者破坏性的测试条件,类似于功能测试用例。就是从黑客的角度去思考问题,如何攻破这些用户故事。
5. 在用户故事被接收前举行严格的安全测试
传统模式是在项目结束前才举行安全测试,在敏捷模式下,每个用户故事在被接受前都应该进行安全测试,QA人员可以在安全专家指导下和功能测试一起执行恶意测试,也可以使用静态和动态扫描工具对代码举行漏洞扫描,一旦发现安全问题,和功能bug一样,用户故事将会退回给开发人员进行修复,修复完毕后再进行测试。这种循环可以进行多次直到没有问题发现。用户故事才能被接受。
安全测试自动化还是手工呢?
自动化化测试是敏捷开发中非常重要的一个基础,也可以说没有自动化就没有敏捷模式。安全测试也是同样如此。自动化不是万能的,很多测试是自动化没有办法完成的,片面最求完全自动化是不可取的。对安全尤其如此,比较好的方式是,安全专家先通过手工的方式找到漏洞,然后将这个找漏洞的过程自动化,避免新的代码改动引起同样的漏洞。
后语:
这几种实践实际上是和敏捷开发思想是一致的,就是将整个安全的需求拆分到每个迭代里,让安全需求由抽象变为具体,在确保每个用户故事安全的前提下进而确保整个项目的安全。但是说起来容易做起来的确不简单,安全专家和有安全意识和能力的开发人员是稀缺资源,尤其在中国,大家重视项目安全也是最近一两年的事情,安全人员的培养没有跟上来。
在这种情况下完全按照这个实践是不太现实的,针对这种情况 Gartner 在2014年就提出了 RASP 的概念,就是将这些实践抽象成一种通用化的产品,将安全编码规范和漏洞发现融合成一种安全产品,开发人员可以讲 RASP 产品结合扫描工具在运行时对产品漏洞检测,很快就定位哪行代码存在安全漏洞。这种产品的理念和敏捷开发非常的匹配。大家有兴趣可以尝试一下。相关资料可以通过 Google 和百度可以找到。
本文系 OneRASP 安全总监刘再耀原创文章。如今,多样化的攻击手段层出不穷,传统安全解决方案越来越难以应对网络安全攻击。OneRASP 实时应用自我保护技术,可以为软件产品提供精准的实时保护,使其免受漏洞所累。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客