Git仓库利用pre-commit在用户端检测敏感信息
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
Git作为代码管理工具,已经被广泛使用。在实际工作中,大部分开发人员都会将代码push到远程代码管理平台,实现协同开发,比如github、gitlab等。用户在代码中经常会使用到用户名/密码、ssh key、token、云access key等敏感信息。这些信息一旦被上传到远程代码管理平台,就意味着有较被泄漏的风险,后果不堪设想。因此,很多知名公司都会对代码管理平台严防死守,严格禁止用户上传敏感信息。用户一旦上传了敏感信息,就要付出很大的成本去治理。用户通常需要通过git reset 回滚版本或者git filter-repo重写仓库commit,然后再强制push到远程仓库清理敏感信息。这将对用户来说是非常糟糕的事情。
因此,用户最好在代码commit之前,通过git自带的pre-commit hook机制检查staged区中的代码,防止敏感信息被commit到本地仓库。
敏感信息检查
简介
介绍一下用到的两款工具:
- pre-commit 官方地址: https://pre-commit.com/
- gitleaks 官方地址 https://github.com/gitleaks/gitleaks
pre-commit
pre-commit 是一个开源的git hook管理框架,可以管理多种语言的git hooks。 pre-commit自带丰富的hooks库,不仅用于代码安全治理,多数开发人员也会用pre-commit提供的hooks检查代码语法、代码格式化等功能。
gitleaks
gitleaks 是gitlab推荐的一款开源的静态代码扫描工具(SAST),常用于git 仓库代码扫描和敏感信息防御。
安装
pre-commit是利用python开发的,安装很简单。例如在linux平台下可以通过pip安装:
bash
pip install pre-commit
#执行pre-commit验证命令
pre-commit
更多安装方式,参见官方文档: https://pre-commit.com/#install
配置
pre-commit可以自动下载远程hooks代码、编译、执行。在使用pre-commit之前,需要您在仓库根目录下创建一个.pre-commit-config.yaml配置文件。
参考示例:
yaml
repos:
#第一个repo是gitleaks支持的pre-commit hooks仓库。本案例主要使用的hooks。
- repo: https://github.com/gitleaks/gitleaks.git
rev: v8.18.1
hooks:
- id: gitleaks
#第二个repo地址是pre-commit自带的hooks插件。与敏感信息扫描无关,主要用于说明pre-commit可以管理丰富的hooks插件,大家可以自行研究。
- repo: https://github.com/pre-commit/pre-commit.git
rev: v4.5.0
hooks:
- id: check-added-large-files
args: ['--maxkb=51200']
安装hooks
进入已配置.pre-commit-config.yaml的仓库,执行下面操作:
bash
#1. 根据仓库.pre-commit-config.yaml 自动下载、安装hooks文件。
pre-commit install-hooks
#2. 安装pre-commit 到git hooks目录。
pre-commit install
以上命令,pre-commit将从gitleaks仓库自动下载代码,并执行"go install"安装gitleaks 二进制文件。除了golang,pre-commit还支持多种语言环境。
显示结果:
验证
pre-commit安装完成以后,我们随意添加一些包含敏感信息的代码文件,验证pre-commit是否能够检查出敏感信息来。
比如: 复制 ~/.ssh/id_rsa文件到代码仓库。
显示结果:
跳过hooks
如果您发现检查结果不符合预期,希望跳过某项检查,可使用SKIP环境变量指定跳过的hooks列表(逗号分隔)。
bash
SKIP=gitleaks git commit -m "update"
显示结果
自动安装
如果您不想每个仓库都执行一遍"pre-commit install",Pre-commit提供了一个"init-templatedir"子命令,允许您安装pre-commit到git的系统初始化模版目录。您在执行git init/git clone的时候,pre-commit文件被自动copy到新仓库的".git/hooks/"目录下。.git/hooks/目录下的pre-commit文件是pre-commit hooks的主程序,会按照仓库中的.pre-commit-config.yaml配置文件执行不同的hooks插件。
但您仍需要为每个仓库准备.pre-commit-config.yaml配置文件,并执行pre-commit install-hooks
安装需要的hooks插件。
根据您的系统环境不同,Git的TemplateDir默认路径也不一样。您可以通过
git config --list --show-origin
来查看git的home目录,Git的TemplateDir通常为home下的"templates"目录。例如: "/usr/share/git-core/templates"。
配置自动安装pre-commit,执行:
bash
#pre-commit init-templatedir <git init的TemplateDir路径>
pre-commit init-templatedir /usr/share/git-core/templates
总结
Pre-commit还有很多玩法,暂时先介绍到这里。比如,如何开发一个hooks工具,感兴趣的朋友可以深入研究一下pre-commit。
gitleaks 是一个很不错的SAST工具,不仅可以全量扫描大批量的代码仓库,也可以基于某次扫描之后的新增代码。