detect-secrets
是一個恰當命名的模組,用於(驚喜,驚喜)檢測程式碼庫中的秘密。
然而,與其他僅專注於尋找秘密的類似軟體包不同,該軟體包在設計時考慮到了企業客戶:提供向後相容的系統化方法:
防止新的秘密進入程式碼庫,
偵測此類預防措施是否被明確繞過,以及
提供要捲動的秘密清單,並遷移到更安全的儲存。
透過這種方式,您可以建立關注點分離:接受您的大型儲存庫中目前可能隱藏著秘密(這就是我們所說的基線),但防止此問題變得更大,而無需處理潛在的巨大努力移走現有的秘密。
它透過針對啟發式製作的正規表示式語句運行定期 diff 輸出來識別是否已提交任何新機密來實現此目的。這樣,它就避免了挖掘所有 git 歷史記錄的開銷,以及每次都需要掃描整個儲存庫的需要。
若要查看最近的更改,請參閱 CHANGELOG.md。
如果您想做出貢獻,請參閱 CONTRIBUTING.md。
有關更詳細的文檔,請查看我們的其他文檔。
建立目前在 git 儲存庫中找到的潛在秘密的基線。
$ 偵測秘密掃描 > .secrets.baseline
或者,從不同的目錄運行它:
$ 偵測秘密 -C /path/to/directory 掃描 > /path/to/directory/.secrets.baseline
掃描非 git 追蹤的檔案:
$ 偵測秘密掃描 test_data/ --all-files > .secrets.baseline
這將重新掃描您的程式碼庫,並且:
更新/升級您的基線以與最新版本相容,
將它發現的任何新秘密添加到您的基線中,
刪除程式碼庫中不再存在的所有機密
這也將保留您擁有的任何標記的秘密。
$ 偵測秘密掃描 --baseline .secrets.baseline
對於版本 0.9 之前的基線,只需重新建立它。
僅掃描暫存檔案:
$ git diff --staged --name-only -z | git diff --staged --name-only -z | xargs -0 偵測秘密鉤子 --baseline .secrets.baseline
掃描所有追蹤的文件:
$ git ls 檔案-z | xargs -0 偵測秘密鉤子 --baseline .secrets.baseline
$ 偵測秘密掃描 --list-all-plugins Artifactory探測器 AWSKeyDetector Azure儲存金鑰偵測器 基本驗證檢測器 雲端偵測器 DiscordBotTokenDetector GitHubTokenDetector GitLabTokenDetector Base64高熵字串 十六進位高熵字串 IbmCloudIamDetector IbmCosHmacDetector IP公共偵測器 JwtTokenDetector 關鍵字檢測器 郵件黑猩猩探測器 Npm檢測器 OpenAI檢測器 私鑰偵測器 PypiTokenDetector 發送網格檢測器 鬆弛檢測器 軟層偵測器 SquareOAuth偵測器 條紋探測器 TelegramBotTokenDetector TwilioKeyDetector
$ 偵測秘密掃描 --disable-plugin KeywordDetector --disable-plugin AWSKeyDetector
如果您只想運行特定插件,您可以執行以下操作:
$ 偵測秘密掃描 --list-all-plugins | grep -v 'BasicAuthDetector' | grep -v 'BasicAuthDetector' | grep -v 'BasicAuthDetector' sed "s#^#--禁用外掛 #g" | xargs 偵測秘密掃描 test_data
這是在基線中標記結果的可選步驟。它可用於縮小要遷移的機密清單,或更好地配置您的插件以提高其訊號雜訊比。
$ 偵測秘密稽核 .secrets.baseline
基本用途:
from det?
更進階的配置:
from det? : 'Base64HighEntropyString','limit': 5.0, },# 使用自訂外掛程式的範例{'name': 'HippoDetector','path': 'file:///Users/aaronloo/Documents/github/detect-secrets/testing/plugins.py', }, ],# 我們也可以指定我們想要的任何附加過濾器。 {'path': 'file://private-filters/example.py::is_identified_by_ML_model', }, ] }) as settings:# 如果我們想要對建立的設定物件進行任何進一步的調整(例如#停用預設過濾器),我們可以這樣做。 filters.heuristic.is_likely_id_string', )secrets.scan_file('test_data/config.ini')
$ pip install 偵測秘密 ?
透過brew安裝:
$brew安裝檢測秘密
detect-secrets
附帶三種不同的工具,並且經常會混淆使用哪一種工具。使用這個方便的清單來幫助您做出決定:
您想將秘密添加到您的基線中嗎?如果是這樣,請使用detect-secrets scan
。
您想提醒基線之外的新秘密嗎?如果是這樣,請使用detect-secrets-hook
。
您正在分析基線本身嗎?如果是這樣,請使用detect-secrets audit
。
$ detect-secrets scan --help usage: detect-secrets scan [-h] [--string [STRING]] [--only-allowlisted] [--all-files] [--baseline FILENAME] [--force-use-all-plugins] [--slim] [--list-all-plugins] [-p PLUGIN] [--base64-limit [BASE64_LIMIT]] [--hex-limit [HEX_LIMIT]] [--disable-plugin DISABLE_PLUGIN] [-n | --only-verified] [--exclude-lines EXCLUDE_LINES] [--exclude-files EXCLUDE_FILES] [--exclude-secrets EXCLUDE_SECRETS] [--word-list WORD_LIST_FILE] [-f FILTER] [--disable-filter DISABLE_FILTER] [path [path ...]] Scans a repository for secrets in code. The generated output is compatible with `detect-secrets-hook --baseline`. positional arguments: path Scans the entire codebase and outputs a snapshot of currently identified secrets. optional arguments: -h, --help show this help message and exit --string [STRING] Scans an individual string, and displays configured plugins' verdict. --only-allowlisted Only scans the lines that are flagged with `allowlist secret`. This helps verify that individual exceptions are indeed non-secrets. scan options: --all-files Scan all files recursively (as compared to only scanning git tracked files). --baseline FILENAME If provided, will update existing baseline by importing settings from it. --force-use-all-plugins If a baseline is provided, detect-secrets will default to loading the plugins specified by that baseline. However, this may also mean it doesn't perform the scan with the latest plugins. If this flag is provided, it will always use the latest plugins --slim Slim baselines are created with the intention of minimizing differences between commits. However, they are not compatible with the `audit` functionality, and slim baselines will need to be remade to be audited. plugin options: Configure settings for each secret scanning ruleset. By default, all plugins are enabled unless explicitly disabled. --list-all-plugins Lists all plugins that will be used for the scan. -p PLUGIN, --plugin PLUGIN Specify path to custom secret detector plugin. --base64-limit [BASE64_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 4.5. --hex-limit [HEX_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 3.0. --disable-plugin DISABLE_PLUGIN Plugin class names to disable. e.g. Base64HighEntropyString filter options: Configure settings for filtering out secrets after they are flagged by the engine. -n, --no-verify Disables additional verification of secrets via network call. --only-verified Only flags secrets that can be verified. --exclude-lines EXCLUDE_LINES If lines match this regex, it will be ignored. --exclude-files EXCLUDE_FILES If filenames match this regex, it will be ignored. --exclude-secrets EXCLUDE_SECRETS If secrets match this regex, it will be ignored. --word-list WORD_LIST_FILE Text file with a list of words, if a secret contains a word in the list we ignore it. -f FILTER, --filter FILTER Specify path to custom filter. May be a python module path (e.g. detect_secrets.filters.common.is_invalid_file) or a local file path (e.g. file://path/to/file.py::function_name). --disable-filter DISABLE_FILTER Specify filter to disable. e.g. detect_secrets.filters.common.is_invalid_file
$ detect-secrets-hook --help usage: detect-secrets-hook [-h] [-v] [--version] [--baseline FILENAME] [--list-all-plugins] [-p PLUGIN] [--base64-limit [BASE64_LIMIT]] [--hex-limit [HEX_LIMIT]] [--disable-plugin DISABLE_PLUGIN] [-n | --only-verified] [--exclude-lines EXCLUDE_LINES] [--exclude-files EXCLUDE_FILES] [--exclude-secrets EXCLUDE_SECRETS] [--word-list WORD_LIST_FILE] [-f FILTER] [--disable-filter DISABLE_FILTER] [filenames [filenames ...]] positional arguments: filenames Filenames to check. optional arguments: -h, --help show this help message and exit -v, --verbose Verbose mode. --version Display version information. --json Print detect-secrets-hook output as JSON --baseline FILENAME Explicitly ignore secrets through a baseline generated by `detect-secrets scan` plugin options: Configure settings for each secret scanning ruleset. By default, all plugins are enabled unless explicitly disabled. --list-all-plugins Lists all plugins that will be used for the scan. -p PLUGIN, --plugin PLUGIN Specify path to custom secret detector plugin. --base64-limit [BASE64_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 4.5. --hex-limit [HEX_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 3.0. --disable-plugin DISABLE_PLUGIN Plugin class names to disable. e.g. Base64HighEntropyString filter options: Configure settings for filtering out secrets after they are flagged by the engine. -n, --no-verify Disables additional verification of secrets via network call. --only-verified Only flags secrets that can be verified. --exclude-lines EXCLUDE_LINES If lines match this regex, it will be ignored. --exclude-files EXCLUDE_FILES If filenames match this regex, it will be ignored. --exclude-secrets EXCLUDE_SECRETS If secrets match this regex, it will be ignored. -f FILTER, --filter FILTER Specify path to custom filter. May be a python module path (e.g. detect_secrets.filters.common.is_invalid_file) or a local file path (e.g. file://path/to/file.py::function_name). --disable-filter DISABLE_FILTER Specify filter to disable. e.g. detect_secrets.filters.common.is_invalid_file
我們建議將其設為預提交掛鉤。一種方法是使用預提交框架:
# .pre-commit-config.yamlrepos: - 倉庫:https://github.com/Yelp/detect-secretsrev:v1.5.0hooks: - id:偵測secretsargs:['--baseline','.secrets.baseline']排除:package.lock.json
有時,我們希望排除誤報阻止提交,而不建立基準來執行此操作。您可以透過添加評論來做到這一點:
Secret = "hunter2" # pragma: 白名單秘密
或者
// 編譯指示:白名單下一行 Secretconst Secret = "hunter2";
$ 檢測秘密稽核 --help 用法:偵測秘密稽核 [-h] [--diff] [--stats] [--報告] [--僅真 | --僅-假] [--json] 檔名 [檔名...] 審核基線允許分析師標記結果,並優化插件以獲得適合其環境的最高信噪比。 位置參數: 檔案名稱 審核給定的基線檔案以區分差異 假陽性和真陽性之間。 可選參數: -h, --help 顯示此說明訊息並退出 --diff 允許比較兩個基線文件,以便 有效區分各種插件的區別 配置。 --stats 顯示互動式稽核會話的結果 已儲存到基線文件中。 --report 顯示包含偵測到的機密的報告 報告: 顯示包含所有調查結果和所做的決定的摘要。與報告模式(--report)一起使用。 --only-real 只在報告中包含真正的秘密 --only-false 僅在報告中包含誤報 分析: 根據您的外掛程式中的標記結果來量化您的外掛程式的成功 基線。與統計模式(--stats)一起使用。 --json 以機器可讀的格式輸出結果。
該工具透過插件和過濾器系統運作。
插件在程式碼中發現秘密
過濾器忽略誤報以提高掃描精確度
您可以調整兩者以滿足您的精確度/召回率需求。
我們採用三種不同的策略來嘗試在程式碼中尋找秘密:
基於正規表示式的規則
這些是最常見的插件類型,並且可以很好地處理結構良好的秘密。可以選擇驗證這些秘密,從而提高掃描精度。然而,僅依賴這些可能會對掃描的回憶產生負面影響。
熵探測器
這透過各種啟發式方法搜尋「看起來秘密」的字串。這對於非結構化秘密來說非常有用,但可能需要進行調整來調整掃描精確度。
關鍵字檢測器
這會忽略秘密值,並搜尋通常與使用硬編碼值分配秘密相關的變數名稱。這對於「非秘密」字串(例如 le3tc0de 密碼)非常有用,但可能需要調整過濾器來調整掃描精度。
想找到我們目前尚未發現的秘密嗎?您還可以(輕鬆)開發自己的插件,並將其與引擎一起使用!有關更多信息,請查看插件文檔。
detect-secrets
附帶了幾種不同的內建過濾器,可以滿足您的需求。
有時,您希望能夠在掃描中全域允許某些行(如果它們與特定模式相符)。您可以指定正規表示式規則,如下所示:
$檢測秘密掃描--排除行'密碼=(blah |假)'
或者您可以指定多個正規表示式規則,如下所示:
$偵測秘密掃描--排除行'密碼= blah'--排除行'密碼=假'
有時,您希望能夠忽略掃描中的某些文件。您可以指定一個正規表示式模式來執行此操作,如果檔案名稱滿足此正規表示式模式,則不會掃描它:
$偵測秘密掃描--排除檔案'.*.signature$'
或者您可以指定多個正規表示式模式,如下所示:
$檢測秘密掃描--排除檔案'.*.signature$'--排除檔案'.*/i18n/.*'
有時,您希望能夠忽略掃描中的某些秘密值。您可以指定正規表示式規則,如下所示:
$ 偵測秘密掃描 --排除秘密 '(fakesecret|${.*})'
或者您可以指定多個正規表示式規則,如下所示:
$ 偵測秘密掃描 --排除秘密 'fakesecret' --排除秘密 '${.*})'
有時,您希望將排除應用於特定行,而不是全域排除它。您可以透過內聯允許清單來執行此操作,如下所示:
API_KEY = '這通常會被外掛偵測到' # pragma: 白名單秘密
這些評論支援多種語言。例如
const GoogleCredentialPassword = "這裡有秘密"; // 編譯指示:白名單秘密
您也可以使用:
# pragma: 白名單下一行 SecretAPI_KEY = 'WillAlsoBeIgnored'
這可能是您忽略秘密的便捷方法,而無需再次重新產生整個基準。如果您需要明確搜尋這些列入白名單的機密,您也可以執行以下操作:
$ 偵測秘密掃描 --only-allowlisted
想要編寫更多自訂邏輯來過濾誤報嗎?在我們的過濾器文件中查看如何執行此操作。
--exclude-secrets
標誌可讓您指定正規表示式規則以排除秘密值。但是,如果您想指定一個大的單字列表,則可以使用--word-list
標誌。
要使用此功能,請務必安裝pyahocorasick
軟體包,或簡單地使用:
$ pip install detector-secrets[word_list]
然後,您可以這樣使用它:
$ 貓 wordlist.txt 不是真正的秘密 $ 貓樣本.ini 密碼 = not-a-real-secret# 會顯示結果$ detector-secrets scan sample.ini# 找不到結果$ detector-secrets scan --word-list wordlist.txt
亂碼偵測器是一個簡單的 ML 模型,它嘗試確定秘密值是否實際上是亂碼,並假設真正的秘密值不是類似單字的。
若要使用此功能,請務必安裝gibberish-detector
軟體包,或使用:
$ pip install detector-secrets[亂碼]
查看亂碼偵測器套件以獲取有關如何訓練模型的更多資訊。為了方便使用,將包含一個預先訓練的模型(透過處理 RFC 進行播種)。
您也可以指定自己的模型,如下所示:
$ 偵測秘密掃描 --亂碼模型 custom.model
這不是預設插件,因為這會忽略password
等秘密。
這並不意味著是防止秘密進入程式碼庫的萬無一失的解決方案。只有適當的開發人員教育才能真正做到這一點。這個預提交鉤子只是實現了一些啟發式方法來嘗試並防止明顯的提交秘密的情況。
無法阻止的事:
多行秘密
不會觸發KeywordDetector
預設密碼(例如login = "hunter2"
)
“沒有偵測到 git 儲存庫。”遇到警告,即使我在 git 存儲庫中。
檢查您的git
版本是否 >= 1.8.5。如果沒有,請升級然後再試一次。更多詳細資訊請參閱此處。
detect-secrets audit
顯示“不是有效的基線文件!”建立基線後。
確保基線文件的文件編碼為 UTF-8。更多詳細資訊請參閱此處。