近日,在「江狐会」广州站上,极狐(GitLab) 高级解决方案架构师武让分享了如何通过三大阶段 + 四大要点,规避代码安全「马奇诺防线」,真正确保软件供应链安全。以下内容整理自本次演讲。Enjoy~
先跟大家分享一个故事
一战结束后,曾遭到德国重创的法国,为了防止德军再次入侵,举国之力,耗时 10 年、耗费 50 亿法郎,在东北边境构筑延绵数百公里的马奇诺防线,堪称军事上的一大奇迹。
然而实战中,德军并没有去死磕马奇诺防线的正面防区,他们绕道至法国北部进而长驱直入。这座“世界上最强防线”成了摆设。
现在,“马奇诺防线” 被用来比喻劳神费力而没有用处的东西。
图片来源:https://www.douban.com/note/711063488/?type=like&_i=4225104GznZ_E5
代码数据作为企业核心数据资产,同样要避免 “马奇诺防线” 式的保障,那么应该如何保证代码数据安全呢?我们基于 300+ 家企业的实践经验,总结出保障代码数据安全的四大要点:
保密性 + 完整性 + 可用性 + 安全性
保密性即要确保数据不能够泄漏。
近年来,国内外知名科技企业源代码泄露事件屡见不鲜,不仅对企业造成直接的经济损失,也损害了品牌形象。如何避免类似事件?极狐 GitLab 提供覆盖「事前 - 事中 - 事后」三个完整阶段的代码防泄漏总体思路。
「事前」主要是对整个代码仓库及代码平台进行权限控制,包括:
可通过 Email 黑白名单限制账号注册:
可关闭注册,通过与企业内的 AD / LDAP / SSO 等权限系统或单点登录系统打通,不允许用户自由创建用户。
极狐 GitLab 专业版中的 AD/LDAP 组同步、SAML 组同步等高级功能,还可以实现将第三方用户管理系统中的用户组直接同步到极狐 GitLab 群组中,更便于企业管理。
2FA 双因素认证开启后,除了用户名密码外,还需要提供第二层认证因素(比如手机验证码)才可以登录账号,能够有效防止用户在不小心丢失用户名密码的情况下,账号被恶意登录使用。
该功能限制用户在指定网络环境下才可以访问代码仓库。
例如企业有外包团队,那么代码需要对其开放,可通过在群组中添加公司内网或某办公区 IP 地址为 IP 访问白名单,不同群组可设置不同的 IP 访问白名单。这样,外包团队只能在指定办公区网络下才可以访问代码仓库。
非 IP 访问白名单网络则无法访问:
极狐 GitLab 用户角色授权功能具有高灵活性,可以根据组织或项目团队的实际情况选择以群组授权或用户授权,不同的用户角色具备不同的可执行权限。
在实际应用中,极狐 GitLab 建议系统管理员遵循最小特权原则(Least Privilege),只给用户分配所需功能的最小权限,同时定期对用户权限进行审查,避免权限管理失控。
GPG 或 GnuPG (GNU Privacy Guard) 是一个遵照 OpenPGP 协议的用于加密、数字签名以及认证的软件工具。
GPG 在代码提交中主要用来确定提交人身份,防止被恶意篡改的代码进入源代码仓库。它需要在用户本地生成一对密钥(公钥/私钥),将公钥上传到极狐 GitLab 中,并在代码提交时用对应的私钥进行签名,当代码上传到极狐 GitLab 服务器时,极狐 GitLab 会用公钥进行验证签名是否匹配。
使用方式:git commit -S -m "My commit message"
「事中」则是需要通过 DLP 网关来保障数据安全。
极狐 GitLab 可以与 DLP、零信任网关集成,从根本上解决了代码泄露问题。
如下图,不论是 OA、ERP 或极狐 GitLab,所有数据都会经过 DLP(Data leakage prevention,数据泄漏防护)网关,才可以被读取到开发人员电脑上。
通过 DLP 网关拉取下来的代码在磁盘中是加密状态,即便通过 U 盘或者其他方式发布到外网也无法直接打开,只能通过 DLP 网关信任的客户端、IDE 打开,在内存中是解密状态,可进行正常的开发工作,一旦落盘存储就又变为加密状态,从而实现数防泄漏。
DLP 网关虽然在代码防泄漏的效果上表现最佳,但 DLP 成本往往比较高,对使用人员的用户体验也有一定程度上的影响,所以比较适合对数据保密要求高的的企业或项目团队。
极狐 GitLab 可以集成行业内主流的 DLP 网关如 IPGarud、绿盾等,并且可以关闭在极狐 GitLab 网页上下载代码,限制获取代码的渠道,以便更好的与 DLP 工具集成,进一步提高数据保密性。
最后是「事后」措施。它主要是对极狐 GitLab 中所发生的事件、人员行为进行记录、分析、追踪,甚至是告警,以实现对代码泄露事件的防范或追溯。
例如,谁在什么时间,通过什么 IP,从代码库中拉取了什么代码,拉取了多少次等,这些信息都可以记录下来。有了这些信息,则可以进行规则设置。
举个🌰,在 “晚上 12 点之后,早上 6 点钟之前” 这个时间段,如果有用户超过 5 次去拉取代码,判断为一个高风险的事件,触发一个邮件通知。系统管理员或指定人员可以将这个用户的状态变成冻结,阻止其访问;同时可以对该行为进行分析和追踪。
图:审计事件
图:审计告警
这里的「事后」是相对于「事中」而言的,它具有一定的延后性,但它的成本相较于「事中」的方式大幅降低,依然可以作为绝大多数企业或团队实现代码数据保密性的主要手段。
曾有企业客户在极狐 GitLab 数据库上做了错误操作,致使数据库无法使用,并由于只有一个实例,没有任何备份,导致数据全部丢失,无法挽回。如何避免这种 “悲剧” ?
极狐 GitLab 提供高可用扩展性架构,其源自全球最大代码托管平台之一的 GitLab.com 十多年的技术实践沉淀,该架构通过了全球 3000 万注册用户的检验。
极狐 GitLab 高可用扩展性架构通过把极狐 GitLab 中所有组件单独抽出来,以分布式集群的方式部署,每一个服务和组件都是多副本的,在整体架构设计上不存在单点故障,并结合负载均衡、水平伸缩、分布式架构、主从多副本机制和云原生等多种机制,实现理论上无限扩展的能力。
极狐 GitLab 提供支撑从 1000 人到 50000 人规模架构最佳实践参考和专业服务支持,为企业构建高度可靠 DevOps 研运平台保驾护航。
近期,极狐 GitLab 正式发布《中国企业研发高效能白皮书 · 企业级软件架构篇》,基于 10 万+ 企业客户成功实践经验,为不同企业规模、集中或分布式团队,量身定制成熟的企业级软件架构方案。
极狐 GitLab 在数据存储方面使用了多个组件,如 PGSQL 用于存储用户信息、仓库路径等元数据、Redis 可作为缓存或消息队列,因为 PGSQL 和 Redis 作为主流中间件都有自己的高可用方案,所以不少客户已经将极狐 GitLab 实例中的这些组件替换为第三方的高可用组件,这是一个好事,说明大家对高可用很重视。
但极狐 GitLab 中最核心的存储组件却不是 PGSQL 也不是 Redis,而是 Gitaly,这是 GitLab 自研的组件,用于对代码仓库进行管理和指令互动,因此它的地位最重要,负载也最高。
因为有些企业的数据量多达 30 T 级别,使用单个磁盘或单个节点的成本很高,且性能无法保证。Gitaly Cluster 高可用 Git 仓库服务持多副本和分片,把不同的代码库分到不同的存储片上,这也是提高可用性和性能的方式。
相较于支持 1000 人起步的高可用可扩展架构,极狐 GitLab GEO 多地域部署架构则更为轻量和简单,更加适合中小型企业。
GEO 多地域部署架构实现一主多从,主从之间的数据实时同步。
不同于传统数据库冷备份,RTO(Recovery Time Objective,恢复时间目标) 基本上是 24 小时,可能就丢失了一天的数据。
极狐 GitLab GEO 多地域部署方案是热备份,即便主节点宕机,也可以把从节点处将其恢复,或提升从节点为主节点,那么丢失的数据最多是 1~2 分钟的数据。
所以 GEO 多地域部署的时效性和可靠性大大高于传统冷备份方式,属于准高可用,同时是灾备架构,并支持异地容灾。
近年来,软件安全问题日趋严重,其类型也不尽相同,如勒索软件事件:
1. 2021 年 2 月,起亚汽车遭勒索,黑客要求支付 1.35 亿赎金,若当天不支付,将追加至 2 亿元。
2. 2021 年 3 月,黑客组织攻陷了特斯拉摄像头供应商 Verkada,特斯拉以及美国监狱、警察局、医院和学校等 15 万个监控摄像数据遭泄露。
3. 2021 年 4 月,黑客通过勒索攻击,窃取了苹果的设计蓝图,索要 5000 万美元(约 3.25 亿元)赎金。
还有软件漏洞和开源及第三方组件风险,据统计,国内有 90% 以上公司都使用了第三方开源代码,这个数字还在逐年增高。这些开源代码本身可能存在安全问题。
数据来源:漏洞知识库(CVE)&中国国家信息安全漏洞共享平台(CNVD)
传统软件安全主要关注软件运行过程中的安全,一般是在软件发布、交付前后对软件应用的安全进行测试和评估。鉴于以上种种,传统软件安全测试和评估已经无法定义现阶段的软件安全了。软件供应链安全,应需而生。
“供应链” 一词来源于制造业。如何评估一辆汽车是否安全?
软件供应链安全与制造业供应链安全如出一辙。
在软件领域的供应链是指的是软件从开发到交付的全过程,软件的供应链安全是软件安全威胁的源头。
在 CNCF 的《软件供应链安全白皮书》中,强调了分层防御实践的重要性,并提供了从以下五个维度来提升软件供应链安全的整体方法。
SDL 是过去 20 年中普遍使用的一种方式。
如下图,华为内部有一套安全红线,包括了安全基线、规范标准指导书、各种各样的扫描工具,每个项目研发流程需要遵循这一套机制,运行各种审核,各种节点确认,来保证产品和项目交付安全,可想而知其成本之高和效率之低。
DevSecOps 相较于 SDL ,成本更低,效率更高。
DevSecOps 在软件开发过程的每个阶段集成安全测试的实践,它包括鼓励开发人员、安全专家和运营团队之间协作的工具和流程,以构建既高效又安全的软件。DevSecOps 带来了文化转型,使安全成为开发软件的每个人的共同责任。
这个机制是如何运转的呢?
极狐 GitLab 将安全扫描集成到 DevOps 工作流中,通过流水线自动化执行,将安全实践融入软件开发的每个阶段,在代码上线前,就能够帮助用户更高效地发现问题、追踪问题,更低成本地解决问题。
以往工作流程中,安全工程师测试后,将漏洞报告发送到工作群,请研发工程师逐个修改。但研发工程师只看到了漏洞,而具体的漏洞所在的位置等信息全然不知,修复起来十分低效和繁琐。
极狐 GitLab 提供的漏洞详情和报告如下图,清晰展示了漏洞所在项目、在哪个文件的第几行、漏洞级别等信息;针对需要修复的漏洞,安全工程师一键「创建议题」,研发工程师即可 “对症下药” 开始追溯和修复漏洞,高效明了。
那么,极狐 GitLab 到底是怎么真正把安全问题左移到开发阶段,并且强制要求开发人员去解决呢?
这里用到安全策略和安全门禁设置。
如下图例子,在这个项目中,要求 SAST 静态应用测试不允许超过 1 个严重漏洞,依赖扫描不能超过 2 个高等级漏洞,如果超过了,代码则不允许被合并或发布。设置了这样的安全策略后,研发人员就必须遵守,否则代码合不上去。
但如果真的有紧急的事情,或是发版迫在眉睫,客户催得很紧,怎么办?可以通过评审人员人工确认,共同担责。
对于代码数据安全,除了上面提到的一些措施,还有哪些方式可以提升代码数据的安全性?这里列出一些方案,供大家参考和思考:
大家可以发现,对于数据安全需要考虑的事情、能做的事情实在是太多了。所以我们常说没有 100% 的安全。安全是一场博弈,需要综合考虑可能造成的损失成本与保障安全的成本,来决定采用何种安全措施。不可一叶障目,也不可矫枉过正,唯有先事虑事、因地制宜才可在有限的资源下获取最大化的安全。