對象:擔心 GitHub 的「儲存庫誤公開」或金鑰外洩,糾結是否該用自建 Git 伺服器(bare git 或 Gitea/Forgejo/GitLab)維運的個人開發者、小規模維運者。這裡不涉及攻擊手法,只討論在你自己的架構下哪個更安全這一判斷。
本站視角:自建維運只有在接手 GitHub 原本的工作時才成立
本站自身也使用自建 Git 伺服器維運。不過理由不只是「害怕誤公開」,主要目的是隔離影響範圍——即使一個服務被攻陷,也不波及其他服務。而既然選擇自建,就必須連同向另一台伺服器的離站備份、絕不把金鑰放進 git 的維運紀律、相依套件 CVE 的自動監控一起付諸實踐。自建維運的安全性,不是由「不用 GitHub」決定,而是由「自己做好 GitHub 原本替你做的工作」決定。
1. 自建維運真正能消除的風險
你的擔憂有正當的依據。GitHub 上典型的「公開事故」,在自建維運下從結構上就不可能發生。
公開儲存庫會被全球的自動掃描 bot 持續爬取。一旦誤把 .env 或 API 金鑰提交上去,往往在人察覺之前 bot 就已撿到,幾分鐘內被濫用並不罕見(實例 → 金鑰經公開儲存庫外洩被惡意扣費的案例 / .env 被整個公開的案例)。自建維運能消除這個公開面本身。「本以為是私有卻是公開」「以為刪掉的金鑰還殘留在公開 fork 裡」這一類事故,在設計上就不會發生。這不是含糊的安慰,而是實在的優勢。
2. 自建時你要接手的工作
這才是正題。GitHub 在你看不見的地方 預設代為承擔 了許多防禦。一旦轉向自建,除非你自己去做,否則它們就不存在。
GitHub 代為承擔的
- 在提交時攔截金鑰混入(push protection)
- 相依套件 CVE 的自動通知(Dependabot)
- 伺服器本體的營運、修補、TLS
- 兩步驟驗證、細粒度權限、稽核記錄
- 高可用性、冗餘備份
自建下成了你的工作
- 自己裝上提交前的金鑰偵測掛鉤
- 自己跑相依套件 CVE 監控(cron)
- Git 伺服器的漏洞也得自己堵
- 金鑰管理=實際上的全權存取控制
- 不自己準備還原方案,遺失的資料就找不回來
尤其容易忽視的有兩點。其一是個悖論:你最害怕的「金鑰外洩」,其實 GitHub 更能用機器替你攔住。GitHub 的 push protection 會直接拒絕包含疑似 API 金鑰字串的提交。而裸的自建 git 沒有這道檢查。誤公開消失了,但誤提交不會消失——所以一旦自建,提交前的金鑰偵測掛鉤是必須的。
其二是,Git 伺服器本體會成為攻擊目標。像 GitLab 這樣的多功能伺服器,過去就有過多個嚴重漏洞(無需驗證的遠端程式碼執行=RCE 級別),放任不打修補的自建伺服器,本身就會成為入侵口。功能越多,攻擊面越大。裸的 bare git+SSH 攻擊面最小,GitLab/Gitea 等雖然方便,但要持續自己追修補的負擔也隨之增加。
3. 讓自建「比 GitHub 更安全」的條件
這是讓自建維運不是圖個安心、而是真正安全的最小集合。滿足這些,才能說比 GitHub 更安全。
在提交前攔住金鑰
最小化 Git 伺服器本體並打修補
向異地做離站備份+還原測試
金鑰分離,以最小權限、非 root 執行
自己跑相依套件的 CVE 監控
4. 該選哪一個
不是「自建=老手」「GitHub=新手」。要以能否持續維運來決定。
適合自建(如果滿足條件)
- 想消除誤公開、公開 bot 濫用的面本身
- 能自己持續做伺服器修補、備份
- 不想把程式碼託付給第三方/想限制影響範圍
- 能連同金鑰偵測掛鉤和相依套件監控一起引入
有時 GitHub 更安全
- 沒有餘力持續做修補、備份 → 放任的自建最危險
- 想依賴 push protection / Dependabot 的自動防禦
- 無法自己準備高可用、冗餘備份
- 能徹底管好私有儲存庫(誤公開可以靠設定維運來防)
說到底,自建維運就是 把原本 GitHub 代為承擔的工作,由自己接過來。如果接過來並執行,它就是能消除誤公開這一大類事故的強力選擇。如果以為接過來了卻放任不管,那就會落到修補缺失的伺服器+金鑰的誤提交+無法還原的備份這種比 GitHub 更糟的狀態。經由供應鏈的混入(如xz-utils 後門那樣的),無論託付給誰,持續做相依套件監控都是防線。
本站自己是怎麼做的
本站使用自建 Git 伺服器(裸的 bare git+SSH)維運,並設定讓 每次推送也會自動複製到另一台伺服器的備份。金鑰(金鑰檔案、密碼、連線資訊)嚴格做到既不寫進 git 也不寫進文件,相依套件的 CVE 監控則用 pnpm audit 在每次部署前+每日執行。也就是說,目的不是「不用 GitHub」本身,而是在消除誤公開這一類事故的同時,自己做好 GitHub 原本替你做的所有工作——兩者都做到,本站才認為自建維運是安全的。
接下來閱讀
- 術語:.env 檔案與金鑰資訊
- 事故:金鑰經公開儲存庫外洩的案例 / .env 被整個公開的案例
- 按技術:用 osv-scanner 機器監控相依套件的 CVE / 不讓 CVE 落後的機制
- 供應鏈:一次 npm install 就讓帳密被清空時(私有儲存庫如何被複製成公開,以及為什麼權杖範圍是關鍵)