1 行代码开启「密钥检测」,给敏感数据加上防护锁

 近日,在「DevSecOps 软件安全开发实践」课程上,极狐(GitLab) 高级专业服务交付工程师韩飞、极狐(GitLab) 前端工程师任治桐,分享了密钥检测的背景、应用及处理,并演示了极狐GitLab 密钥检测功能,快用 1 行代码开启密钥检测功能,给敏感信息加上安全锁。

以下内容整理自本次直播,你也可以点击观看视频回放或下载 PPT。Enjoy~

在应用程序开发过程中,开发人员为了本地 debug 方便,会 hardcode 一些信息,比如连接数据库的用户名、密码、连接第三方 APP 的 token、certificate 等,如果在提交代码的时候没有及时删除这些信息,则非常容易造成敏感信息泄漏,带来被拖库、撞库等风险。

举个例子:某公司一名工程师无意中将与客户往来的邮件以及系统登录信息(包括密码、密钥对和私钥)上传到公开的存储库上,黑客就使用公开的密码和密钥进入企业内部系统,进行偷窃数据、发布非法信息等操作,给企业造成了重大经济损失,严重影响客户信任与企业名誉。

类似的密钥信息泄漏案例屡见不鲜。有没有一种办法,能够在开发人员提交代码前,就提前发现代码中的密钥信息,规避密钥泄露风险?密钥检测应运而生。

密钥检测常见做法


企业进行密钥检测常用的方法包括:自研检测工具、开源工具整合、第三方检测服务、混合使用等。这些方法都有其优劣势,例如:

  • 自研检测工具:最大限度契合企业环境与需求,但需要投入大量人力与资源;

  • 开源工具整合:依赖开源工具的检测能力,需要自行维护与升级;

  • 第三方检测服务:可以快速建立密钥检测能力,但需要承担服务费用,功能上也受制于服务提供商,可持续性低;

  • 混合使用:工具链复杂,需投入资源进行管理与维护。

极狐GitLab 密钥检测优势


极狐GitLab 认为密钥检测是 DevSecOps 的重要话题,与软件开发全生命周期中的每一个人息息相关,最好的方式就是将密钥检测集成到 CI/CD 中,在开发人员提交代码时就同步进行检测,真正做到安全左移,持续监测

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第1张图片

一体化:简化管理难度与复杂度

密钥检测作为七大 DevSecOps 功能之一,内置于极狐GitLab 中,无需繁琐的软件部署,实现扫描报告、配置、计划任务等统一界面管理,无需在多个软件系统之间切换,充分简化管理难度与复杂度。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第2张图片

配置简单:一行代码,即可启用

只需在极狐GitLab CI  配置文件中增加一行代码,即可将密钥扫描模板导入流水线,轻松启动密钥扫描,发现并修复项目的密钥安全问题。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第3张图片

覆盖全面:100 + 密钥扫描选项

极狐GitLab 密钥检测包含 100 + 种规则集,覆盖密钥安全检测方方面面,包括是否泄露或重复使用,密钥选择、长度、加密算法是否存在安全隐患等,帮助用户发现在日常使用中容易忽略的风险与漏洞。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第4张图片

开源开放:每一行源代码公开可见

极狐GitLab 作为开源软件,用户可以自由查看密钥检测功能的每一行代码,根据企业安全需求开发自定义和扩展默认功能。

并且,极狐GitLab 持续更新与改进密钥检测的规则与检测方式,以适应新的安全威胁与需求变化。用户可以随时查看更新的具体代码变更,获得更强的检测能力。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第5张图片

密钥检测「基础」使用方式


如前文所言,极狐GitLab 可通过一行代码,启用密钥检测。这是最基础的使用方法,可快速试用与评估密钥检测功能。

➤ 导入 CI 模板 .gitlab-ci.yml

在极狐GitLab CI/CD 中导入密钥检测的 CI 模板,模板仅包含一条启动密钥检测的作业,导入后可立即执行密钥扫描。

➤ 自动添加密钥检测作业

在 CI/CD 流水线部署阶段,自动添加一条启动密钥检测作业,使每个流水线在部署前自动执行密钥扫描,形成持续检测机制,发现密钥安全问题及早修复。

➤ 显示密钥检测报告

密钥检测作业完成后,在极狐GitLab 流水线界面展示扫描报告,说明检测到的各个密钥中存在的安全问题以及修复建议,辅助用户高效修复或更换不安全密钥。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第6张图片

密钥检测「进阶」使用方式


定制扫描范围

极狐GitLab 密钥检测支持定制扫描范围,用户可以根据安全策略与需求进行选择,如:

➤ 历史扫描

对仓库所有历史提交与标签运行密钥检测,发现仓库生命周期中任何时间点存在的密钥安全问题,进行系统性修复。

➤ 默认分支扫描

每次有合并请求被合并到默认分支时,自动运行密钥检测,确保默认分支的每次更新都符合安全标准,不存在密钥 related 问题。

➤ 合并请求扫描

每当有新的合并请求被创建时,自动运行密钥检测,检测合并请求中引入的 SSH 密钥是否存在任何安全问题,在代码被正式合并前发现与修复问题,实现安全的 Pull Request 流程。

➤ 推送事件扫描

每当有代码被推送至仓库时,自动运行密钥检测,实现持续的密钥安全检测,尽早发现和解决每次更新引入的任何密钥问题。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第7张图片

自定义规则级

不同企业可能有不同产品特点,需要匹配不同的安全规范。

极狐GitLab 密钥检测支持自定义规则级别,用户可根据企业安全要求,自定义规则级,生成最符合业务安全标准的检测报告。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第8张图片

极狐GitLab 密钥检测支持通过 .gitlab/secret-detection-ruleset.toml 文件,对检测规则进行高度自定义,例如:

➤ Slack Token 扫描规则定义

对仓库代码中泄露的 Slack Token 进行检测,防止未授权访问企业的 Slack 工作区。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第9张图片

➤ Tencent Cloud Secret 扫描规则定义

对腾讯云 Secret 的详细检测规则,有效防止重要凭证/敏感数据在代码仓库中遭到泄露,被未授权访问。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第10张图片

密钥检测后的处理


通过密钥检测发现密钥泄漏了,该怎么办?首先要做就是删除对应的密钥信息

泄露情况一般分两种:极狐GitLab 自己的 token 或第三方平台如腾讯云或 AWS token。

分别对应机制是:

  1. 极狐GitLab 自己的 token:如已开启 Token Revocation 开关,极狐GitLab 会自动撤销删除密钥,Token 信息失效;

  2. 三方平台 token:需手动配置撤销服务,极狐GitLab 调用自定义密钥撤销服务(Token Revocation API)进行处理。

整体流程

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第11张图片

Step 1:在流水线中开启 Secret Detection Job 服务;

Step 2:通过流水线密钥扫描 Job 扫描代码库是否存在泄露密钥;

Step 3:判断泄漏的密钥信息是否为极狐GitLab 密钥;

Step 4:如果是极狐GitLab 密钥则自动删除;如果不是极狐GitLab 密钥,判断是否配置对应 Token Revocation API;

Step 5:如果是第三方密钥并配置了对应 Token Revocation API,则主动发送请求处理。

如何判断是否为极狐GitLab 密钥?

那么,极狐GitLab 是如何判断密钥信息是否为极狐GitLab 密钥?

极狐GitLab 通过 gitleaks 文件进行匹配,通过定义不同类型密钥的正则匹配模式,来判断检测到的密钥信息是否为极狐GitLab 密钥。

主要的判断规则如下图,如果检测到的密钥信息前缀是 glpat 或 glptt 则认为是极狐GitLab 密钥信息,进行自动删除处理。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第12张图片

如何自定义 Access Token 前缀?

极狐GitLab 默认密钥信息前缀是 glpat 或 glptt 类型,但也可以通过自定义方式来修改 token 前缀。

➤ 进入 Admin Area

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第13张图片

➤ 点击 Settings → General

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第14张图片

➤ 展开 Account and limit

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第15张图片

➤ 填写 Personal Access Token prefix

添加自定义任意业务需要的字符串作为极狐GitLab token 前缀信息,极狐GitLab对应的 token 将会生成以该前置为规则的密钥信息。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第16张图片

Token Revocation 处理架构


1 行代码开启「密钥检测」,给敏感数据加上防护锁_第17张图片

如上图所示,主要流程为:

  1. 密钥扫描生成密钥检测报告(secret detection report)JSON 文件,记录检测到的各类 Token 泄露问题;

  2. 收集并存储所有的密钥扫描报告,通过 Sidekiq 触发定时任务;

  3. 循环检测是否存在未处理的 Revocation 请求;

  4. 如果存在,确认需要修复的问题所对应 Token 的类型,确定调用的撤销接口;

  5. 返回 Sidekiq ;

  6. 调用相应的 Token 撤销接口,提交参数信息请求撤销对应问题;

  7. 接口返回“accepted”,表示相关 Token 已被成功撤销。

完整的 Token Revocation 流程实现了从检测到修复的全生命周期密钥安全管理。准确的 Revocation 状态机制可以清晰了解每个问题的修复进度,使用户可以高效修复各类密钥/Token 泄露问题,确保代码安全。

如何配置自己的 Token Revocation 服务?

要实现自己的 Token Revocation API 服务,至少需要包含两个主要 API:

➤ 获取可撤销 Token 列表 API

返回需要被 Revocation API 处理的 Token 类型列表。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第18张图片

➤ 提交撤销请求 API

该 API 允许调用方提交针对某个泄露 Token 的撤销请求。这使检测到 Token 泄露的系统可以主动调用该 API 发起撤销流程。

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第19张图片

极狐GitLab 密钥检测主要设置命令及其描述如下表:

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第20张图片

具体实现:

  1. 进入极狐GitLab Rails 控制台;

  2. 配置如下:

1 行代码开启「密钥检测」,给敏感数据加上防护锁_第21张图片

密钥检测是防止软件系统密钥与凭证漏洞的有效方法,是提高应用与数据安全的重要手段。希望今天的分享对大家有帮助,让安全编码与运维成为广大开发者的共识与行动。

你可能感兴趣的:(密钥检测,devops,devsecops,代码质量,安全性测试)