当代企业,离不开软件技术。软件是工程师编写的,难免可能存在质量或安全问题,这些问题可能在生产环境中引发严重的故障,直接造成企业的经济损失和信任危机。为了将风险降至最低,建议在编码过程中启用一系列的自动化扫描服务,尽早的发现问题,将风险扼杀在摇篮中。
1 、用户的诉求或问题
-
编码不规范:开发者专业度有限,特别是依赖外包团队的情况,业务代码通常没有通过细致的设计,也很难保证兼容性和扩展性,存在隐藏的缺陷和故障风险;
-
敏感数据泄露:开发者缺乏安全意识,企业的敏感信息直接编写到代码中,可能造成敏感信息的外流,进而使得不法分子有机可乘,造成企业损失;
-
依赖项存在安全漏洞:代码中免不了引入二方或三方的依赖包,特别是引入开源依赖包的场景下,很可能自身代码保护周全,但是依赖的代码存在安全漏洞,使得不法分子可以通过这些漏洞发起攻击;
-
代码优化:开发者编写了代码,期望能够得到专业的代码优化建议;
2、开启代码扫描服务
云效代码管理内置了多种扫描服务,为了保证每次提交都能及时的获取扫描结果,建议在创建代码库后,立即前往对应代码库代码检测中新建检测任务。
立即体验:云效代码管理
在新建检测任务对话框的检测参数区域,编译环境选择 JDK 1.8,编译工具选择 maven 3.6.3,运行集群/器选择云效默认构建集群,编译命令保持默认的 mvn 构建命令。勾选已阅读并同意检测服务协议后单击新建并执行。
选择Java推荐检测方案(需编译),按上述参数配置,并选择触发方式:提交触发或合并请求触发。
-
提交触发在每次提交后,将自动触发相关分支的全量扫描,即扫描分支下的所有内容;
-
合并请求触发在创建或更新合并请求后,将自动触发源/目标分支的增量扫描,即扫描源/目标分支变更的内容(Diff);
接下来依次介绍方案中包含的扫描服务:
(1)代码质量——Java 开发规约检测
《阿里巴巴 Java 开发手册》是阿里内部 Java 工程师所遵循的开发规范,涵盖编程规约、单元测试规约、异常日志规约、MySQL 规约、工程规约、安全规约等,这是近万名阿里 Java 技术精英的经验总结,并经历了多次大规模一线实战检验及完善。根据约束力强弱,规约依次分为强制、推荐、参考三大类:
【强制】必须遵守。是不得不遵守的约定,违反本约定或将引起严重的后果。
【推荐】尽量遵守。长期遵守这样的规则,有助于系统稳定性和合作效率的提升。
【参考】充分理解。技术意识的引导,是个人学习、团队沟通、项目合作的方向。
Java 代码规约扫描使用《阿里巴巴 Java 开发规约》插件扫描 Java 规约问题。
(2)代码安全——敏感信息检测
敏感信息检测功能,可以检测代码库中的敏感凭证和密钥,比如 API keys 等信息。集成在合并请求代码评审阶段,可以有效防止敏感信息意外提交。
敏感信息问题等级分为:BLOCKER、CRITICAL、MAJOR。
BLOCKER: 通过规则扫描出来的可能性很高的明文问题;
CRITICAL: 通过信息熵模型得出的可能性较高的潜在问题;
MAJOR: 用于测试的敏感信息字段;
(3)代码安全——依赖包漏洞检测
为了杜绝安全隐患,企业需要做到以下三点:
1.了解工程都使用了哪些依赖包;
2.删除不需要的依赖包;
3.检测并修复当前依赖的已知漏洞;
依赖包漏洞检测服务帮助企业方便的检查其工程依赖包的安全性。
依赖包漏洞等级分为:BLOCKER, CRITICAL, MAJOR,等级划分根据国家漏洞数据库CVSS制定。
BLOCKER: 高危漏洞,建议立即修复;
CRITICAL: 中危漏洞,建议尽快修复;
MAJOR: 低危漏洞;
3、提交代码执行检测
为了保证代码问题不被引入生产环境,越早进行检查,引入的风险越小。因此,建议能够在每次提交时都进行代码检测,从起点发现并扼杀问题,保障后续应用研发流程的稳定性。
开启检测服务时,勾选代码提交的触发方式,此后库内的每次提交都会自动执行对应的自动化检测,检测当前新提交的所有文件,可在源文件或提交页面查看检测结果:提交代码后,代码仓库页面弹出检查状态浮层,显示部分检查未通过,其中my_yunxiao_projext-检测任务显示为失败状态。提交代码后,提交记录旁显示红色未通过标识,单击该标识弹出浮层提示部分检查未通过,其中my_yunxiao_project-检测任务显示为未通过状态。
可点击检测任务展开问题详情查看,严重级别的问题建议立即解决,这类问题容易引起故障或安全漏洞:检测结果弹窗显示检测不通过,本次全量扫描共扫描9个文件,发现9个问题:2个严重、4个警告、3个建议,问题分布在 pom.xml、DemoApplication.java、DemoApplicationTests.java 三个文件中,可单击查看详情进一步定位具体问题。
4、合并请求执行检测
开启检测服务时,勾选合并请求的触发方式,此后库内的每次创建合并请求或合并请求源分支有新提交,都会针对变更文件自动执行对应的自动化检测,保证新增期望合并至目标分支的代码质量和安全。
可在合并请求列表和详情页面查看检测结果:合并请求执行检测完成后,在合并请求列表中可查看检测结果。检测通过时,合并请求右侧显示绿色通过图标,单击可展开检查状态浮窗,显示全部检查通过及具体通过的检测任务项(如my_yunxiao_projext-检测任务)。在合并请求详情页中,单击自动化检查页签查看检测结果。页面展示检测统计(检查通过、不通过、运行异常、运行中数量)及具体检测任务结果,包括严重问题、警告问题和建议问题数量,以及待解决问题列表(含规则名称、文件名、严重等级和问题引入人等信息)。
点击待解决可查看详情,可以跳转到代码行内查看具体问题代码:在合并请求详情页中,切换到文件改动页签可查看代码差异;右侧检测问题面板按严重、警告、建议等级分类展示自动化检测发现的问题及修复建议,页面右上角待解决按钮显示当前未处理的问题总数。
5、检测追溯
针对安全类问题,通常需要统计或追溯历史,因此云效代码库中提供了专门的看板,用于承载检测出的全部问题,并记录了已解决的历史数据。
立即体验:云效代码管理
在代码库左侧导航栏单击代码检测进入检测任务看板,选择问题列表 Tab 页签。看板将问题分为未解决和已解决两部分,每条问题展示类型(安全/规范)、文件名、问题等级(严重/警告/建议)、问题引入人及引入时间,顶部提供问题等级、类型、规则包、引入人、引入时间等筛选条件。
同样,可点击问题名称查看详情和推荐的解决方案:检测任务页面的问题列表按安全类和规范类分类展示,并统计未解决与已解决数量。单击具体问题条目(如ClassMustHaveAuthorRule),右侧详情面板展示问题状态、引入提交、对应文件路径及代码片段和修复建议。
TIPS:针对敏感信息检测,若部分文件希望跳过扫描,可以使用文件白名单的功能,白名单内的文件将不被检测。在代码库首页的检测方案中,找到配置的检测方案添加文件白名单。在代码检测 > 检测方案页面,选择目标方案(如Java推荐检测方案(需编译)),单击设置页签,可配置方案名称、方案描述及文件白名单(支持 ?、*、** 通配符匹配)。页面底部提供删除方案操作(删除后不可恢复)。
总结
将测试阶段左移,对每次提交和合并进行自动化检测,保证存量和新增代码的质量和安全,能够有效的提升研发效率,助力企业更好的实现业务价值。