一次推送,毁掉一个公司
本文分享如何使用极狐GitLab 17.2 发布的密钥推送保护功能(Secret Push Protection)从源头方式密钥被推送到代码仓库中,从而导致密钥信息泄漏,给公司造成巨额损失。
密钥(用户名、密码、令牌、key 等)是软件研发中绕不过去的因素,如何管理好这些密钥,是保护企业核心资产不外泄的关键。极狐GitLab 有完整的密钥保护体系,包括:
- 代码审核:通过代码审核来尽可能地发现变更代码中包含的密钥信息,避免密钥信息被合并到主分支;
- 代码推送规则设置:通过设置来阻止某些密钥文件被推送到代码仓库中,比如 SSH Key;
- 密钥检测:极狐GitLab DevSecOps 体系有七大安全测试手段,密钥检测是其中非常重要的一环,通过将密钥安全检测嵌入到 CI/CD 流水线中,来自动检测代码变更中的密钥信息;
此次分享的密钥推送保护是自 16.7 以试验功能引入,在 17.1 升级为 Beta,17.2 中在私有化部署中正式可用。密钥推送保护功能结合上述的三大手段,能够构建坚固的密钥防护体系。
该功能为旗舰版功能,不过可以申请免费试用,旗舰版 license 申请链接 https://dl.gitlab.cn/jgc6re9s 。
密钥泄漏的案例
先看几个因为敏感信息泄露导致遭受巨额损失的例子:
案例一
2016 年,一位为 Uber 工作的员工不小心将 AWS 的访问凭据上传到了 GitHub,随后该凭据被黑客发现并利用,窃取了 5700万用户、60万司机的信息。事件发生后,当时的安全主管并未公开披露此事,而是选择以给黑客支付赎金的方式避免数据被删除。一年以后,该事件被披露,安全主管离开公司,同时 Uber 公司遭受了超 1亿美金的罚款(和解费)。
案例二
Code Spaces是一家提供代码托管服务的公司,公司 AWS 控制台的访问凭据被黑客窃取之后,黑客对公司的数据进行了窃取,并索要赎金,在未得到赎金之后,黑客删除了公司数据,包括主存储和备份。由于大部分数据被永久删除,包括所有的备份,Code Spaces 失去了其所有关键数据,导致无法继续运营。尽管公司努力试图恢复,但因数据的丧失和随之而来的客户流失,公司最终宣布关闭。
现代化公司内部有很多系统,涉及到的敏感信息也非常多,如何更好的保护敏感信息是企业安全合规的重中之重。极狐GitLab 17.2 中推出的密钥推送保护功能能够从源头避免开发者将密钥信息泄露到外部,进一步加强了极狐GitLab 的安全合规体系。
密钥推送保护,从源头避免密钥泄露
极狐GitLab 最新推出的密钥推送保护功能是为了防止密钥信息(诸如 API 和 token)被直接推送到极狐GitLab 仓库中。当用户进行代码推送时,该功能会检测每一个提交中的内容,如果检测到有密钥信息,就会阻止本次提交,并给出具体的告警信息:指明密钥信息存在的位置。
当前该功能处于 Beta 版本,对于私有化部署用户来说,必须要确保版本在 17.2 以后,而且需要管理员在整个实例上开启该功能。
极狐GitLab 版本的安装升级可以查看官网指南。
可通过管理中心(Admin area) --> 安全 --> Security and compliance --> Secret检测中开启:
此外,还需要在每个项目上开启此功能。可通过项目 --> 安全 --> 安全配置开启此功能。
该功能不仅可以在代码变更中对密钥信息进行检测,还能对 Issue、MR 评论中的密钥信息进行检测。下面以极狐GitLab 个人访问令牌为密钥信息进行该功能的演示。
对提交代码进行检测防护
下面是一段 python 代码:
import requests
login_url = 'https://jihulab.com'
pat = "glpat-kQvcWtA6pBJAyYDqcza6"
login_headers = {
'username' : "小马哥",
'password' : "JiHu-GitLab"
}
login_response = requests.post(login_url)
print(login_response.get())
如果在没有开启该功能的情况下,使用 git push 命令可以将上面的代码推送到极狐GitLab 仓库中:
git push --set-upstream origin secret-push-protection
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 339 bytes | 339.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for secret-push-protection, visit:
remote: http://jhma.jihulab.net/root/jh-gitlab/-/merge_requests/new?merge_request%5Bsource_branch%5D=secret-push-protection
remote:
To jhma.jihulab.net:root/jh-gitlab.git
* [new branch] secret-push-protection -> secret-push-protection
branch 'secret-push-protection' set up to track 'origin/secret-push-protection'.
在极狐GitLab 项目页面上能够看到该密钥信息:
在开启该功能后,如果要对包含 PAT 的代码进行提交时,就会出错,并且提示在代码的第 5 行有密钥信息:
而且明确提示PUSH BLOCKED: Secrets detected in code changes。
通过页面提交代码,也会提示 PUSH BLOCKED: Secrets detected in code changes 从而阻止相关代码的提交:
对 Issue、MR 评论进行检测防护
如果在 Issue、MR 的评论中包含密钥信息,也会进相应的不安全提示。比如在 Issue 的评论中输入极狐GitLab 个人访问令牌,就会提示以下内容:
可以看到如果在 MR、Issue 的评论中包含密钥信息,在添加的时候,就会发出告警,提示这里面包含哪些密钥信息。
跳过也要留痕
如果在某些特殊情况下(比如为了测试之类),想跳过此功能进行代码的正常合入,这时候就需要在提交代码的时候做一些特殊处理。但是对于跳过该功能这件事情,会在安全审计里面进行记录。
命令行提交
如果是通过 git push 的方式从命令行进行代码提交,则需要添加一个参数** -o secret_push_protection.skip_all**,结果如下:
git push -o secret_push_protection.skip_all origin secret-push-protection
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 504 bytes | 504.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote:
remote: View merge request for secret-push-protection:
remote: http://jhma.jihulab.net/root/jh-gitlab/-/merge_requests/1
remote:
To jhma.jihulab.net:root/jh-gitlab.git
6b3acb2..0b7fdb3 secret-push-protection -> secret-push-protection
可以看到代码推送成功。
在网页端提交
如果是通过极狐GitLab 网页端进行代码提交,则需要在 commit 信息中添加 [skip secret push protection] 信息,然后即可提交成功:
不管是哪种方式,只要是跳过密钥推送保护功能,都会在在安全审计(项目 --> 安全 --> 审计事件)中看到对应的审计事件:
极狐GitLab 的密钥安全防护体系
极狐GitLab 是一个内置安全、默认安全的 DevSecOps 平台,有多种安全功能、策略来保障软件研发全生命周期的安全。17.2 新增的密钥推送保护功能是密钥安全防护体系的重要补充部分。之前针对密钥安全防护,主要有以下几种手段:
-
代码审核:通过代码审核来尽可能地发现变更代码中包含的密钥信息,避免密钥信息被合并到主分支;
-
代码推送规则设置:通过设置来阻止某些密钥文件被推送到代码仓库中,比如 SSH Key;
-
密钥检测:极狐GitLab DevSecOps 体系有七大安全测试手段,密钥检测是其中非常重要的一环,通过将密钥安全检测嵌入到 CI/CD 流水线中,来自动检测代码变更中的密钥信息;
此次新发布的密钥推送保护直接从源头阻止了包含密钥信息的代码被推送到仓库中。这几种手段结合起来就可以构建一个坚固的密钥安全防护体系。
由于该功能当前是旗舰版功能,欢迎大家升级到 17.2 来体验该功能,然后在官网申请旗舰版 license 进行测试体验。