https://www.freebuf.com/articles/es/220410.html
前言
今年很多比较大的互联网公司开始试行SDL落地,但是由于相关资料文档有限,导致落地困难,今天这篇文章就旨在讨论一下企业SDL如何快速落地问题,题主落地SDL时间并不是很长,一两年时间而已,但是一样是从零开始,过程艰难,不论成功与否,一样有所得,写出来大家讨论一下。
一、SDL实施定位
开始就不讲微软那一套流程了,先借鉴一下(这张图忘了从哪位大佬PPT截下来的了,侵权可删):
这张图很好的诠释了整个DevSecOps如何实施,很多人觉得SDL做起来和业务有很多冲突,推不下去,其实不然,SDL重点所做的就是:依附和控制。
依附和控制听起来矛盾,但是实际并不矛盾。要想明白这两个词的含义,必须要清晰做SDL流程的目的,那就是将安全手段前置,安全问题最小化,降低后期维护成本。
那依附什么?依附整个DevOps各个流程,当然了,很多公司没有完整的DevOps,没关系,我们可以跟着走,适当增减,也就是研发流程到哪我们就在哪。
控制什么?如果安全没有控制手段,那结果肯定就是个摆设。我们不需要控制他们实施的细节,我们可以控制主业务系统的命门,如发版和结项。
二、SDL落地三要素
要想做好企业的SDL建设,个人认为三个因素至关重要:公司制度、团队支持、SDL工程师。
公司制度:大部分公司处于初始阶段,没有任何安全建设方面的经验、文档以及工具,甚至公司高层对这方面严重忽视,摆个样子就行,这导致SDL实际落地非常困难,基本就是摆设。如果公司之前已经有相关的实施经验,那么推动起来要方便的多,SDL工程只需要在原有的基础上优化拓展就行了。
团队支持:目前大部分公司都有自己的安全团队,没有的可能也有相应的外包人员。日常的渗透、审计工作基本就是这部分人在完成,其实这是SDL建设的中坚力量,整个SDL工程最多最繁杂的流程全部依靠这部分人员。
SDL工程师:第三个重要因素就是SDL工程师,作为SDL建设中最关键的部分,SDL工程师意味着整个落地效果的关键因素,SDL工程师的人选必须具备综合处理能力,不然很艰难。
三、SDL工程师
既然SDL工程师作为整个SDL落地的关键因素,那我们就单独讨论下SDL工程师的职责与作用。
现状:大部分人眼中的SDL工程师是个吃力不讨好,还忙成狗的工作,特别是公司安全团队就一两个人的时候,那么整个事情基本就是SDL工程师一个人干了,像流程建设、文档编辑、渗透测试、代码扫描、人工审计、需求审核、等级保护等等,不得不说这是个庞大的工作量。
定位:那么SDL工程师如何从庞大的工作量中抽身出来?那就是定位转变或者叫思维转变。基本上SDL工程师都是技术出身,自身定位也是个安全技术人员,事必躬亲,事实上不会技术的SDL工程师也很艰难。但是作为SDL工程师我们自身定位就是从执行者转变为检验者。SDL工程师的实际职责是把控整个项目流程的安全走向,确保整个产品周期的安全都在把控之中,作为决策人,必须创建相关安全流程、安全文档以及制定安全计划和验收安全执行效果。那么其它的测试、扫描、审计等工作谁来做?可以是研发、测试、公司安全部、外包公司等等,安全部人特别少的情况下可以是由测试或者其它人员使用工具完成。那么SDL工程师最终所把控的就是最后所执行的效果是否达到自己制定的每个阶段的安全要求,如此SDL工程师即可从繁杂的事务中抽身出来建设和管控整体流程。
职责:SDL工程师的职责可以概况为以下几个方面:SDL流程制度建设及优化、降低产品安全风险、降低后期的维护成本。
四、SDL实施目标
SDL建设的目的其实很明确,就是将安全手段前置,尽可能的降低产品安全风险,减少后期的维护成本。但是理想和现实总是有差距,所以我们作为实际落地必须坚持深度防御、适度安全两条准则,我们不做绝对安全,这样太理想化,后期可能会带来不必要的矛盾,影响项目流程进度,增加成本。
五、SDL建设流程
那么SDL实施落地的流程还是依附在DevOps上,如何具体实施?此时我将SDL整个生命周期分为三个阶段:前期、中期、后期。
前期
准备阶段
作为整个SDL流程的开始,准备阶段尤为重要,整个SDL工程能否执行或者能否顺利执行,就取决去此阶段,此阶段我们需要准备事项如下:
1、获取公司相关政策或者高层领导支持
前面说过,SDL最大的阻力不是项目有多复杂,而是公司制度或者高层领导的态度决定的。SDL作为整个项目研发流程的依附工作,如果仅仅是依附,那SDL将无法推行,因为缺乏约束力,不能有效的控制整个安全流程的走向。那么此时的安全负责人必须制定相关的流程计划,取得高层领导支持,并设置整理安全流程项目控制权,如:版本控制权。
2、指定SDL工程师
SDL工程师作为整个SDL工程建设的关键因素,SDL工程师除了技术及沟通能力之外,最重要的是SDL工程师的自身定位:检验者而非执行者。SDL工程师只需要对项目每个阶段的整理执行效果检验,检验包括:流程是否合理、安全问题是否遗漏、效果是否达标。
3、整理相关支持文档
SDL相关工作需要大量文档支持, 包括编码规范、合规文档、基线加固文档、需求文档等等。
4、准备相关工具
CI/ CD中的安全工具、漏洞扫描工具、源码扫描工具、漏洞管理工具、集成工具等等
立项阶段
此阶段SDL工程师必须参与立项评审,我们重点关注:产品架构安全、第三方组件安全或者提出其它安全规范及文档。
培训阶段
此阶段分为两部分,一部分前期执行、一部分中期执行,这里放一块了。
1、前期全员性安全培训
前期培训重点是提示项目参与人员的安全意识、研发人员的代码安全意识,争对这方面培训即可。
2、中期针对性培训
周期培训必须针对项目培训,比如代码中常出现的问题、测试过程中出现比较多的漏洞等。因为到项目后期,漏洞基本都很集中在某几种类型之间。
需求阶段
真正的SDL工程师的具体工作其实就是从需求阶段开始,此阶段我们需要做以下事件:
1、实施风险评估
2、制定安全需求表
3、发起并参加安全需求评审会议
4、针对项目筛选适用的安全需求规则
前期总结
前期阶段重点工作是了解项目整体架构、制定相关SDL流程、编写相关的文档、寻找合适的工具以及培训相关的人员安全意识。
中期
设计阶段
当需求评审通过之后,项目开始进入设计阶段,如果此阶段之前没有相应的文档支持,工作量稍微大点:
1、 发起并参加需求设计评审
2、 架构评审
3、制定安全编码规范、checklist
4、提出并解决框架设计安全风险
5、提出并解决业务逻辑设计安全风险
6、威胁建模
开发阶段
整体SDL建设进入开发阶段是整个流程建设的核心部分,整个SDL建设的大量工作都是围绕开发阶段和测试阶段不断的循环之中,源代码扫描和人工审计等工作也是从这个阶段快开始介入,下图简单介绍相关流程:
上图简单阐述了整个开发阶段的相关工作以及安全扫描介入“
1、 代码研发成功之后,研发人员进行是否findsecbugs实行自扫描;
2、 扫描通过的代码上传到git后使用jenkins等工具使用findsecbugs等工具动态增量扫描;
3、 扫描通过后的代码集成到fortify或者checkmark等工具进行人工审计和扫描(此时只是增量代码审计和扫描),包括第三方组件扫描;
4、 最后通过的代码部署测试环境等等人工渗透研发流程结束。
备注:具体工具配置使用可参照:https://xz.aliyun.com/t/6625
测试阶段
测试阶段一般会在研发中期就开始进行,会对项目进行模块式测试,本次我们只讨论安全测试,包括以下几个方面:
1、 模块性源代码安全审计和扫描;
2、 第三方组件扫描;
3、 自动化安全扫描工具扫描;
4、 人工渗透扫描;
5、 研发后期整体性源代码及三方组件扫描;
6、 研发后期整体人工渗透。
中期总结
本阶段我们的工作量大概占整体项目的80%,基本整个SDL流程的核心阶段就在此时。中期我们的难点就是开发阶段和测试阶段,这两个阶段是一个穿插交错的过程,此过程我们只需要做到适度安全即可。各种安全文档、支持工具是本阶段的一项重要工作,尽量减少人工投入,使用工具代替人工才是SDL的核心目的,在缺少工具的情况下,寻找合适的手段建设SDL工程师繁杂的测试工作,整个版本是否放行,只需要依据相关的评估报告结果即可。
后期
进入后期阶段其实整个SDL已经完成了,但是作为DevSecOps整体流程,后期维护阶段安全还是必须介入,目前很多企业的后期维护都是依赖自己的SRC系统和第三方漏洞平台。
此阶段是一个长期阶段,大概的方式包括:
1、 定期安全培训;
2、 设置安全知识库;
3、 设置应急响应渠道;
4、 设置漏洞管理平台;
5、 运营SRC平台或者第三方漏洞平台;
6、 开源代码托管平台的信息泄露监控;
7、 搭建态势感知平台等等。
总结
整个SDL过程流程并不复杂,复杂的是具体实施细节,大概概况相关的难点,当然了,任何方案都不可能满足所有的实际需求,企业还是需要根据自身的实际情况去选择落地SDL,寻找适合自己的才最重要:
1、 第三方框架防治问题,可以维护自己的三方框架库,定期安全检测。
2、 扫描误报过高,大量数据筛选困难,可以建立优化整体规则库,重点关注中高危漏洞,配合工具扫描+人工筛查的方式进行,增量扫描可排除误报后无需扫描。
3、 阻挡业务正常流程,可根据实际情况,做到适度安全,有选择的对业务放行。
4、 业务太多,人员不够,可以针对重点项目实行SDL流程,以工具及其它人员配合的方式减少SDL工程师不必要的工作量,以达到SDL工程师作为验收者的目的。
5、 跨部门协作困难,可以说法公司高层制定相关流程,指定对接人。
以上SDL整体落地依据个人理解,大家可以参考,有错误和完善的地方大家可以联系我。