機密管理最佳實務
將機密資料排除在 Dotfiles 儲存庫之外。本指南涵蓋三種經過測試的方法,使用 Chezmoi 安全管理憑證。
為何重要
Dotfiles 儲存庫通常是公開的。一個被提交的 API 金鑰、令牌或密碼可能導致:
- 推送後數分鐘內帳號遭到入侵。
- 洩漏的雲端憑證導致雲端帳單濫用。
- CI 令牌暴露導致供應鏈攻擊。
黃金準則
- 永遠不要在版本控制中存儲明文機密。
- 靜態加密 — 使用 age、SOPS 或機密管理器。
- 每次提交前驗證 — 使用 pre-commit 掛鉤自動化。
方法一:Chezmoi + age(建議)
age 是一個簡單、現代的檔案加密工具。Chezmoi 有原生整合。
設定
bash
# 安裝 age
brew install age # macOS
sudo apt install age # Ubuntu
# 產生金鑰對
age-keygen -o ~/.config/chezmoi/key.txt
# 告知 Chezmoi 使用此金鑰
chezmoi edit-config在 ~/.config/chezmoi/chezmoi.toml 中新增:
toml
encryption = "age"
[age]
identity = "~/.config/chezmoi/key.txt"
recipient = "age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"加密檔案
bash
# 將機密檔案以加密方式新增
chezmoi add --encrypt ~/.config/gh/hosts.yml
# 檔案以加密形式存儲在來源目錄中
cat "$(chezmoi source-path)/encrypted_dot_config/gh/hosts.yml.age"範本機密
bash
# 使用 Chezmoi 範本處理行內機密
chezmoi edit ~/.bashrctext
export GITHUB_TOKEN="{{ (bitwarden "github-token").notes }}"
export AWS_ACCESS_KEY_ID="{{ pass "aws/access-key-id" }}"方法二:Chezmoi + SOPS
SOPS(Secrets OPerationS)加密 YAML/JSON 檔案中的特定金鑰,保持結構可見。
設定
bash
# 安裝 SOPS
brew install sops # macOS
sudo apt install sops # Ubuntu
# 建立 SOPS 配置
cat > .sops.yaml << 'EOF'
creation_rules:
- age: >-
age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
EOF加密
bash
# 建立機密檔案
cat > chezmoi-data.yaml << 'EOF'
github_token: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_key: AKIAIOSFODNN7EXAMPLE
EOF
# 使用 SOPS 加密
sops --encrypt --in-place chezmoi-data.yaml在範本中使用
在 chezmoi.toml 中新增:
toml
[data]
[data.secrets]
source = "sops"
path = "chezmoi-data.yaml"方法三:1Password CLI
1Password CLI(op)在套用時擷取機密,無需在本地存儲。
設定
bash
# 安裝 1Password CLI
brew install --cask 1password-cli # macOS
# 登入
op signin在 Chezmoi 範本中使用
text
export GITHUB_TOKEN="{{ onepasswordRead "op://Private/GitHub Token/credential" }}"
export NPM_TOKEN="{{ onepasswordRead "op://Development/npm/token" }}"優勢
- 機密永遠不會以未加密形式接觸磁碟。
- 透過 1Password 保險庫進行團隊共享。
- 支援自動輪換。
Pre-commit 安全網
git-secrets
bash
# 安裝
brew install git-secrets # macOS
sudo apt install git-secrets # Ubuntu
# 為您的儲存庫配置
git secrets --install
git secrets --register-aws
# 新增自訂模式
git secrets --add 'ghp_[A-Za-z0-9_]{36}'
git secrets --add 'sk-[A-Za-z0-9]{48}'.gitignore
始終排除敏感路徑:
text
# 機密 - 永遠不要提交
*.age
*.enc
*.key
.sops.yaml
chezmoi-data.yaml
key.txt.chezmoiignore
防止 Chezmoi 管理敏感檔案:
text
.ssh/id_*
.gnupg/
.config/chezmoi/key.txt稽核檢查清單
- [ ] 來源狀態中無明文機密:
chezmoi archive | tar -tf - | grep -v '.age' - [ ] age 金鑰未被提交:
git ls-files | grep key.txt應無結果 - [ ] git-secrets 掛鉤已啟用:
git secrets --scan - [ ]
.gitignore涵蓋*.age、*.key、.sops.yaml - [ ]
dot doctor通過且無警告 - [ ] SOPS 加密的檔案可正確解密:
sops --decrypt chezmoi-data.yaml
已測試平台
| 平台 | age | SOPS | 1Password CLI |
|---|---|---|---|
| macOS Sonoma+ | ✅ | ✅ | ✅ |
| Ubuntu 24.04 | ✅ | ✅ | ✅ |
| WSL2 (Ubuntu) | ✅ | ✅ | ⚠️ |