適用對象:個人開發者、小規模維運者中,「安全對策到底做到哪一步才算"最低限度"都搞不清」的人。這裡完全不講攻擊手法,只把 被視為業界標準的基本對策,按優先順序濃縮到一頁裡。每一項都連結到深入文章,所以可以以此為起點,只讀自己需要的部分。
本站的視角:不是『全都做』而是『按這個順序填』
個人或小規模維運,沒有把能做的事一口氣全做完的餘力。正因如此,順序最重要。最上層(管理帳號、網域與郵件)一旦被奪走,下面的任何對策都會失去意義(攻擊者能以你的身分把一切重置)。從最重要的一層往下做,就能在有限的時間裡把受害機率壓到最低。這篇文章不追求知識的面面俱到,而是寫成 一份能讓你迅速決定下一步做什麼的清單。
Tier 0 — 管理帳號、網域、郵件
多因素驗證 / 網域 / DNS / 郵件 / 支付
Tier 1 — 金鑰與程式碼
金鑰不進 git / 提交前偵測 / 金鑰的隔離與撤銷
Tier 2 — 應用程式本體
輸入驗證 / 驗證與工作階段 / TLS 與回應標頭 / 郵件驗證
Tier 3 — 修補 / 偵測 / 還原
相依套件 CVE 監控 / OS 更新 / SSH 與防火牆 / 記錄 / 備份
Tier 0:守住管理帳號、網域與郵件(最高優先)
這裡是一切的前提。一旦網域、郵件、伺服器管理面板被奪走,其他任何對策都會失效。攻擊者能以你的身分重設密碼、改寫 DNS、登進伺服器。所以最先要加固的就是這裡。
加上抗釣魚的多因素驗證
最嚴密地守護郵件信箱
安全保管還原手段與備份碼
區分使用帳號以減少單點故障
Tier 1:別外洩金鑰與程式碼
本站的起因,以及世上的許多事故,都源自這一塊的缺口。也就是 .env 或 API key 這類金鑰,混進程式碼或公開儲存庫而外洩的模式。
金鑰既不寫進原始碼也不寫進文件
.env 等檔案裡,並從 git 排除(.gitignore)。壓根不寫,才是最強的對策。提交前用機器攔下金鑰
一旦外洩就以『全都外洩了』為前提全量輪換
權杖要限定作用域、短命化
自建 Git 尤其要當心
就算因為怕 GitHub 上「誤公開」而改成自建維運,誤提交也不會消失。反而因為沒有 GitHub 標配的金鑰攔截,提交前的金鑰偵測掛鉤在自建維運裡是必備的。詳情整理在 自建 Git 伺服器與 GitHub,哪個更安全。
Tier 2:把應用程式本體做硬
這是對外公開的 Web 應用程式本身的最低限度。與其防新型攻擊,重點更在於 修補常見、眾所周知的漏洞。本站把每個漏洞都在術語頁裡改寫成了防禦視角。
把驗證、工作階段、權限做對
防止郵件被冒充
Tier 3:修補 / 偵測 / 還原
這是「即便被入侵,也能把損失壓小、快速重建」的地基。像 osv-scanner 這樣的相依套件監控也歸在這裡。
用機器持續監控相依套件的 CVE
自動更新 OS 與伺服器
加固 SSH 與防火牆
用最小權限限制入侵的擴散範圍
3-2-1 備份 + 還原測試
留下記錄以便察覺異常
從哪裡下手
「全部立刻做完」並不現實。下面把容易踩的順序,和本站建議的順序作個對比。
容易踩的順序(低效)
- 一上來就從花俏的應用程式漏洞對策開始
- 多因素驗證一直「以後再說」地拖著
- 備份有在做,但從沒試過還原
- 金鑰先丟進了
.env,但沒有偵測掛鉤
本站建議的順序
- Tier 0:先用多因素驗證守住管理帳號、郵件與網域
- Tier 1:從結構上堵住金鑰外洩(提交前偵測 + 全量輪換方針)
- Tier 2:修補應用程式的常見漏洞
- Tier 3:用相依套件監控 / 更新 / 備份還原,達到"能重建"的狀態
本站自己也按這個順序在守護
本站把這裡寫的基本對策應用在了自己身上:應用與資料庫分置於不同容器、資料庫僅在內部網路(在容器/網路層限制影響範圍)/ 每台主機用不同的金鑰 / 金鑰既不寫進 git 也不寫進文件 / 相依套件的 CVE 監控在每次部署前 + 每日自動執行 / 向另一台伺服器做異地備份 / 對外請求都走安全邊界。一個教安全的站點,不能在自己的環境裡留下漏洞——所以這套優先順序,我們首先在自己身上執行。作為起因的那次事故,也並非新型攻擊,而是這些基本對策的某一個缺口造成的。正因如此,我們才反覆強調:比起花俏的對策,先做好基本功。
接下來讀
- 組織 / 團隊版:中型到大型組織的安全底線
- 自建維運:自建 Git 伺服器與 GitHub,哪個更安全
- 相依套件監控:osv-scanner 的引入與使用 / 不在 CVE 上落後的機制
- 金鑰:.env 檔案與金鑰資訊 / 事故 金鑰外洩被惡意刷費的經歷
- 工具:安全回應標頭診斷 / 郵件驗證檢查器 / CVE/KEV 查詢
- 框架:各框架資安對策(把這套共通的基本對策落實到你的技術棧)
- 整體觀點:常見的錯誤是前提的失誤(一再出問題的四種想法)
- 標頭:安全標頭不是越多越好(包括應該移除的標頭)