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 是每個開發者的責任)

執行流程

1

威脅建模

在設計階段識別潛在威脅和攻擊面

2

安全編碼

開發時用 SAST + IDE Plugin 即時掃描

3

PR 安全檢查

CI 自動執行 SAST + SCA,阻擋有漏洞的 PR

4

DAST 掃描

在 Staging 環境對執行中的應用做動態測試

5

持續監控

上線後持續監控 CVE 資料庫和 runtime 行為

流程解讀:DevSecOps 的核心是「每個階段都有安全門檻」。威脅建模在最早期就識別風險,避免架構層級的安全缺陷。開發階段的 SAST 像是即時拼字檢查,寫的時候就告訴你哪裡有問題。PR 階段的自動掃描是強制門檻,不通過就不能合併。DAST 在接近真實的環境中測試實際的攻擊場景。上線後的持續監控確保新發現的漏洞能被及時處理。

程式碼範例

C# 版本

csharp
// 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,CRITICAL

TypeScript 版本

typescript
// 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 版本

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
scan source
SAST (SonarQube/Semgrep)
report
SCA (npm audit/Snyk)
report
CI Pipeline
deploy
Staging Environment
scan running app
DAST (OWASP ZAP)
pass gate
Production

圖中 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 | 越早做安全檢查,修復成本越低 | | 核心原則 | 安全是每個人的責任,不只是安全團隊 |

你可能也想看

Dependency Security回到目錄 →

按 ← → 鍵切換課程