實施 GitHub Dependabot 警報和安全更新

已完成

GitHub Dependabot 提供直接整合到 GitHub 存放庫中的自動化相依性管理。 Dependabot 會監視相依性中的安全性弱點和過時版本、警示存放庫維護人員,並自動建立提取要求以更新易受攻擊或過時的相依性。 這種整合使所有 GitHub 使用者都可以存取依賴性安全性,而無需單獨的工具。

認識 GitHub Dependabot

GitHub Dependabot 包含三個主要功能,可共同運作以保護相依性:

Dependabot alerts

Dependabot 警示會在 偵測到易受攻擊的相依性時通知存放庫維護者。 GitHub 會持續監控 GitHub 諮詢資料庫和其他弱點來源,並將它們與存放庫中使用的相依性進行比較。

警示觸發條件:

  • 新的漏洞披露: 當將新弱點新增至 GitHub 諮詢資料庫時,會建立警示。
  • 諮詢更新: 當弱點資訊變更 (嚴重性、受影響的版本、修補程式) 時,會更新現有警示。
  • 相依性圖表變更: 當程式碼變更引入易受攻擊的相依性時,會產生新的警示。
  • 修復弱點資料:來自 Mend (先前稱為 WhiteSource) 的其他弱點情報資訊可補充 GitHub Advisory Database。

警示資訊包括:

  • 漏洞描述: 安全問題的詳細說明。
  • 嚴重性等級: CVSS 分數和嚴重性分類(嚴重、高、中、低)。
  • 受影響的版本: 哪些相依性版本包含弱點。
  • 修補版本: 哪些版本修正了弱點。
  • CVE 識別碼: 常見弱點和暴露 (CVE) 識別碼 (如果可用)。
  • CWE分類: 對弱點進行分類的常見弱點列舉 (CWE) 類型。
  • GitHub 安全性諮詢連結: 連結至完整諮詢,並提供更多詳細資訊。

Dependabot 安全性更新

Dependabot 安全性更新 會自動建立提取要求,將易受攻擊的相依性更新為安全版本。 當 Dependabot alerts 偵測到具有可用修補程式的弱點時,安全性更新可以自動產生修正弱點的提取要求。

自動建立提取請求:

  • 漏洞觸發: 安全性更新只會在偵測到安全性弱點時建立提取要求,而不是針對每個相依性更新建立提取要求。
  • 最小版本提升: 拉取請求會將依賴項更新至能解決漏洞的最低版本,同時保持相容性。
  • 相容性分數: GitHub 會計算相容性分數,預測更新是否會中斷現有功能。
  • 發行備註:提取要求包括來自已更新相依性的發行備註和變更記錄資訊。

拉取請求功能:

  • 自動化測試: 提取要求會觸發現有的 CI/CD 管線,以驗證更新不會中斷功能。
  • 漏洞解決: 提取要求描述說明更新解決了哪些弱點。
  • 更新命令: 特殊註解允許維護者控制合併時間、變基拉取請求或忽略特定更新。
  • 分組更新: 適當時,可以在單一提取要求中更新多個易受攻擊的相依性。

Dependabot 版本更新

Dependabot 版本更新 會讓相依性保持最新狀態,即使不存在弱點也一樣。 與僅更新易受攻擊的相依性的安全更新不同,版本更新會根據設定的排程主動將相依性更新為最新版本。

預定更新:

  • 可配置的頻率: 更新可以安排每天、每週或每月。
  • 更新策略: 設定是否要更新所有相依性、僅直接相依性或特定相依性群組。
  • 版本限制: 遵守資訊清單檔案中定義的語意版本控制條件約束。
  • 提取請求限制: 控制 Dependabot 建立的開啟提取要求數目,以避免維護人員不堪重負。

啟用 Dependabot 警示

依預設,Dependabot alerts 會針對公用存放庫啟用,但必須針對私人存放庫手動啟用。

啟用存放庫的警示

航海:

  1. 導覽至 GitHub 上的存放庫。
  2. 按一下存放庫功能表中的 設定
  3. 按一下左側邊欄中的 安全性與分析
  4. 找出 Dependabot alerts 區段。
  5. 按一下 [啟用] 以啟用 Dependabot alerts。

依賴關係圖要求: Dependabot 警示需要啟用相依性圖表。 相依性圖表會自動啟用公用儲存庫,但可能需要手動啟用專用儲存庫。

啟用相依性圖表:

  1. [設定] → [安全性與分析] 中,找出 [相依性圖表]。
  2. 如果相依性圖表尚未啟用,請按一下 啟用
  3. GitHub 將開始分析儲存庫依賴關係以建立依賴關係圖。

整個組織賦能

組織管理員可以在所有的儲存庫中啟用 Dependabot 警報:

組織設定:

  1. 導覽至組織 設定
  2. 按一下左側邊欄中的 安全性與分析
  3. 按一下 Dependabot 警示旁的 [全部啟用],以啟用所有目前和未來存放庫的警示。
  4. 選擇性地選取 [自動啟用新存放庫] ,以啟用新建立存放庫的警示。

支援的套件生態系統

Dependabot alerts 支援許多套件生態系統,包括:

支持的生態系統:

  • JavaScript: npm(package.json、package-lock.json)、Yarn(yarn.lock)。
  • Python: pip(requirements.txt、Pipfile、Pipfile.lock)、詩歌(poetry.lock)。
  • Ruby: Bundler(Gemfile、Gemfile.lock)。
  • Java: Maven(pom.xml)、Gradle(build.gradle、build.gradle.kts)。
  • .NET: NuGet(*.csproj, packages.config, paket.dependencies)。
  • Go: Go 模組(go.mod、go.sum)。
  • PHP: Composer (composer.json, composer.lock)。
  • Rust: Cargo (Cargo.toml、Cargo.lock)。
  • Elixir: Mix(mix.exs、mix.lock)。
  • Dart/Flutter: pub (pubspec.yaml、pubspec.lock)。
  • Docker: Dockerfile (基礎映像檔參考)。
  • GitHub 動作: 工作流程檔案 (動作版本)。
  • Terraform: Terraform 配置(模組版本)。

配置 Dependabot 安全更新

Dependabot 安全性更新需要明確啟用,即使已啟用警示亦然。

啟用安全性更新

儲存庫設定:

  1. 導覽至 「設定」→「安全性與分析」。
  2. 找到 Dependabot 安全性更新
  3. 按一下 啟用 以啟動自動安全更新的提取請求。
  4. Dependabot 將開始監視易受攻擊的相依性,並在修補程式可用時建立提取要求。

組織範圍的設定:

  1. 導覽至組織 設定 → 安全性與分析
  2. 按一下 Dependabot security updates 旁的 [全部啟用]
  3. 選取 [自動啟用新存放庫] 以啟用未來的存放庫。

安全性更新行為

自動建立提取請求:

  • 漏洞偵測:當 Dependabot 警示偵測到有可用修補程式的易受攻擊相依性時,安全性更新會建立提取要求。
  • 最少的更新: 提取要求只會更新至解決弱點的最低版本。
  • 語意版本設定: 更新遵循語義版本控制,盡可能優先使用修補程式更新而不是次要或主要更新。
  • 測試整合:提取要求會觸發現有的 CI/CD 檢查,以驗證更新。

相容性分數: GitHub 會計算相容性分數,指出更新會中斷現有功能的可能性:

  • 高相容性: 根據對類似儲存庫的分析,更新可能是安全的。
  • 介質相容性: 更新可能會引入需要檢閱的重大變更。
  • 低相容性: 更新可能包括需要修改程式碼的重大變更。
  • 未知相容性: 沒有足夠的數據來評估相容性。

提取要求管理:

  • 自動重訂基底:Dependabot 會在基底分支變更時自動重訂提取要求的基底。
  • 衝突解決:如果衝突會防止自動重設基底,則會關閉提取要求。
  • 取代更新: 當發行較新版本時,新的提取要求會取代舊的提取要求。
  • 預定更新: 拉取請求是根據配置的時間表創建的,以避免維護人員不堪重負。

設定 Dependabot 版本更新

版本更新需要定義更新排程和行為的組態檔。

建立dependabot.yml組態

版本更新是使用存放庫中的 `.github/dependabot.yml` 檔案來設定。

基本配置:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 10

配置選項:

  • 版本: 組態檔結構描述版本 (一律為 2)。
  • 更新: 不同套件生態系統的更新組態陣列。
  • 套件生態系統: 監控的套件管理器(npm、pip、bundler、maven、nuget 等)。
  • 目錄: 套件資訊清單檔案的位置 (/ 代表根目錄或子目錄路徑)。
  • schedule.interval: 更新頻率(每日、每週、每月)。
  • open-pull-requests-limit: Dependabot 建立的開啟提取要求數目上限 (預設值為 5)。

進階設定範例:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "08:00"
      timezone: "America/New_York"
    open-pull-requests-limit: 10
    reviewers:
      - "team/frontend-developers"
    assignees:
      - "dependency-manager"
    labels:
      - "dependencies"
      - "npm"
    commit-message:
      prefix: "npm"
      include: "scope"
    ignore:
      - dependency-name: "lodash"
        versions: ["4.x"]
    allow:
      - dependency-type: "production"

進階選項:

  • schedule.day: 每週進行更新的星期幾(星期一至星期日)。
  • 時間表.時間: 一天中的更新時間(24 小時格式)。
  • schedule.timezone: 排程時區 (IANA 時區識別碼)。
  • 審稿人: GitHub 使用者或小組將自動被要求審查拉取請求。
  • 指派者: GitHub 使用者自動被指派至拉取請求。
  • 標籤: 標籤會自動套用至提取要求。
  • commit-message.prefix: 提交訊息的前置詞(對傳統提交很有幫助)。
  • 忽略: 要忽略的相依性,可選擇使用特定版本範圍。
  • 允許:要更新的相依性類型 (生產、開發、全部)。

多個套件生態系統

使用多種語言生態系統的存放庫需要個別的更新設定:

多生態系統配置:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/frontend"
    schedule:
      interval: "weekly"

  - package-ecosystem: "pip"
    directory: "/backend"
    schedule:
      interval: "weekly"

  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"

此設定會監視 /frontend 中的 npm 相依性、/backend 中的 Python 相依性、整個存放庫中的 Docker 基礎映像檔,以及工作流程中的 GitHub Actions 版本。

管理 Dependabot 提取要求

Dependabot 拉取請求支援用於管理更新的特殊命令。

提取要求命令

註解指令:

  • @dependabot rebase 將拉取請求重新基底化到目前的基礎分支。
  • @dependabot recreate 重新建立拉取請求,覆蓋任何手動編輯。
  • @dependabot merge 一旦 CI 檢查通過,就會合併提取要求。
  • @dependabot squash and merge一旦通過檢查,Squash 會認可並合併。
  • @dependabot cancel merge 取消先前請求的合併。
  • @dependabot reopen 重新開啟已關閉的提取要求。
  • @dependabot close 關閉提取請求並防止 Dependabot 重新建立它。
  • @dependabot ignore this major version 關閉提取請求並忽略此主要版本的未來更新。
  • @dependabot ignore this minor version 關閉拉取請求,並忽略此小版本的未來更新。
  • @dependabot ignore this dependency 關閉提取請求並忽略此相依性的所有未來更新。

審查和合併更新資料

審核流程:

  1. 檢查提取要求描述: 瞭解已解決哪個弱點或更新了哪個版本。
  2. 檢閱相容性分數:估計中斷性變更的可能性。
  3. 檢查 CI/CD 結果: 確認自動化測試已順利通過。
  4. 查看發行說明: 瞭解相依性更新中包含的變更。
  5. 如有需要,在本地進行測試:對於重大更新,請在合併之前在本機測試功能。
  6. 合併提取請求: 核准並合併提取要求以更新相依性。

自動合併: 對於相容性分數高且通過測試的低風險更新,請考慮設定自動合併:

GitHub Actions 自動合併:

name: Auto-merge Dependabot PRs
on: pull_request

jobs:
  auto-merge:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - name: Enable auto-merge
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

此工作流程會自動啟用通過所有必要檢查的 Dependabot 提取要求的自動合併。

Dependabot 警示和通知

Dependabot 提供弱點警示的多種通知機制。

通知管道

網絡通知:

  • GitHub 通知: 警示會顯示在 GitHub 通知收件匣中。
  • 安全性標籤: 警示會顯示在 Dependabot alerts 底下的 [存放庫安全性] 索引標籤中。
  • 儲存庫見解: [深入解析] 索引標籤中的相依性圖表會顯示易受攻擊的相依性。

電子郵件通知:

  • 摘要電子郵件: 列出新警報的每週摘要電子郵件。
  • 即時電子郵件: 針對嚴重漏洞的即時電子郵件。
  • 組織通知: 組織管理員會收到所有儲存庫的通知。

自訂通知:

  • 網路鉤子: 設定 Webhook 以在外部系統中接收警示通知。
  • GitHub API: 查詢 Dependabot alerts API,以程式設計方式擷取警示資訊。
  • 安全整合: 第三方安全性平臺可以透過 API 與 Dependabot alerts 整合。

設定通知喜好設定

使用者通知設定:

  1. 流覽至 GitHub 設定→通知
  2. 找到 [安全性警示] 區段。
  3. 設定通知偏好設定:
    • 參與:接收您所監控或參與的儲存庫通知。
    • 監看:接收所有受監看存放庫的通知。
    • 電子郵件: 啟用安全性警示的電子郵件通知。
    • 網: 在 GitHub UI 中啟用 Web 通知。

組織通知設定:

  1. 導覽至組織 設定 → 安全性與分析
  2. 設定誰會接收安全性警示通知:
    • 組織擁有者: 自動接收所有安全警報。
    • 安全經理: 指定的安全團隊收到警報。
    • 儲存庫管理員: 每個存放庫管理員都會收到其存放庫的警示。

檢閱 Dependabot 警示

「安全性」標籤提供全面的警示管理。

警示詳細資料

導覽至警示:

  1. 在 GitHub 上開啟存放庫。
  2. 按一下 [安全性] 索引標籤。
  3. 按一下左側邊欄中的 Dependabot alerts
  4. 檢閱作用中警示清單。

警報資訊:

  • 嚴重: 嚴重性分類為嚴重性、高、中或低。
  • 包: 受影響的相依性名稱和版本。
  • 弱點: CVE 識別碼和說明。
  • 修補版本: 解決弱點的版本。
  • 易受攻擊的程式碼路徑: 是否實際使用易受攻擊的程式碼 (如果可連線性分析可用)。
  • 自動修復可用: Dependabot 是否可以自動建立提取要求來修正弱點。

管理警示

警示動作:

  • 檢閱提取請求: 如果存在自動安全性更新,請檢閱並合併提取要求。
  • 解除警報: 解除誤報或已接受的風險,並提供解除理由。
  • 貪睡警報: 暫時關閉無法立即解決的警示。
  • 重新開啟警示: 如果情況發生變化,請重新開啟先前關閉的警示。

解僱原因:

  • 修復開始: 團隊正在積極進行補救。
  • 無帶寬: 問題已確認,但目前無法解決。
  • 可容忍風險: 在這種情況下,漏洞不會造成重大風險。
  • 不準確: 警示是誤報。

GitHub 進階安全性整合

GitHub Dependabot 是 GitHub Advanced Security 的核心元件,GitHub Advanced Security 是 GitHub 的全方位安全性平台,可提供企業級安全性功能來保護您的軟體供應鏈。

進階安全性功能

整合安全功能:

  • 相依性掃描: Dependabot 會使用 GitHub 諮詢資料庫和產業弱點資料庫,自動掃描相依性以尋找已知弱點。
  • 袐密掃描:偵測存放庫程式碼和歷程記錄中意外提交的袐密、權杖和認證。
  • 程式碼掃描: 使用 CodeQL 和其他分析引擎來尋找原始程式碼中的安全性弱點和編碼錯誤。
  • 安全性概觀: 提供對安全警報、漏洞和補救狀態的組織範圍的可見性。
  • 供應鏈安全: 依賴關係圖、依賴關係審查和 SBOM 生成,以實現全面的供應鏈可見性。

授權和可用性

進階安全性存取:

  • 公用儲存庫: 所有 GitHub Advanced Security 功能都可以在公用存放庫上免費使用。
  • 私人儲存庫: 需要 GitHub Advanced Security 授權 (包含在 GitHub Enterprise Cloud 和 GitHub Enterprise Server 中)。
  • GitHub 免費版/團隊: Dependabot 警示和安全性更新可供使用,但程式碼掃描和秘密掃描需要進階安全性授權。

安全性概觀儀表板

安全性概觀提供組織層級的可見度:

組織安全性指標:

  • 警報趨勢: 檢視一段時間內所有存放庫的安全警示趨勢。
  • 風險評估: 根據嚴重和高嚴重性警示,識別具有最高安全風險的儲存庫。
  • 團隊覆蓋範圍: 監控哪些團隊啟用了安全功能並追蹤補救進度。
  • 合規報告: 產生安全合規性和稽核要求的報告。

存取安全性概觀:

  1. 在 GitHub 上瀏覽至您的組織。
  2. 按一下 [安全性] 索引標籤。
  3. 檢閱整個組織的安全性計量、警示計數和趨勢。
  4. 向下切入特定存放庫或警示類型以進行詳細調查。

啟用進階安全性

對於組織擁有者:

  1. 導覽至組織 設定
  2. 按一下 程式碼安全性和分析
  3. 啟用私人存放庫的 GitHub Advanced Security
  4. 設定以下的預設設定:
    • 相依性圖表 (自動啟用)。
    • Dependabot 警報。
    • Dependabot 安全性更新。
    • 機密掃描
    • 程式碼掃描 (需要工作流程設定)。

存放庫層級啟用:

個別存放庫可以啟用或停用進階安全性功能:

  1. 導覽至存放庫 設定
  2. 按一下 程式碼安全性和分析
  3. 啟用所需的安全功能:
    • 依賴關係圖: Dependabot 功能必需。
    • Dependabot alerts: 弱點通知。
    • Dependabot 安全性更新:自動弱點修正提取要求。
    • 秘密掃描: 認證洩漏偵測。
    • 程式碼掃描: 靜態應用程式安全測試 (SAST)。

與開發工作流程整合

GitHub Advanced Security 與開發程式無縫整合:

提取要求整合:

  • 依賴審查: 自動審查拉取請求中的依賴項更改,突出顯示依賴項更新引入的新漏洞。
  • 安全檢查: 程式碼掃描和秘密掃描會在提取要求上自動執行,並在發現嚴重問題時封鎖合併。
  • 所需審查: 設定分支保護規則,以要求安全性小組核准具有安全性警示的提取要求。

安全政策:

  • SECURITY.md: 定義漏洞揭露政策和安全聯絡資訊。
  • 代碼所有者: 將安全性小組成員指派為相依性檔案的程式碼擁有者 (package.json、 requirements.txt、 pom.xml)。
  • 分支保護: 在允許合併之前,要求對安全性掃描進行狀態檢查。

審計與合規:

  • 稽核記錄: 追蹤所有與安全性相關的動作,包括警示關閉、功能啟用和存取變更。
  • 安全政策: 在所有儲存庫中強制執行組織範圍的安全標準。
  • 合規整合: 匯出 SOC 2、ISO 27001 和其他合規性架構的安全資料。

GitHub Advanced Security 為您的軟體供應鏈提供企業級保護,而 Dependabot 則作為相依性安全性管理的基礎。 該平台的整合方法確保全面的漏洞檢測、自動修復和組織範圍內的安全可見性。

GitHub Dependabot 提供直接整合到 GitHub 工作流程中的全面、自動化相依性安全性管理。 透過啟用警報、安全性更新和版本更新,開發團隊可以主動解決漏洞,並減少人工工作量以維護最新的依賴關係。 下一個單元將探討如何將軟體組合分析檢查整合到 GitHub 內建功能之外的 CI/CD 管道中。