《公開 Repo 密鑰外洩清除實錄》之二:解除追蹤與 NAS 同步的消失魔術
在確認了 CrowdSec 的中央 API 帳密(CAPI)是現役的之後,Icekimo 必須立刻採取行動。他要在不損毀現有生產環境的前提下,先解除 Git 對這些敏感檔案的追蹤。
我現在打算用 `git rm` 把這三個敏感檔案從追蹤清單裡移掉,並補上忽略名單。這會不會影響到我本地正在運作的檔案?
使用 `git rm --cached` 是最安全的做法。它只會刪除 Git 索引(暫存區)中的紀錄,而完全保留你硬碟上的實際檔案。另外,記得幫大家準備一個 `.env.example` 範本,免得以後沒人知道該填哪些環境變數。
執行解除追蹤
Icekimo 在本機開發機 katharine 上,熟練地敲下解除追蹤與補全 .gitignore 的指令:
# 1. 解除追蹤(保留磁碟檔案)
$ git rm --cached .env \
crowdsec_config/local_api_credentials.yaml \
crowdsec_config/online_api_credentials.yaml
# 2. 補上之前漏掉的第三個檔案到 .gitignore
$ echo 'crowdsec_config/online_api_credentials.yaml' >> .gitignore
# 3. 反查 compose 檔案所引用的變數,建立範本
$ grep -oE '\$\{[A-Z_]+\}' docker-compose.yml | sort -u
$ nano .env.example # 填入對應的 placeholder
# 4. 提交並推播
$ git add .gitignore .env.example
$ git commit -m "chore(security): 停止追蹤密鑰檔,改用 .env.example 範本"
$ git push origin main
開發端一切就緒。然而,真正考驗維運基本功的時刻到了——如何將這些異動同步到正在線上運作的 Synology NAS 伺服器?
NAS 端同步的致命陷阱:消失的密鑰
既然上游已經推了「停止追蹤」的 commit,我直接在 NAS 上 `git pull` 不就好了嗎?
千萬小心!在上游把檔案「解除追蹤並從 Git 倉庫刪除」後,當你在 NAS 執行 `git pull` 時,Git 會認為這三個檔案需要「在工作區中被刪除」。這意味著你線上跑的 `.env` 和密鑰檔會瞬間在 NAS 磁碟上**消失**!一旦容器重啟或讀取,服務就會當場中斷。
為了防止「密鑰消失魔術」擊垮線上服務,Claude Fable 與 Icekimo 共同制定了一套 NAS 端同步的標準作業程序(SOP):
# 登入 NAS,切換至佈署目錄
$ ssh nas
$ cd /volume1/docker/secure-gateway
# 建立獨立且安全的時戳備份資料夾,權限設為 700
$ B=~/secret-backup-$(date +%Y%m%d) && mkdir -p $B && chmod 700 $B
# Step 1. 先行備份(使用 cp -p 保留權限與時間戳記)
$ cp -p .env crowdsec_config/*credentials*.yaml $B/
# Step 2. 丟棄密鑰檔的本地修改(如果不做,git pull 會因為衝突而失敗)
$ git checkout -- .env crowdsec_config/local_api_credentials.yaml
# Step 3. 執行同步(這時,那三個檔案會瞬間從磁碟上被 Git 刪除)
$ git pull --ff-only
# Step 4. 立刻將剛剛備份的檔案還原回原位
$ cp -p $B/.env .env
$ cp -p $B/local_api_credentials.yaml crowdsec_config/
$ cp -p $B/online_api_credentials.yaml crowdsec_config/
# Step 5. 終極驗證:檔案是否已成為未追蹤且被忽略的狀態?
$ cmp $B/.env .env && echo "還原內容完全一致"
$ git check-ignore -v .env crowdsec_config/*credentials*.yaml
Icekimo 看著終端機回傳的 OK 訊息,心中的大石落下一半,變成兩個大石。現在這三個密鑰檔在 NAS 上雖然存在,但好險 Git 已經完全不理會它們了。
然而,公開 Repo 的歷史 commit 中依然殘留著那組「現役」CAPI 帳密。如何排除這個迫在眉睫的風險?下一階段戰鼓擂起,英雄男兒,Serve your duty!!。