Security in SDLC(DevSecOps)
是什麼?
DevSecOps 是將安全實踐(Security)融入 DevOps 的每個階段:從需求分析、設計、開發、測試、部署到營運,形成「安全左移(Shift Left Security)」的文化。
ℹ️修復成本差異
根據 IBM System Sciences Institute 研究:在設計階段發現的漏洞修復成本為 1x,在測試階段為 15x,在生產環境為 100x。安全左移的投資報酬率極高。
核心觀念
三大自動化掃描工具
| 工具類型 | 全稱 | 掃描對象 | 時機 | |----------|------|----------|------| | SAST | Static Application Security Testing | 原始碼 | 開發時 / PR Review | | DAST | Dynamic Application Security Testing | 執行中的應用 | Staging 環境 | | SCA | Software Composition Analysis | 第三方依賴 | CI Pipeline |
SAST vs DAST 比較
| 面向 | SAST | DAST | |------|------|------| | 掃描方式 | 白盒(看得到原始碼) | 黑盒(只看外部行為) | | 發現的問題 | SQL Injection、硬編碼密碼、不安全的加密 | XSS、認證繞過、配置錯誤 | | 誤報率 | 較高 | 較低 | | 語言相依 | 是(需要對應語言的分析器) | 否(只測 HTTP 端點) | | 常見工具 | SonarQube、Semgrep、CodeQL | OWASP ZAP、Burp Suite |
DevSecOps Pipeline
每個階段的安全檢查點:
| 階段 | 安全活動 | |------|----------| | 需求 | 威脅建模(Threat Modeling) | | 設計 | 安全架構審查 | | 開發 | SAST + IDE 安全外掛 | | Build | SCA + Container Image Scan | | 測試 | DAST + Penetration Testing | | 部署 | Infrastructure as Code 掃描 | | 營運 | Runtime Protection + 漏洞監控 |
常見誤區
⚠️常犯錯誤
- 只在上線前做一次安全測試(太晚了,修復成本極高)
- SAST 工具報了 500 個 issue 就忽略(要設定 baseline + 嚴重度過濾)
- 以為有了自動掃描就不需要人工 code review(工具抓不到邏輯漏洞)
- 安全只是安全團隊的事(DevSecOps 是每個開發者的責任)
執行流程
威脅建模
在設計階段識別潛在威脅和攻擊面
安全編碼
開發時用 SAST + IDE Plugin 即時掃描
PR 安全檢查
CI 自動執行 SAST + SCA,阻擋有漏洞的 PR
DAST 掃描
在 Staging 環境對執行中的應用做動態測試
持續監控
上線後持續監控 CVE 資料庫和 runtime 行為
流程解讀:DevSecOps 的核心是「每個階段都有安全門檻」。威脅建模在最早期就識別風險,避免架構層級的安全缺陷。開發階段的 SAST 像是即時拼字檢查,寫的時候就告訴你哪裡有問題。PR 階段的自動掃描是強制門檻,不通過就不能合併。DAST 在接近真實的環境中測試實際的攻擊場景。上線後的持續監控確保新發現的漏洞能被及時處理。
程式碼範例
C# 版本
// GitHub Actions — .NET DevSecOps Pipeline
// .github/workflows/devsecops.yml
// SAST: 使用 dotnet format 和 Roslyn Analyzers
// <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers"
// Version="8.0.0" />
// <PackageReference Include="SecurityCodeScan.VS2019"
// Version="5.6.7" />
// 在 .editorconfig 中設定安全規則
// [*.cs]
// dotnet_diagnostic.SCS0001.severity = error # SQL Injection
// dotnet_diagnostic.SCS0005.severity = error # Weak Random
// dotnet_diagnostic.SCS0018.severity = error # Path Traversal
// SCA: NuGet Audit
// dotnet list package --vulnerable --include-transitive
// Container Scan: Trivy
// trivy image myapp:latest --severity HIGH,CRITICALTypeScript 版本
// GitHub Actions — Node.js DevSecOps Pipeline
// .github/workflows/devsecops.yml
// SAST: ESLint Security Plugin
// .eslintrc.js
module.exports = {
plugins: ["security"],
extends: ["plugin:security/recommended"],
rules: {
"security/detect-object-injection": "error",
"security/detect-non-literal-regexp": "error",
"security/detect-eval-with-expression": "error",
"security/detect-no-csrf-before-method-override": "error",
},
};
// Semgrep 自訂規則範例
// semgrep --config "p/javascript" --config "p/owasp-top-ten" src/
// SCA: npm audit in CI
// npm ci
// npm audit --audit-level=high
// 如果發現 high/critical 漏洞就讓 CI 失敗Python 版本
# GitHub Actions — Python DevSecOps Pipeline
# SAST: Bandit(Python 安全掃描器)
# bandit -r src/ -f json -o bandit-report.json
# 常見規則:
# B101: assert 用於非 debug 用途
# B105: 硬編碼密碼
# B301: pickle 反序列化風險
# Semgrep 整合
# semgrep --config "p/python" --config "p/flask" src/
# SCA: pip-audit + Safety
# pip-audit --strict
# safety check --full-report --output json
# DAST: OWASP ZAP(在 CI 中執行)
# docker run -t owasp/zap2docker-stable zap-baseline.py \
# -t https://staging.myapp.com -J zap-report.json
# 完整 CI 腳本
# steps:
# - name: SAST
# run: bandit -r src/ --severity-level medium
# - name: SCA
# run: pip-audit --strict
# - name: DAST
# run: |
# docker run owasp/zap2docker-stable \
# zap-baseline.py -t $STAGING_URL結構圖
圖中 Source Code 同時經過 SAST(掃原始碼)和 SCA(掃依賴),結果匯入 CI Pipeline。通過靜態檢查後部署到 Staging Environment,DAST 對執行中的應用做動態掃描。所有安全門檻都通過後才能進入 Production。這形成了一個多層防禦的安全網。
面試常見問題
Q: SAST 和 DAST 的適用場景分別是什麼?何時該用哪個?
A: SAST 適合在開發早期使用,能找到原始碼層級的漏洞(SQL Injection、硬編碼密碼),但誤報率較高且無法發現配置問題。DAST 適合在 Staging 環境使用,能找到運行時的漏洞(認證繞過、CORS 配置錯誤),但無法指出漏洞在程式碼中的確切位置。最佳實踐是兩者搭配使用。
Q: 如何處理 SAST 工具大量的 false positive?
A: 設定 baseline(先標記現有 issue,只阻擋新增 issue)。按嚴重度分級處理,只讓 Critical/High block PR。建立 suppress 清單記錄已確認的 false positive 和原因。定期回顧 suppress 清單避免遺漏。選擇精確度較高的工具(如 Semgrep 的 taint tracking 模式)。
Q: 什麼是 Threat Modeling?常見的方法有哪些?
A: Threat Modeling 是系統化識別和評估安全威脅的過程。常見方法包括 STRIDE(Spoofing、Tampering、Repudiation、Information Disclosure、DoS、Elevation of Privilege)和 DREAD(Damage、Reproducibility、Exploitability、Affected Users、Discoverability)。在設計階段執行,產出威脅清單和對應的緩解措施。
理解測驗
🤔 安全左移(Shift Left)的核心概念是什麼?
🤔 SAST 和 DAST 的主要差異是什麼?
🤔 SCA 工具的主要功能是什麼?
重點整理
💡一句話記住
DevSecOps = 安全左移 + 自動化門檻 + 持續監控。 口訣:「SAST 掃程式碼,DAST 掃應用,SCA 掃依賴」
| 概念 | 說明 | |------|------| | SAST | 靜態掃描原始碼,開發時就能用 | | DAST | 動態掃描執行中的應用,測試真實攻擊場景 | | SCA | 掃描第三方依賴的已知漏洞 | | Shift Left | 越早做安全檢查,修復成本越低 | | 核心原則 | 安全是每個人的責任,不只是安全團隊 |