實施 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 會針對公用存放庫啟用,但必須針對私人存放庫手動啟用。
啟用存放庫的警示
航海:
- 導覽至 GitHub 上的存放庫。
- 按一下存放庫功能表中的 設定 。
- 按一下左側邊欄中的 安全性與分析 。
- 找出 Dependabot alerts 區段。
- 按一下 [啟用] 以啟用 Dependabot alerts。
依賴關係圖要求: Dependabot 警示需要啟用相依性圖表。 相依性圖表會自動啟用公用儲存庫,但可能需要手動啟用專用儲存庫。
啟用相依性圖表:
- 在 [設定] → [安全性與分析] 中,找出 [相依性圖表]。
- 如果相依性圖表尚未啟用,請按一下 啟用 。
- GitHub 將開始分析儲存庫依賴關係以建立依賴關係圖。
整個組織賦能
組織管理員可以在所有的儲存庫中啟用 Dependabot 警報:
組織設定:
- 導覽至組織 設定。
- 按一下左側邊欄中的 安全性與分析 。
- 按一下 Dependabot 警示旁的 [全部啟用],以啟用所有目前和未來存放庫的警示。
- 選擇性地選取 [自動啟用新存放庫] ,以啟用新建立存放庫的警示。
支援的套件生態系統
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 安全性更新需要明確啟用,即使已啟用警示亦然。
啟用安全性更新
儲存庫設定:
- 導覽至 「設定」→「安全性與分析」。
- 找到 Dependabot 安全性更新。
- 按一下 啟用 以啟動自動安全更新的提取請求。
- Dependabot 將開始監視易受攻擊的相依性,並在修補程式可用時建立提取要求。
組織範圍的設定:
- 導覽至組織 設定 → 安全性與分析。
- 按一下 Dependabot security updates 旁的 [全部啟用]。
- 選取 [自動啟用新存放庫] 以啟用未來的存放庫。
安全性更新行為
自動建立提取請求:
- 漏洞偵測:當 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: 關閉提取請求並忽略此相依性的所有未來更新。
審查和合併更新資料
審核流程:
- 檢查提取要求描述: 瞭解已解決哪個弱點或更新了哪個版本。
- 檢閱相容性分數:估計中斷性變更的可能性。
- 檢查 CI/CD 結果: 確認自動化測試已順利通過。
- 查看發行說明: 瞭解相依性更新中包含的變更。
- 如有需要,在本地進行測試:對於重大更新,請在合併之前在本機測試功能。
- 合併提取請求: 核准並合併提取要求以更新相依性。
自動合併: 對於相容性分數高且通過測試的低風險更新,請考慮設定自動合併:
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 整合。
設定通知喜好設定
使用者通知設定:
- 流覽至 GitHub 設定→通知。
- 找到 [安全性警示] 區段。
- 設定通知偏好設定:
- 參與:接收您所監控或參與的儲存庫通知。
- 監看:接收所有受監看存放庫的通知。
- 電子郵件: 啟用安全性警示的電子郵件通知。
- 網: 在 GitHub UI 中啟用 Web 通知。
組織通知設定:
- 導覽至組織 設定 → 安全性與分析。
- 設定誰會接收安全性警示通知:
- 組織擁有者: 自動接收所有安全警報。
- 安全經理: 指定的安全團隊收到警報。
- 儲存庫管理員: 每個存放庫管理員都會收到其存放庫的警示。
檢閱 Dependabot 警示
「安全性」標籤提供全面的警示管理。
警示詳細資料
導覽至警示:
- 在 GitHub 上開啟存放庫。
- 按一下 [安全性] 索引標籤。
- 按一下左側邊欄中的 Dependabot alerts 。
- 檢閱作用中警示清單。
警報資訊:
- 嚴重: 嚴重性分類為嚴重性、高、中或低。
- 包: 受影響的相依性名稱和版本。
- 弱點: 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 警示和安全性更新可供使用,但程式碼掃描和秘密掃描需要進階安全性授權。
安全性概觀儀表板
安全性概觀提供組織層級的可見度:
組織安全性指標:
- 警報趨勢: 檢視一段時間內所有存放庫的安全警示趨勢。
- 風險評估: 根據嚴重和高嚴重性警示,識別具有最高安全風險的儲存庫。
- 團隊覆蓋範圍: 監控哪些團隊啟用了安全功能並追蹤補救進度。
- 合規報告: 產生安全合規性和稽核要求的報告。
存取安全性概觀:
- 在 GitHub 上瀏覽至您的組織。
- 按一下 [安全性] 索引標籤。
- 檢閱整個組織的安全性計量、警示計數和趨勢。
- 向下切入特定存放庫或警示類型以進行詳細調查。
啟用進階安全性
對於組織擁有者:
- 導覽至組織 設定。
- 按一下 程式碼安全性和分析。
- 啟用私人存放庫的 GitHub Advanced Security 。
- 設定以下的預設設定:
- 相依性圖表 (自動啟用)。
- Dependabot 警報。
- Dependabot 安全性更新。
- 機密掃描
- 程式碼掃描 (需要工作流程設定)。
存放庫層級啟用:
個別存放庫可以啟用或停用進階安全性功能:
- 導覽至存放庫 設定。
- 按一下 程式碼安全性和分析。
- 啟用所需的安全功能:
- 依賴關係圖: 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 管道中。