前言

在版本控制系統提交  Secret(如 API Key、Password)可能帶來極大的安全風險。本篇文章將介紹如何利用基於 Python 的 pre-commit 工具,結合 Yelp/detect-secrets,來防止 Secret 被提交到 Git Repository。






pre-commit 與 detect-secrets 的功能概述






安裝與設定 pre-commit

安裝 pre-commit

pip install pre-commit


確認安裝是否成功:

pre-commit --version





初始化 pre-commit

在專案的根目錄執行以下命令,初始化 pre-commit:

pre-commit install

此操作會自動在 .git/hooks/pre-commit 中設置對應的 Git hook。






設定 pre-commit 與 detect-secrets

編寫 .pre-commit-config.yaml

在專案根目錄新增 .pre-commit-config.yaml,加入 detect-secrets 的配置:

repos:
-   repo: https://github.com/Yelp/detect-secrets
    rev: v1.5.0
    hooks:
    -   id: detect-secrets
        args: ['--baseline', '.secrets.baseline']
        exclude: package.lock.json


安裝 hook

pre-commit install --install-hooks





產生 baseline 檔案

  1. 在專案根目錄執行以下命令,生成 .secrets.baseline
  2. detect-secrets scan > .secrets.baseline
  3. .secrets.baseline 檔案加入版本控制:
  4. git add .secrets.baseline
    git commit -m "Add secrets baseline"







範例:防止敏感資訊的提交

範例 1:含有秘密資訊的程式碼

新增 test_secret.py,內容如下:

# 含有敏感資訊的程式碼
API_KEY = "12345-SECRET-67890"

執行以下命令嘗試提交:

git add test_secret.py
git commit -m "Add test_secret.py"


預期結果

pre-commit 會觸發 detect-secrets 的檢測,並阻止提交,返回類似以下訊息:

[ERROR] detect-secrets-hook: Preventing commit due to detected secrets.





範例 2:排除特定秘密資訊

如果某些 Secret 經過審核,確定不需要阻止提交,可以將其加入 baseline。

  1. 請重新生成  .secrets.baseline
  2. 審查並更新 .secrets.baseline
  3. detect-secrets audit .secrets.baseline
  4. 使用互動式介面標記 secret 為忽略
  5. 再次提交程式碼:
  6. git add .secrets.baseline
    git commit -m "Add secrets baseline"





預期結果

提交成功,並且 detect-secrets 不會再次攔截這些已記錄的 Secret 。




日常維護建議

  • 定期更新 baseline:每次新增或移除 Secret 後,執行以下命令更新 baseline:
  • detect-secrets scan --update .secrets.baseline
  • 在 CI/CD 中整合:將 pre-commit 集成到 CI/CD 流程中,確保所有開發者都遵守檢查規則。





結論

透過 pre-commit 與 detect-secrets 的結合,可以高效地檢測並阻止敏感資訊的洩露。這不僅提升了專案的安全性,也讓團隊在敏感資訊管理上更加一致與高效。記得定期審查 baseline,確保其準確性與最新狀態!