SDL实践之安全实施
安全实施的工作针对的是研发团队以及研发过程,之所以称为实施,是在该过程中不仅涉及到开发工作,还涉及到包括编码规范、工具使用以及静态代码审计等非具体开发类的内容。
在SDL的安全实施步骤中,主要有三个部分的内容:
- 采用恰当的、安全的开发工具;
- 采用合理的、安全的开发库或API;
- 实施静态代码审计,即静态分析;
使用恰当的、安全的开发工具可以避免由于开发工具自身的合规问题和漏洞问题导致企业的合规风险和研发的产品中存在的漏洞,比如:由于知识产权问题,工具厂商通过律师事务所要求企业全部采用正版的开发工具或软件,因而花费大量的资金、时间和精力来解决该问题,又或者由于开发工具自带的后门让研发的代码中存在被植入的后门或漏洞(如2015年,XCode编译器中存在植入的第三方代码,非官方渠道下载的XCode编译发布的iOS应用存在后门)。
因此,采用受管控或经过审批的开发工具是安全实施的第一个环节,且能够在某类工具或产品爆出安全漏洞之后,能够统一的升级工具或产品版本,修复相关的漏洞,确保团队使用的工具是统一的、最新的版本。
常见的关于工具或系统管控的方法包括(参考笔者之前的《企业供应链安全管理与实践》):
- 终端管控
企业通过采购终端管控系统来实现对于所有员工电脑终端的管理,需要在员工电脑端安装管控软件(员工无法自行卸载,需要管理员密码),管控系统通常还带有网络准入功能,与企业内部的员工账户体系打通可以实现电脑终端的身份认证,同时通过管理端可以检查、限制甚至操作电脑终端的软件运行情况,从而可以对员工使用的应用情况进行统一检查和管理,这也是企业统一采购办公电脑的原因(不会因为人员入职和离职引入终端安全风险或造成终端管理密码泄露,如果是个人电脑,则面临离职后不知道管理员密码,需要重装系统才能卸载管控软件的问题)。在面临知识产权纠纷时,这种方式可以快速对涉及的应用进行排查,同时有利于终端设备统一管理。但该方案需要专门的岗位对终端管控系统进行管理和运营,人员的疏忽和运营的疏忽都会造成该方案形同虚设。
- 软件白名单
通过设立软件白名单库,结合企业内网的限制(无法从外网下载软件安装包),可以实现软件来源的限制,确保员工使用的软件都是来自白名单库。白名单库提供日常办公中不同岗位常用的软件,且每款软件都经过安全部门或相关部门的检查和评估,确保每个软件使用的是稳定版本和安全版本。但可能存在,白名单库中软件更新后,员工电脑的软件迟迟未更新所带来的风险,或者员工私自安装其他版本软件造成的安全风险,因此也可以采取终端管控+软件白名单的方式,通过终端监控软件的使用,通过软件白名单库提供安全可靠的软件。
- 云桌面
目前越来越多企业开始采用云桌面的方式来彻底解决终端工具风险的问题,即轻终端、重云端。企业员工通过身份验证访问云端桌面进行日常办公,包括研发工作,可以确保所有的软件在云端都是可控且安全的,但缺陷是会由于网络不稳定或网络延迟造成办公效率降低。
采用合理的、安全的开发库或API是源于诸多的安全漏洞是由于采用了过时的、不安全的API、函数、开发库或开源组件等,但凡是涉及到第三方技术引用或引入的环节都可能存在相应的安全风险或安全漏洞,比如有漏洞的API接口、不安全的开发函数、有漏洞的开源组件、有后门的Python模块或Docker镜像等等,因此需要设立相关的安全开发规范,并对代码中涉及到的API、函数、库、组件等信息进行安全检查。
仅仅有安全开发规范的弊端在于开发人员过目就忘,或者不会将其作为开发过程的指导或规则,不同的开发人员甚至会使用不同的风格、习惯以及做法来实现代码,因此依靠规范是难以约束、统一、规范开发的。在软件代码版本管理过程中,选择适当的版本管理方式或流程(如Git Flow或GitHub Flow),并在此基础上增加每一次PR(Pull Request)的人为Code Review操作,可以通过固定岗位的(可能)固定人员实现所有人员代码质量的审核和批准,确保所有人员的代码质量和代码风格保持一致,比如:是否符合开发规范、是否引入不安全的函数、是否使用不安全的API等等。
但仅仅依靠人工审核无法应对中大型开发团队每天雪花似的PR,因此可以结合企业自身的开发流程和CI/CD流程,在人工审核之前加入自动化的静态分析,即通过工具对于代码的静态分析,实现固定规则或指定规则的符合性检查,例如,开发人员需要自己实现对于代码的镜像打包、自动化静态分析、自动化测试等等,之后才能执行代码合并请求,进入到人工代码审核的环节。
因此,静态分析工具能够自定义检查规则或分析规则的功能便尤为重要,通过设定编码规则可以大大降低人工代码审核的工作量,但由于代码审核范围不仅仅包含代码质量和代码安全(如需求吻合性、代码设计合理性等等),因此人工代码审核的必要性依然存在。
对于发布频率高的业务线而言,每一次发版和更新都经过上述的人工代码审核或静态分析,根据不同公司的软件研发过程管理的成熟度而言会面临不同的发布成本或周期成本,根据本系列文章第一篇《SDL实践之安全教育》所述,可以重点针对涉及到业务系统的、个人隐私的或者网络传输的系统进行上述操作,根据不同系统的定位和重要性,选择不同的安全实施手段和过程,可以降低安全实施所带来的高昂成本。