近日,在「DevSecOps 软件安全开发实践」课程上,极狐(GitLab) 高级专业服务交付工程师韩飞、极狐(GitLab) 前端工程师任治桐,分享了密钥检测的背景、应用及处理,并演示了极狐GitLab 密钥检测功能,快用 1 行代码开启密钥检测功能,给敏感信息加上安全锁。
以下内容整理自本次直播,你也可以点击观看视频回放或下载 PPT。Enjoy~
在应用程序开发过程中,开发人员为了本地 debug 方便,会 hardcode 一些信息,比如连接数据库的用户名、密码、连接第三方 APP 的 token、certificate 等,如果在提交代码的时候没有及时删除这些信息,则非常容易造成敏感信息泄漏,带来被拖库、撞库等风险。
举个例子:某公司一名工程师无意中将与客户往来的邮件以及系统登录信息(包括密码、密钥对和私钥)上传到公开的存储库上,黑客就使用公开的密码和密钥进入企业内部系统,进行偷窃数据、发布非法信息等操作,给企业造成了重大经济损失,严重影响客户信任与企业名誉。
类似的密钥信息泄漏案例屡见不鲜。有没有一种办法,能够在开发人员提交代码前,就提前发现代码中的密钥信息,规避密钥泄露风险?密钥检测应运而生。
企业进行密钥检测常用的方法包括:自研检测工具、开源工具整合、第三方检测服务、混合使用等。这些方法都有其优劣势,例如:
自研检测工具:最大限度契合企业环境与需求,但需要投入大量人力与资源;
开源工具整合:依赖开源工具的检测能力,需要自行维护与升级;
第三方检测服务:可以快速建立密钥检测能力,但需要承担服务费用,功能上也受制于服务提供商,可持续性低;
混合使用:工具链复杂,需投入资源进行管理与维护。
极狐GitLab 认为密钥检测是 DevSecOps 的重要话题,与软件开发全生命周期中的每一个人息息相关,最好的方式就是将密钥检测集成到 CI/CD 中,在开发人员提交代码时就同步进行检测,真正做到安全左移,持续监测。
密钥检测作为七大 DevSecOps 功能之一,内置于极狐GitLab 中,无需繁琐的软件部署,实现扫描报告、配置、计划任务等统一界面管理,无需在多个软件系统之间切换,充分简化管理难度与复杂度。
只需在极狐GitLab CI 配置文件中增加一行代码,即可将密钥扫描模板导入流水线,轻松启动密钥扫描,发现并修复项目的密钥安全问题。
极狐GitLab 密钥检测包含 100 + 种规则集,覆盖密钥安全检测方方面面,包括是否泄露或重复使用,密钥选择、长度、加密算法是否存在安全隐患等,帮助用户发现在日常使用中容易忽略的风险与漏洞。
极狐GitLab 作为开源软件,用户可以自由查看密钥检测功能的每一行代码,根据企业安全需求开发自定义和扩展默认功能。
并且,极狐GitLab 持续更新与改进密钥检测的规则与检测方式,以适应新的安全威胁与需求变化。用户可以随时查看更新的具体代码变更,获得更强的检测能力。
如前文所言,极狐GitLab 可通过一行代码,启用密钥检测。这是最基础的使用方法,可快速试用与评估密钥检测功能。
➤ 导入 CI 模板 .gitlab-ci.yml
在极狐GitLab CI/CD 中导入密钥检测的 CI 模板,模板仅包含一条启动密钥检测的作业,导入后可立即执行密钥扫描。
➤ 自动添加密钥检测作业
在 CI/CD 流水线部署阶段,自动添加一条启动密钥检测作业,使每个流水线在部署前自动执行密钥扫描,形成持续检测机制,发现密钥安全问题及早修复。
➤ 显示密钥检测报告
密钥检测作业完成后,在极狐GitLab 流水线界面展示扫描报告,说明检测到的各个密钥中存在的安全问题以及修复建议,辅助用户高效修复或更换不安全密钥。
极狐GitLab 密钥检测支持定制扫描范围,用户可以根据安全策略与需求进行选择,如:
➤ 历史扫描
对仓库所有历史提交与标签运行密钥检测,发现仓库生命周期中任何时间点存在的密钥安全问题,进行系统性修复。
➤ 默认分支扫描
每次有合并请求被合并到默认分支时,自动运行密钥检测,确保默认分支的每次更新都符合安全标准,不存在密钥 related 问题。
➤ 合并请求扫描
每当有新的合并请求被创建时,自动运行密钥检测,检测合并请求中引入的 SSH 密钥是否存在任何安全问题,在代码被正式合并前发现与修复问题,实现安全的 Pull Request 流程。
➤ 推送事件扫描
每当有代码被推送至仓库时,自动运行密钥检测,实现持续的密钥安全检测,尽早发现和解决每次更新引入的任何密钥问题。
不同企业可能有不同产品特点,需要匹配不同的安全规范。
极狐GitLab 密钥检测支持自定义规则级别,用户可根据企业安全要求,自定义规则级,生成最符合业务安全标准的检测报告。
极狐GitLab 密钥检测支持通过 .gitlab/secret-detection-ruleset.toml
文件,对检测规则进行高度自定义,例如:
➤ Slack Token 扫描规则定义
对仓库代码中泄露的 Slack Token 进行检测,防止未授权访问企业的 Slack 工作区。
➤ Tencent Cloud Secret 扫描规则定义
对腾讯云 Secret 的详细检测规则,有效防止重要凭证/敏感数据在代码仓库中遭到泄露,被未授权访问。
通过密钥检测发现密钥泄漏了,该怎么办?首先要做就是删除对应的密钥信息。
泄露情况一般分两种:极狐GitLab 自己的 token 或第三方平台如腾讯云或 AWS token。
分别对应机制是:
极狐GitLab 自己的 token:如已开启 Token Revocation 开关,极狐GitLab 会自动撤销删除密钥,Token 信息失效;
三方平台 token:需手动配置撤销服务,极狐GitLab 调用自定义密钥撤销服务(Token Revocation API)进行处理。
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 通过 gitleaks 文件进行匹配,通过定义不同类型密钥的正则匹配模式,来判断检测到的密钥信息是否为极狐GitLab 密钥。
主要的判断规则如下图,如果检测到的密钥信息前缀是 glpat 或 glptt 则认为是极狐GitLab 密钥信息,进行自动删除处理。
极狐GitLab 默认密钥信息前缀是 glpat 或 glptt 类型,但也可以通过自定义方式来修改 token 前缀。
➤ 进入 Admin Area
➤ 点击 Settings → General
➤ 展开 Account and limit
➤ 填写 Personal Access Token prefix
添加自定义任意业务需要的字符串作为极狐GitLab token 前缀信息,极狐GitLab对应的 token 将会生成以该前置为规则的密钥信息。
如上图所示,主要流程为:
密钥扫描生成密钥检测报告(secret detection report)JSON 文件,记录检测到的各类 Token 泄露问题;
收集并存储所有的密钥扫描报告,通过 Sidekiq 触发定时任务;
循环检测是否存在未处理的 Revocation 请求;
如果存在,确认需要修复的问题所对应 Token 的类型,确定调用的撤销接口;
返回 Sidekiq ;
调用相应的 Token 撤销接口,提交参数信息请求撤销对应问题;
接口返回“accepted”,表示相关 Token 已被成功撤销。
完整的 Token Revocation 流程实现了从检测到修复的全生命周期密钥安全管理。准确的 Revocation 状态机制可以清晰了解每个问题的修复进度,使用户可以高效修复各类密钥/Token 泄露问题,确保代码安全。
要实现自己的 Token Revocation API 服务,至少需要包含两个主要 API:
➤ 获取可撤销 Token 列表 API
返回需要被 Revocation API 处理的 Token 类型列表。
➤ 提交撤销请求 API
该 API 允许调用方提交针对某个泄露 Token 的撤销请求。这使检测到 Token 泄露的系统可以主动调用该 API 发起撤销流程。
极狐GitLab 密钥检测主要设置命令及其描述如下表:
具体实现:
进入极狐GitLab Rails 控制台;
配置如下:
密钥检测是防止软件系统密钥与凭证漏洞的有效方法,是提高应用与数据安全的重要手段。希望今天的分享对大家有帮助,让安全编码与运维成为广大开发者的共识与行动。