cover

接續上一篇的需求、設計、開發階段,這篇來看 SDL 的後半段:測試、部署、運維,以及怎麼用 DevSecOps 把這些全部自動化。

先講結論

安全測試工具沒有你想的那麼難設——Semgrep + npm audit + gitleaks,三個都免費,10 分鐘搞定。如果你是個人開發者,每天多花 15 分鐘就能大幅降低被攻擊的風險。

階段四:測試——四種安全測試工具

先搞清楚這四個縮寫在幹嘛:

  • SAST(Static Application Security Testing)——掃描原始碼找漏洞。在 CI 裡跑,每次 commit 都掃
  • DAST(Dynamic Application Security Testing)——對運行中的應用發送攻擊請求。部署到 staging 後跑
  • SCA(Software Composition Analysis)——檢查第三方套件的已知漏洞。在 CI 裡跑
  • Secret Scanning——找 code 中硬編碼的 secret。放在 pre-commit hook

聽起來要裝一堆東西?其實推薦的起步組合只有三個,全部免費:

  1. Semgrep in CI(SAST)——開源,支援多語言,規則可自訂
  2. npm audit in CI(SCA)——Node.js 內建,一行指令
  3. gitleaks as pre-commit hook(Secret Scanning)——防止你把 API key commit 進去

DAST 的話,OWASP ZAP 是開源標準,但可以之後再加。先把前三個設好,你就贏過 80% 的專案了。

階段五:部署——一份你應該有的 Checklist

每次部署前跑一遍:

  • Debug mode 關了嗎?
  • 預設帳號密碼改了嗎?
  • HTTPS 強制開啟了嗎?
  • Security headers 設了嗎?(去 securityheaders.com 掃一下)
  • 不需要的 port 關了嗎?
  • Service account 是最小權限嗎?
  • Container 是 non-root 跑的嗎?
  • Secret 從 secret manager 讀,不是從環境變數硬塞的嗎?

如果你用 Infrastructure as Code,還可以加上自動掃描:tfsec(Terraform)、checkov(多種 IaC)、kube-bench(Kubernetes)。

階段六:運維——持續監控

部署完不是結束。你至少要監控這些安全指標:

  • 登入失敗次數——同一 IP 5 分鐘內 > 10 次?可能是暴力破解
  • 權限錯誤(403)——同一使用者 1 分鐘內 > 5 次?可能在試權限繞過
  • 異常 API 呼叫量——超過 baseline 3 倍?DDoS 或 data scraping
  • 新的 admin 帳號建立——任何非預期的建立都該告警
  • 大量資料匯出——超過正常量 10 倍?可能是 data exfiltration

DevSecOps——把上面這些全部自動化

整個 pipeline 長這樣:

開發者 push code
    │
    ├── pre-commit: gitleaks(掃 secret)
    │
    ├── CI pipeline:
    │   ├── Semgrep(SAST)
    │   ├── npm audit(SCA)
    │   └── Unit tests with security cases
    │
    ├── Deploy to staging:
    │   └── OWASP ZAP scan(DAST)
    │
    └── Production:
        ├── Security headers check
        ├── Runtime monitoring
        └── Alerting

核心思維:安全檢查應該是自動的、快速的、不阻礙開發流程的。 如果安全檢查讓 CI 多跑 30 分鐘,開發者會想辦法繞過它。到時候你有跟沒有一樣。

一個人也能做的最小可行 SDL

如果你是個人開發者或小團隊,完整 SDL 太重了。做這五件事就好:

  1. 寫新功能前——花 5 分鐘想「這功能可以被怎麼濫用?」
  2. 寫 code 時——記住三條:input validation、parameterized query、最小權限
  3. commit 前——跑 gitleaks 確保沒有 secret
  4. CI 裡——加 npm audit 和 semgrep
  5. 部署後——用 securityheaders.com 掃一次

每天多花 15 分鐘。不做的話?你的 git 歷史裡可能已經有 secret 了——很多人忘記即使在新 commit 裡刪了 .env,舊 commit 裡還在。


安全流程的目的不是讓你開發變慢,是讓你晚上睡得著。雖然 on-call 的時候還是睡不著。

延伸閱讀