iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
DevOps

DevOps 進化論:從全能型戰士到安全守門員系列 第 26

Day 26|依賴與套件安全:守住軟體供應鏈的第一道防線

  • 分享至 

  • xImage
  •  

● 前言

現代軟體開發已經很少「從零開始」,大部分專案都依賴大量第三方套件(Libraries)、框架(Frameworks)、甚至整合工具(Toolchains)。
這樣雖然能大幅提升開發效率,但同時也帶來一個巨大的風險:供應鏈攻擊(Supply Chain Attack)
換句話說,今天不一定是你的程式寫錯,而可能是你安裝的套件本身就有漏洞,甚至被惡意植入後門。


● 為什麼要關注依賴與套件安全?

  • 依賴漏洞可能成為 攻擊入口:如 Log4j 漏洞(Log4Shell)。
  • 攻擊成本低,傳染面積大:一個套件被入侵,可能影響數千專案。
  • 自動化工具雖然方便,但 盲目升級或引入未知套件,會放大風險。

● 常見的風險類型

  1. 已知漏洞的套件(CVE 公告的漏洞,卻還在使用舊版)。
  2. 惡意套件(攻擊者發佈名稱相似的 Package,如 typosquatting)。
  3. 依賴鏈過長(間接依賴過多,難以控管)。
  4. 缺乏簽章與來源驗證(不確定套件是否來自可信來源)。

● 常見工具與實踐

  • 依賴掃描工具

    • npm audit(Node.js)
    • pip-audit(Python)
    • safety(Python)
    • mvn dependency-check(Java)
    • snyk(跨語言支援)
  • 最佳實踐
    🔸 鎖定套件版本(使用 lock file,如 package-lock.jsonpoetry.lock)。
    🔸 定期更新依賴,避免長期停留在高風險版本。
    🔸 使用 SBOM(Software Bill of Materials) 追蹤依賴來源。
    🔸 套件來源驗證(如 Sigstore / Cosign 簽署)。

  • 進階實務
    🔸PR Gate:若檢測到高風險漏洞,直接阻擋 PR 合併,確保問題不會流入主分支。
    🔸分級策略:針對不同風險等級設定規則,例如低風險漏洞允許合併,但需加上提醒標籤。
    🔸Artifact 安全:不只檢查程式依賴,還要確保建構出來的 Docker Image 同樣進行安全掃描。


● 實作範例:GitHub Actions + pip-audit

name: Dependency Security Scan

on:
  push:
  pull_request:

jobs:
  depsec:
    runs-on: ubuntu-latest
    env:
      PIP_DISABLE_PIP_VERSION_CHECK: "1"

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install pip-audit
        run: |
          python -m pip install --upgrade pip
          pip install pip-audit

      # --- Gate:紅燈預期(這步故意讓有洞即失敗)---
      - name: Run pip-audit on requirements.txt (Gate)
        id: gate
        run: pip-audit -r requirements.txt

      # --- 產「排版好的」報告(就算 Gate 失敗也跑)---
      - name: Generate pretty JSON report (vuln)
        if: always()
        run: |
          pip-audit -r requirements.txt -f json -o - \
            | python -c 'import sys,json; print(json.dumps(json.load(sys.stdin), indent=2, ensure_ascii=False))' \
            > pip-audit.pretty.json || true

      - name: Generate pretty CycloneDX SBOM (vuln)
        if: always()
        run: |
          pip-audit -r requirements.txt -f cyclonedx-json -o - \
            | python -c 'import sys,json; print(json.dumps(json.load(sys.stdin), indent=2, ensure_ascii=False))' \
            > sbom-cyclonedx.pretty.json || true

      - name: Upload artifacts (pretty only)
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: pip-audit-vuln-pretty
          path: |
            pip-audit.pretty.json
            sbom-cyclonedx.pretty.json

  # 綠燈對照;即使 depsec 失敗也會執行
  depsec_fix_verify:
    if: ${{ always() }}
    needs: depsec
    runs-on: ubuntu-latest
    env:
      PIP_DISABLE_PIP_VERSION_CHECK: "1"

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install pip-audit
        run: |
          python -m pip install --upgrade pip
          pip install pip-audit

      - name: Run pip-audit on requirements.patched.txt (Should pass)
        run: pip-audit -r requirements.patched.txt

      - name: Generate pretty JSON report (patched)
        if: always()
        run: |
          pip-audit -r requirements.patched.txt -f json -o - \
            | python -c 'import sys,json; print(json.dumps(json.load(sys.stdin), indent=2, ensure_ascii=False))' \
            > pip-audit.patched.pretty.json || true

      - name: Upload artifact (pretty only)
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: pip-audit-patched-pretty
          path: |
            pip-audit.patched.pretty.json

設計兩個Job,一個是故意讓他出錯失敗,另一個是讓他成功通過。

▪Github Actions下方有兩個Artifact提供報告下載

https://ithelp.ithome.com.tw/upload/images/20250908/201781568C4OZ1WgoV.png

▪❌出錯失敗

🔸pip-audit.pretty.json
https://ithelp.ithome.com.tw/upload/images/20250908/20178156mzzyiWKvdP.png
dependencies: 被掃描到的套件清單。
每個套件有 name(套件名)、version(你現在的版本)、vulns(該版本命中的弱點)。
vulns 裡面每一筆:

  • id: 弱點通告 ID(PYSEC / GHSA / CVE)。
  • fix_versions: 修補後的最低版本(升到這些版本之上即可避免此通告)。
  • aliases: 同一弱點在不同資料庫的代號(CVE / GHSA 等)。
  • description: 官方或資料庫對該弱點的簡述。
  • fixes: 空陣列表示這次只是產生報告,沒有自動套用修正方案。

🔸sbom-cyclonedx.pretty.json
https://ithelp.ithome.com.tw/upload/images/20250908/20178156aQiCzMfZHJ.png

▪✅通過流程(pip-audit.patched.pretty.json)

https://ithelp.ithome.com.tw/upload/images/20250908/20178156HcDHzwhv8l.png

👉 這段流程會在每次 push/PR 時,自動檢查 Python 專案的套件是否存在已知漏洞。

● 總結

依賴與套件安全是 DevSecOps 的基礎工,就像建築物的地基一樣重要。
再強大的應用程式,如果基礎依賴有漏洞,都可能被攻破。
因此:
1.使用 自動化工具 持續檢查依賴漏洞。
2.建立 版本管理與更新策略,避免停留在高風險版本。
3.推動 SBOM 與簽章驗證,確保軟體供應鏈可信。

👉 下一篇(Day 27),我們會把重心放到 容器鏡像的安全檢查,因為應用程式的依賴不只是程式碼,還包含整個 Runtime 環境。


上一篇
Day 25|DAST 動態應用測試:模擬真實攻擊的安全驗證
下一篇
Day 27|容器安全檢查:讓 Image 成為可信任的交付物
系列文
DevOps 進化論:從全能型戰士到安全守門員30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言