一个不眠之夜
“叮叮叮,叮叮叮”,一阵急促的微信消息声将正在熟睡中的小安吵醒,小安下意识的拿起枕边的手机一看,凌晨三点半,手机屏幕上满满的都是源代码托管服务器发来的告警,他赶紧查看告警详情,内容都是:用户:小蓝,IP:192.168.0.100,正在克隆xx仓库。
多条告警显示,小蓝正在大量克隆公司内部项目仓库。起初,小安以为是源代码仓库遭到了恶意攻击,但是仔细一看用户信息,明显是公司内部人员,而且只克隆与公司近期研发的 AI 医疗相关的仓库,其他产品线的并未克隆,小安认为公司内部人员不会在半夜三更还进行产品研发。
来不及多想,为了保证公司代码安全,小安将 IP 和用户名纳入了代码仓库管理的黑名单中,告警戛然而止,代码托管服务器日志也没有其他异常。小安悬着的心终于落地了,带着疑惑小安又眯了一会儿,等待上班。
第二天上班,小安将昨晚的事情告诉了 SRE 团队的其他成员,顺便说起了那个用户 ID,结果其中一位同事说,那个 ID 是一个核心研发的,他一直在负责公司创新项目 AI 医疗的研发工作,听说前段时间,有一家初创企业给了难以拒绝的待遇,所以近期已经在办理离职了。小安觉得事情不简单,于是立马将此情况向安全合规经理进行了汇报。安全合规经理非常重视这件事,立马和研发负责人进行沟通。
事后得知,小蓝即将加入一家初创公司,他想把自己曾经编写的一些算法代码带过去,而这也是他高薪待遇的一个条件,于是小蓝在晚上大家都进入梦乡的时候,用自己尚有权限的账号将过往的代码克隆下来,没想到克隆刚开始不久突然账号就被封锁,无法执行任何操作。
在月度安全合规复盘的时候,小安因为敏锐的安全感和及时采取的止损措施受到了安全合规经理的表扬,小安有些腼腆地说:都是源代码托管平台的安全审计帮了忙。
源代码托管:最容易被从内部攻破的堡垒
上面小安公司遇到的情况就是软件研发领域非常常见的源代码泄漏事件。现如今随着企业数字化转型的逐步深入,软件已经成为支撑企业数字化转型的重要支点,而作为软件原材料的源代码自然也成为了企业的核心资产,源代码的泄漏或者受损也就意味着企业核心资产的受损。
然而,企业源代码泄漏的事件却频繁发生,比如 2018 年,某国际知名电子产品消费厂商发生了源代码泄漏事件,起因是一名实习生在离职的时候带走了部分源代码,然后将其分享给了做安全研究的朋友,随后朋友将代码上传到了 GitHub 仓库上面,最终导致源代码泄漏,影响了大量使用该公司电子产品的用户;再比如 2022 年,某国际知名汽车厂商发生了严重的数据泄漏事故,多达 300,000 万的客户数据被泄漏,里面包含大量的个人敏感信息,事后分析得知,数据泄漏的原因是分包商不小心将代码上传到了公共仓库,而这些代码包含了重要的敏感信息,从而影响了 2017 - 2022 年间注册了厂商某 App 的所有客户。
源代码的安全防护是一个重要话题,需要采取多种手段来构建立体的防护机制,比如用户登陆认证授权(事前)、用户访问权限控制(事中)以及安全审计(事后)等。针对上面的几个代码泄漏事件,如果用好源代码托管的审计事件功能,是可以进行规避的。
审计事件,构建源代码安全防护的“最后一道防线”
所谓审计事件是对重要事件进行追踪,通过对事件操作行为的分析来及时阻止不合规的操作,最终保障事务主体的安全性。
对于源代码托管来讲,审计事件主要是对于源代码托管平台的操作进行追踪,诸如用户增删、代码仓库权限及访问等,以便及时发现不合规的操作,避免源代码遭遇泄漏。
源代码托管审计事件三要素
源代码托管的审计事件的关键要素是三个“W”:
- Who:事件的操作主体。主要指对源代码进行操作的用户;
- When:事件发生的时间。主要指用户对源代码托管平台执行某些操作时的具体时间;
- What:操作主体做了什么具体操作。主要指对代码仓库的一些具体操作,诸如代码克隆、推送及拉取,仓库的可见性变更及用户添加和删除等。
源代码托管审计事件的价值
审计事件是构建源代码托管平台安全防护网的重要一环,完整的审计事件具备以下价值:
- 防患于未然,及时止损:通过分析用户的行为,及时发现不合规的操作,比如短时间内大量克隆代码仓库、将私有仓库改为公共仓库等,然后采取对应的措施来阻止不合规操作对应源代码的进一步操作,避免造成源代码泄漏或受损;
- 找事件真因,快速定位:如果发生了源代码泄漏或者受损的状态,可以借助审计事件进行事故回溯,在过往的审计事件中找到可疑的人员、可疑的操作,再通过快速排查来找到事故发生的真正原因;
- 立安全警钟,避免后患:完整的安全审计流程可以告诉内部人员,任何不合规操作都会被发现,如果触碰公司安全合规红线,就会受到公司的相应处罚,让所有公司人员形成安全合规意识,共同保护公司核心资产安全。
极狐GitLab 审计事件功能
极狐GitLab 作为一体化的 DevSecOps 平台,具备完整的审计事件体系,包含从实例级到群组级再到项目级,而且覆盖用户管理、认证授权、项目管理、代码写作、CI/CD 等方面。截止到 16.2 版本,极狐GitLab 共有 132 项审计事件,而且还有部分审计事件在积极开发中。
极狐GitLab 审计事件功能特点
极狐GitLab 审计事件功能是极狐GitLab 安全合规能力的重点功能之一,是付费功能(仅在专业及以上版本中可用),具备以下特点:
- 开箱即用:极狐GitLab 审计事件功能开箱即用,用户无需进行额外配置,只需要导入付费版许可证即可开启使用,在对应的路径下即可查看针对实例、群组及项目相关的审计事件;
- 事件丰富:极狐GitLab 审计事件涵盖的范围广,包含的审计事件类型丰富,如上图所示,截止 16.2 版,已有 132 项可用的审计事件,能够建立起一个很完善的审计防护体系;
- 迭代更新:极狐GitLab 采取月度发版机制,能够对审计事件功能进行持续地迭代更新,据统计,在最近一年的发版(12 个版本)中,大约有 13+ 个与审计事件相关的重大改进发布,进一步改进了审计事件的功能;
极狐GitLab 审计事件功能使用
针对实例级别的审计事件,可以通过管理中心 → 监控 → 审计事件来查看。比如可以在实例级别的审计事件中看到 SSH key 添加、个人访问令牌创建、群组/项目创建、删除等事件。
审计事件会明确记录事件的操作主体(Author)、操作内容(Action)、操作时间(Date)及操作源 IP 地址等信息。
同样地,可以通过群组 → 安全 → 审计事件查看与群组操作有关的事件:
由于极狐GitLab 群组可以进行嵌套,因此可以用同样的方法查看子群组的审计事件信息。
通过项目 → 安全 → 审计事件查看与项目操作有关的事件:
此外,还可以将审计事件报告进行导出,然后发送给审计人员,审计人员可以在报告中通过过滤去查看对应的审计事件详情。
关于极狐GitLab 审计事件的所有类型(实例级、群组级、项目级、其他)可以查阅极狐GitLab 审计事件官方文档。
审计事件能够记录用户对于源代码托管平台的各种操作,但是不具备异常行为(可配置)的告警功能,以便在异常行为发生时,快速操作,及时止损。为此,极狐GitLab 提供安全审计事件流功能,将审计事件发送到第三方,配合第三方的事件分析 + 告警功能来实现异常行为的告警。
审计事件流(audit events streaming)为旗舰版功能。
源代码托管的金丝雀:极狐GitLab 审计事件流
极狐GitLab 审计事件流功能可以将审计事件流发送到外部的流数据系统(可以接受并处理 JSON 格式的数据),然后再由流数据系统对数据进行分析、存储、可视化及告警等操作。
可以为极狐GitLab 实例、群组、子群组设置外部流数据系统。针对实例、群组/子群组及项目的操作事件就会以事件流的方式发送到配置好的外部流数据系统。审计事件流中除了上述的审计事件外,还包括对于 Git 操作的信息,比如对于代码的克隆(SSH 或 HTTPS)/推送、仓库的 Fork、MR 的创建等,而且审计事件流的功能会跟随版本的更新而持续迭代。
更多关于极狐GitLab 审计事件流的内容可以查看极狐GitLab 官方文档。
极狐GitLab 审计事件流的使用需要首先配置外部流数据系统,以实例级别的配置来讲,可以通过管理中心 → 监控 → 审计事件 → 事件流 → 添加流目的地来完成:
极狐GitLab 审计事件流服务会将审计事件信息推送到配置好的服务里面,以克隆仓库来讲,如果授权用户克隆了某个仓库,那么外部流数据系统会收到如下的 JSON 信息:
{
"id": "5e194963-79bc-43ce-99f3-4190ff105b23",
"author_id": 1,
"entity_id": 6,
"entity_type": "Project",
"details": {
"author_name": "Administrator",
"author_class": "User",
"target_id": 6,
"target_type": "Project",
"target_details": "jh-gitlab-audit-events",
"custom_message": {
"protocol": "ssh",
"action": "git-upload-pack"
},
"ip_address": "127.0.0.1",
"entity_path": "xiaomage/jh-gitlab-audit-events"
},
"ip_address": "127.0.0.1",
"author_name": "Administrator",
"entity_path": "xiaomage/jh-gitlab-audit-events",
"target_details": "jh-gitlab-audit-events",
"created_at": "2023-08-24T02:38:24.945Z",
"target_type": "Project",
"target_id": 6,
"event_type": "repository_git_operation"
}
上面信息表明了操作人员信息(author_name)、执行动作(details.action)、操作仓库(details.entity_path 或 target_details)还有操作日期(created_at)、IP(details.ip_address 或 ip_address)等信息。可以将上述信息进行存储、分析、可视化及告警来事件审计事件闭环。下面以 EFK(elasticsearch、filebeat、kibana)为例来演示整个过程。
将 filebeat 配置外部的流数据系统,直接接受来自极狐GitLab 的审计事件流信息,然后 filebeat 将数据处理之后存储到 elasticsearch 中,再利用 kibana 的可视化能力实现对于审计事件信息的可视化处理,最后借助 kibana 的 alert 功能实现对异常操作的告警(发送邮件、slack 消息或推送到其他系统)。
可以在 kibana 中看到的审计事件信息,诸如密码变更、仓库可见性变更(从公开到私有或者相反)、项目删除等:
如果配置对应的 alert,当某项操作发生或者超过一定阈值时就触发告警,通知相关人员做进一步的处理。诸如当一个项目在一定时间内被某一个人频繁克隆,则可以触发告警,发送告警邮件到指定邮箱:
或者发送到钉钉等 IM 系统上:
源代码作为企业的核心资产,应该受到重视,需要打造全方位的安全防护体系,而安全审计是作为保障代码核心资产外泄的一个重要手段。极狐GitLab 审计事件和审计事件流能够形成代码安全审计的闭环,可以让用户对源代码仓库的操作都“活在阳光下”,及时发现违规、异常的操作来避免企业核心资产受损。