iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
自我挑戰組

30天 Git 版本控制實戰筆記系列 第 25

Day 25:Git 安全性 - 保護你的程式碼

  • 分享至 

  • xImage
  •  

今日目標
• 避免敏感資訊外洩
• 學會 Commit 簽署
• 設定基本安全防護
• 知道緊急處理方法


一、絕對不要 Commit 的東西
❌ 絕對禁止:

憑證和金鑰:

  • API keys、Secret keys
  • Access tokens、OAuth tokens
  • 資料庫密碼
  • SSH 私鑰、SSL 憑證

配置檔案:

  • .env 檔案
  • config.production.yml
  • secrets.json

個人/內部資訊:

  • 信用卡號碼、身分證
  • 內部 IP 位址
  • 伺服器配置

二、完善的 .gitignore

.gitignore 必備項目

環境變數和機密

.env
.env.local
.env.production
secrets.json
*.key
*.pem

資料庫

*.db
*.sqlite
database.yml.production

日誌

*.log
logs/

依賴套件

node_modules/
vendor/

作業系統

.DS_Store
Thumbs.db

IDE

.vscode/
.idea/


三、檢查敏感資訊

安裝掃描工具

brew install gitleaks # macOS

或從 GitHub 下載:https://github.com/gitleaks/gitleaks

掃描當前 repo

gitleaks detect --source . --verbose

掃描整個歷史

gitleaks detect --source . --verbose --log-opts="--all"


四、不小心 Commit 了敏感資訊 - 緊急處理
情況 1:還沒推送(簡單)

移除最後一次 commit 的檔案

git rm --cached .env
git commit --amend --no-edit

或完全回退

git reset --soft HEAD~1
rm .env
echo ".env" >> .gitignore
git add .
git commit -m "Remove sensitive file"
情況 2:已經推送(嚴重!)

⚠️ 步驟 1:立即更改密碼/重新產生 key!

⚠️ 步驟 2:使用 BFG 清理(最快)

下載 BFG:https://rtyley.github.io/bfg-repo-cleaner/

java -jar bfg.jar --delete-files .env
git reflog expire --expire=now --all
git gc --prune=now --aggressive

⚠️ 步驟 3:強制推送(會改寫歷史!)

git push --force --all

⚠️ 步驟 4:通知所有團隊成員重新 clone


五、預防措施 - Pre-commit Hook

建立 pre-commit hook

cat > .git/hooks/pre-commit << 'EOF'
#!/bin/bash

檢查敏感檔案

if git diff --cached --name-only | grep -E ".env$|secrets.|.key$|.pem$"; then
echo "❌ 錯誤:不能 commit 敏感檔案"
exit 1
fi

檢查敏感字串

if git diff --cached | grep -iE "password|api_key|secret_key" > /dev/null; then
echo "⚠️ 警告:發現可能的敏感資訊"
git diff --cached | grep -iE "password|api_key|secret_key"
read -p "確定要繼續嗎?(y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
fi

echo "✅ Pre-commit 檢查通過"
EOF

chmod +x .git/hooks/pre-commit


六、Commit 簽署
為什麼要簽署?
問題:任何人都可以偽造作者
git config user.name "Linus Torvalds"
git commit -m "I am Linus" # 看起來像 Linus 的 commit!

簽署的好處:
✅ 驗證身分
✅ 防止偽造
✅ GitHub 顯示 "Verified" 標誌
方法 1:GPG 簽署(傳統)

1. 安裝 GPG

brew install gnupg # macOS

2. 產生金鑰

gpg --full-generate-key

選擇 RSA, 4096 bits, 設定密碼

3. 列出金鑰

gpg --list-secret-keys --keyid-format=long

記住 ID:例如 3AA5C34371567BD2

4. 設定 Git

git config --global user.signingkey 3AA5C34371567BD2
git config --global commit.gpgsign true

5. 匯出公鑰給 GitHub

gpg --armor --export 3AA5C34371567BD2

複製輸出,貼到 GitHub Settings → SSH and GPG keys

6. 使用

git commit -m "feat: 新增功能" # 自動簽署
方法 2:SSH 簽署(較簡單,推薦)

Git 2.34+ 支援

1. 產生 SSH 金鑰(如果還沒有)

ssh-keygen -t ed25519 -C "your.email@example.com"

2. 設定 Git

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

3. 設定 allowed signers

echo "your.email@example.com $(cat ~/.ssh/id_ed25519.pub)" >> ~/.ssh/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers

4. 上傳公鑰到 GitHub

Settings → SSH and GPG keys → New SSH key

Key type 選 "Signing Key"

5. 使用

git commit -m "feat: 新增功能" # 自動簽署


七、GitHub 安全設定

  1. 雙因素認證 (2FA)
    必須啟用!

步驟:

  1. Settings → Password and authentication
  2. Enable two-factor authentication
  3. 使用 App(Google Authenticator、Authy)
  4. 儲存備份恢復碼

注意:
啟用 2FA 後,push 需要用 Personal Access Token
2. Personal Access Token

產生 Token

Settings → Developer settings → Personal access tokens → Generate new token

選擇權限:

- repo(私有 repo 完整控制)

- workflow(GitHub Actions)

使用 Token

git clone https://@github.com/user/repo.git

或使用 credential helper

git config --global credential.helper osxkeychain # macOS

第一次 push 時輸入 token,會自動儲存

  1. 分支保護
    Settings → Branches → Add rule

必須設定:
✅ Require pull request (至少 1 個 approve)
✅ Require status checks to pass
✅ Require signed commits
✅ Include administrators
✅ Do not allow force pushes
✅ Do not allow deletions


八、自動化安全掃描

.github/workflows/security.yml

name: Security Scan

on: [push, pull_request]

jobs:
gitleaks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

  - name: Gitleaks 掃描
    uses: gitleaks/gitleaks-action@v2
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

npm-audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm ci
- run: npm audit --audit-level=moderate


九、緊急處理流程
發現敏感資訊外洩:

□ 立即行動(5 分鐘內)

  1. 撤銷/更改密碼或 key
  2. 確認是否已推送

□ 如果還沒推送

  • git reset --soft HEAD~1
  • 移除敏感檔案
  • 重新 commit

□ 如果已推送

  1. 使用 BFG 清理歷史
  2. Force push
  3. 通知團隊重新 clone
  4. 監控異常活動

□ 事後檢討

  • 分析原因
  • 更新流程
  • 團隊培訓

十、快速檢查清單

每次開始新專案

□ 建立完整的 .gitignore
□ 設定 pre-commit hook
□ 啟用 commit 簽署
□ 設定分支保護

定期檢查

□ 掃描敏感資訊(gitleaks)
□ 檢查依賴漏洞(npm audit)
□ 審查大型 commits
□ 輪換 tokens(每季)

緊急處理工具

gitleaks detect --source .
git secrets --scan-history
npm audit


今日重點回顧
✅ 核心概念:

  1. 預防外洩

    • 完善 .gitignore
    • Pre-commit hooks
    • 定期掃描
  2. Commit 簽署

    • SSH 簽署(推薦,簡單)
    • GPG 簽署(傳統)
  3. 基本防護

    • 2FA
    • Token 管理
    • 分支保護
  4. 緊急處理

    • 立即撤銷憑證
    • 清理 Git 歷史
    • 通知團隊

記住:預防 >> 補救


立即行動

今天就做(15 分鐘)

□ 檢查 .gitignore
□ 安裝 gitleaks
□ 啟用 GitHub 2FA
□ 掃描一次現有 repo

本週完成(1 小時)

□ 設定 commit 簽署
□ 建立 pre-commit hook
□ 設定分支保護
□ 建立安全規範


常見問題
Q: GPG 太複雜,有更簡單的方法嗎?
A: 用 SSH 簽署!

  • 使用現有 SSH 金鑰
  • 設定只要 3 行指令
  • Git 2.34+ 支援
    Q: 已經外洩很久了怎麼辦?
    A:
  1. 立即更改密碼/key(最重要!)
  2. 從 Git 清理(防止繼續傳播)
  3. 監控異常活動
  4. 評估損害
    Q: 掃描工具會很慢嗎?
    A: 不會
  • gitleaks 掃描 1000 commits < 10 秒
  • 可整合到 CI/CD
  • 在 pre-commit 執行也很快

實用工具

一鍵安裝安全工具

brew install gitleaks git-secrets gnupg gh

測試

gitleaks version
git secrets --list

設定

git secrets --install
git secrets --register-aws


上一篇
Day 24:多人協作進階技巧 - 避免協作陷阱
下一篇
Day 26:CI/CD 整合 - 自動化你的工作流程
系列文
30天 Git 版本控制實戰筆記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言