开源,顾名思义,即开放软件源代码。代码贡献者可将自己编写的程序提交到开源社区的公开平台上,其他代码开发者如有类似的功能需求可以不必再自己动脑动手编写代码,而是直接集成、修改或应用贡献者公开的代码。
开源软件是通过特定类型的许可证发布的软件,作为全球软件开发的基石,已成为全球发展、数字化与信息化变革的重要技术来源。针对开源软件运维安全,建议采用如下防护手段:
1、建立软件材料清单
软件材料清单 (Software Bill of Materials, SBOM) 必须由项目维护者生成、维护和详细提供,使用自动化软件成分分析 (Software Composition Analysis,SCA) 工具检查所使用的组件,以及检查是否含有恶意代码或者漏洞组件。SBOM 必须由包存储库安全地托管和分发,并由下游用户仔细检查他们的安全性、质量和许可证需求。
2、强化静态分析检测
针对开源代码开展静态分析以检测其存在的漏洞或其他风险隐患,主要基于两种技术。一种技术为不同代码间的特征比对,该技术的本质为用同一种特征提取手段分别提取目标代码 Code_A 的特征 Ca 与参考代码 Code_R 的特征Cr 并进行对比,如果代码特征相同,则意味着代码内容一致,其风险点也一致。另一种技术为不同代码之间的依赖关系比对,该技术通常需要对完整代码而非截取代码片段进行分析,其主要基于比对不同代码中依赖的外部函数库或组件,如果目标代码 Code_A引用了已知存在风险点的代码库或函数 Code_B,则目标代码通常会存在相同的风险点。
3、加强安全身份验证
建议服务提供者提供多因素身份验证 (MFA) 或实施强密码策略,而项目维护人员应该遵循身份验证标准,例如,在可用的情况下使用 MFA,避免密码重用,或保护敏感令牌。
4、 启用分支保护规则
维护人员应该进行仔细审查合并请求,或者为敏感的项目分支启用分支保护规则,以避免恶意代码贡献。由于项目构建仍然可能发生在维护人员的工作站上,建议他们使用专用的构建服务。可以隔离构建步骤,这样攻击者就不能篡改构建完成的项目。
5、独立完成包构建
软件包的构建不应该由下载时临时构建,建议由包存储库实现,以此减少破坏项目构建的风险。如果由使用者构建,这将消除与第三方构建服务和包存储库相关的所有风险。在使用时可以通过隔离代码或沙箱来减少恶意代码执行的影响。
6、 建立开源治理体系
构筑健全的开源软件治理体系,设计符合企业自身情况的开源治理流程,有助于确保开源治理工作的可落地性,促进开源软件的管理规范化、标准化,是安全、合规地使用开源软件的根本保障。
- 让安全治理贯穿软件生命全周期,全面保障开源软件安全;
- 使开源软件的使用规范化、体系化,纳入企业常规管理流程;
- 贯彻开源软件安全使用意识,明确开源治理对于企业业务发展的重要性;
- 及时掌握开源技术发展动态,加强开源技术创新提升,掌握核心技术能力。
梳理开源软件安全风险点有助于提高对开源软件安全威胁的认识,如何把控开源软件的运维安全:
一是安全防护需要所有环节的人员去共同维护,攻击者需要找到链条中单一弱点即可,而防御者需要覆盖整个攻击面。
二是应提升所有环节人员的安全意识,从根本上解决安全问题。
三是使用规范的软件开发环节,使得代码开发流程无懈可击。
四是完善安全审计工具,协助开发者解决自写代码、引入代码中的安全问题。
五是对所有引入代码、开发人员不可信,对依赖的开源代码、开发代码多次扫描,防止投毒、漏洞的引入,甚至是内部人员的恶意攻击。
六是开源代码使用者需从官网下载代码,并根据自己需求,审查许可信息和执行漏洞扫描。