项目背景
为了躲避开源代码里的灵敏信息走漏,造成不可估量的丢失,咱们需要在开源之前进行代码扫描检测,并发动定时使命去检测全网与网易相关的灵敏信息。
设计概述
开源项目代码检测分为2个阶段:
开源前:
运用Gitleaks东西,对本地文件进行扫描,识别触发装备规矩的灵敏信息。
开源后:
运用GSIL对 指定组织 github.com/netease-kit 或许 全网 进行定时扫描,做到双重保证。
东西介绍
gitLeaks
官方文档
Gitleaks 是一个 SAST(Static Application Security Testing)东西,用于检测和防止git repos 中的硬编码灵敏信息,如appKey、暗码、api 密钥和令牌。
Gitleaks 是一种易于运用的一体化解决方案,用于检测代码中曩昔(commit记载)或现在的灵敏信息。
本地库房检测
官方已去掉长途库房检测功用,目前仅支持本地检测
step1:install
# MacOS
brew install gitleaks
# Docker (DockerHub)
docker pull zricethezav/gitleaks:latest
docker run -v ${path_to_host_folder_to_scan}:/path zricethezav/gitleaks:latest [COMMAND] --source="/path" [OPTIONS]
# Docker (ghcr.io)
docker pull ghcr.io/zricethezav/gitleaks:latest
docker run -v ${path_to_host_folder_to_scan}:/path zricethezav/gitleaks:latest [COMMAND] --source="/path" [OPTIONS]
# From Source
git clone https://github.com/zricethezav/gitleaks.git
cd gitleaks
make build
可以经过指令检查是否装置成功:
$ gitleaks version
8.15.0
step2: 装备检测规矩
gitleaks 的匹配规矩是用 TOML 来界说的,概况可查看gitleaks rules summary。默许运用官方很全的默许规矩 ,如果装备了自界说规矩,运转指令时需要加上gitleaks detect -c=gitleaks.toml
增加一个 gitleaks.toml 文件,写入自界说匹配规矩:
# 规矩的称号
title = "gitleaks config"
# 规矩的描绘,对应扫描成果的Description字段
description = "Check appKey"
# 一个正则表达式
regex = '''(?i)(?:appKey|key|token|secret|passwd|password|auth)(?:[0-9a-z\-_\t .]{0,20})(?:[\s|']|[\s|"]){0,3}(?:=|>|:=|\|\|:|<=|=>|:)(?:'|\"|\s|=|\x60){0,5}([0-9a-z\-_.=]{10,150})(?:['|\"|\n|\r|\s|\x60|;]|$)'''
# 规矩的标签,对应扫描成果的tags字段
tags = ["gitlab", "security", "appKey"]
怎样疏忽旧的检测成果?
扫描大型库房或许历史悠久的库房,运用此 –baseline-path(简写-b) 指令可以疏忽指定文件的检测成果,然后经过–report-path(简写-c) 寄存新的检测成果。
$ gitleaks detect -r report.json -b old-report.json
怎么疏忽检测某行代码?
- 在改行代码后面增加一条注释,指示gitleaks疏忽该行。
discord_client_secret = '8dyfuiRyq=vVc3RRr_edRk-fK__JItpZ' #gitleaks:allow
- 在根目录增加 .gitleaksignore 文件,将缝隙仅有标识Fingerprint字段内容增加到该文件里,可以绕过扫描
123467b3axxxxxxx87f7: src/pages/index.tsx:generic-api-key:20
step3: 执行检测指令
运用上述匹配规矩,可以对全部是数字的信息进行匹配,将其标记为灵敏信息,并生成report.json文件记载匹配成果,可以用如下指令进行扫描检测:
$ gitleaks detect -r=report.json
// 如果有自界说规矩
$ gitleaks detect -r=report.json -c=gitleaks.toml
// 把检测成果直接打印在屏幕上
$ gitleaks detect -v
运用指令介绍
Usage:
gitleaks [command]
Available Commands:
completion generate the autocompletion script for the specified shell
detect detect secrets in code
help Help about any command
protect protect secrets in code
version display gitleaks version
Flags:
-b, --baseline-path string path to baseline with issues that can be ignored
-c, --config string config file path
order of precedence:
1. --config/-c
2. env var GITLEAKS_CONFIG
3. (--source/-s)/.gitleaks.toml
If none of the three options are used, then gitleaks will use the default config
--exit-code int exit code when leaks have been encountered (default 1)
-h, --help help for gitleaks
-l, --log-level string log level (trace, debug, info, warn, error, fatal) (default "info")
--max-target-megabytes int files larger than this will be skipped
--no-banner suppress banner
--redact redact secrets from logs and stdout
-f, --report-format string output format (json, csv, sarif) (default "json")
-r, --report-path string report file
-s, --source string path to source (default: $PWD) (default ".")
-v, --verbose show verbose output from scan
Use "gitleaks [command] --help" for more information about a command.
检测成果阐明
您可以运用指令验证 gitleaks 发现的成果 git log。以下为官方示例输出:
Finding: aws_secret="AKIAIMNOJVGFDXXXE4OA"
RuleID: aws-access-token
Secret AKIAIMNOJVGFDXXXE4OA
Entropy: 3.65
File: checks_test.go
Line: 37
Commit: ec2fc9d6cb0954fb3b57201cf6133c48d8ca0d29
Author: Zachary Rice
Email: z@email.com
Date: 2018-01-28T17:39:00Z
Fingerprint: ec2fc9d6cb0954fb3b57201cf6133c48d8ca0d29:checks_test.go:aws-access-token:37
GSIL
官方文档
gitlab地址:g.hz.netease.com/yunxin-app/…
近实时监控GitHub灵敏信息走漏,并发送邮箱告警告诉。中心是经过各种参数装备来调用github API search-code-api 拿到对应的检测成果,发送到邮箱。
github在线搜索页面:github.com/search?q=or…
运用阐明
环境装置
仅在Python3下验证过
$ git clone https://github.com/FeeiCN/GSIL.git
$ cd GSIL/
$ pip3 install -r requirements.txt
参数装备
GSIL/config.gsil(仿制config.gsil.cfg.example偏重命名config.gsil.cfg): 告警邮箱和Github装备
[mail]
host : smtp.qq.com
# SMTP端口(非SSL端口,但会运用TLS加密)
port : 465
# 多个发件人运用逗号(,)分隔
mails : gsil@feei.cn
from : GSIL
# 邮箱里开启POP3/SMTP服务时的授权码
password : your_password
# 多个收件人运用逗号(,)分隔
to : feei@feei.cn [github]
# 扫描到的缝隙库房是否马上Clone到本地(~/.gsil/codes/)
# 此选项用作监控其它厂商,防止因为库房所有者发现后被删去
clone: false # GitHub Token用来调用相关API,多个Token运用逗号(,)分隔
# https://github.com/settings/tokens
# GitHub已调整最新的速度约束,恳求数量大幅降低,单账户多Token将同享限速,详见https://docs.github.com/en/rest/reference/search#rate-limit 以及 https://docs.github.com/en/rest/reference/rate-limit
# 主张你依据关键词数量装备多个GitHub账户的Token以防止超速
tokens : your_token
扫描规矩
GSIL/rules.gsil(仿制rules.gsil.yaml.example偏重命名rules.gsil.yaml): 扫描规矩
field | meaning | optional | default | describe |
---|---|---|---|---|
keyword | key word | required | – | When multiple keywords are used, space segmentation is used(Example:'username password' ), When you need a precise search, use double(Example:"quotesele.me" ) |
ext | file suffix | optional | all suffixes | Multiple suffixes are separated by comma(Example:java,php,python ) |
mode | matching mode | optional | normal-match |
normal-match (The line that contains the keyword is matched, and the line near the line is matched) /only-match (Only the lines that match the key words) /full-match (Not recommended for use)(The search results show the entire file) |
{
# 一级分类,一般运用公司名,用作开启扫描的第一个参数(python gsil.py test)
"test": {
# General use of product name
"mogujie": {
# Internal domain name of the company
"\"mogujie.org\"": {
# mode/ext options no need to configure by default
"mode": "normal-match",
"ext": "php,java,python,go,js,properties"
},
# Company code's characteristic code
"copyright meili inc": {},
# Internal host domain name
"yewu1.db.mogujie.host": {},
# External mailbox
"mail.mogujie.com": {}
},
"meilishuo": {
"meilishuo.org": {},
"meilishuo.io": {}
}
}
}
运转指令
第一个参数为规矩里的一级分类
# 发动测验
$ python gsil.py yunxin
# 测验token有效性
$ python gsil.py --verify-tokens
$ crontab -e
# 缝隙陈述,此项使命发现缝隙后会马上发送缝隙陈述
# 每个小时运转一次,GitHub API接口调用频率约束可以依据token数量、规矩数量来调整crontab频率完成,若觉得费事可简略装备多个token来完成。
# crontab执行时间决议了陈述的发送时效性,间隔越短陈述越快但频率约束越简单触发
# 主张装备5个token+20条规矩,每15分钟运转一次(可以装备更短,依据各自需求确定)
*/15 * * * * /usr/bin/python /var/app/GSIL/gsil.py test > /tmp/gsil
# 统计陈述,发送一天的扫描发展,包括运转次数、成功次数、失利次数、发现缝隙数、各域名状况、反常等等
# 每天晚上11点发送统计陈述
0 23 * * * /usr/bin/python /var/app/GSIL/gsil.py --report
扫描陈述过一次的将不会重复陈述,缓存记载在~/.gsil/目录