项目背景

为了躲避开源代码里的灵敏信息走漏,造成不可估量的丢失,咱们需要在开源之前进行代码扫描检测,并发动定时使命去检测全网与网易相关的灵敏信息。

设计概述

开源项目代码检测分为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

怎么疏忽检测某行代码?

  1. 在改行代码后面增加一条注释,指示gitleaks疏忽该行。
discord_client_secret = '8dyfuiRyq=vVc3RRr_edRk-fK__JItpZ' #gitleaks:allow
  1. 在根目录增加 .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/目录