自動掃描 Java 套件

本文說明如何啟用 Container Scanning API、將映像檔推送至 Artifact Registry,以及查看映像檔中發現的安全漏洞清單。

Artifact Analysis 會將安全漏洞資訊儲存為附註。系統會為與圖片相關聯的每個附註例項建立「例項」。詳情請參閱總覽和定價文件。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry and Container Scanning APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Artifact Registry and Container Scanning APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. 在 Artifact Registry 中建立 Docker 存放區,並將含有 Java 程式碼的容器映像檔推送至該存放區。如果您不熟悉 Artifact Registry,請參閱 Docker 快速入門導覽課程。

    如要瞭解如何使用 Cloud Build 建構 Java 應用程式並容器化,請參閱「 建構、測試 Java 應用程式並容器化」。

必要的角色

如要取得查看套件掃描結果所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

查看映像檔安全漏洞

Artifact Analysis 會掃描上傳至 Artifact Registry 的新映像檔。這項掃描會擷取容器中套件的相關資訊。

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Container Analysis API,查看 Artifact Registry 中映像檔的安全漏洞發生情形。如果映像檔有安全漏洞,您可以取得詳細資料。

只要映像檔和套件在過去 30 天內曾被提取,Artifact Analysis 就會繼續掃描。30 天後,系統將停止更新掃描過的映像檔和套件中繼資料,結果也會過時。

Artifact Analysis 會封存過時逾 90 天的中繼資料。您只能使用 API 評估這類封存的中繼資料。 如要重新掃描中繼資料過時或已封存的映像檔,請提取該映像檔。重新整理中繼資料最多可能需要 24 小時才能完成。如果套件的中繼資料過時或已封存,就無法重新掃描。

在 Google Cloud 控制台中查看發生次數

如要查看映像檔中的安全漏洞,請按照下列步驟操作:

  1. 取得存放區清單。

    開啟「Repositories」(存放區) 頁面

  2. 在存放區清單中,按一下存放區。

  3. 在映像檔清單中,按一下映像檔名稱。

    「Vulnerabilities」(安全漏洞) 欄會顯示各個映像檔摘要的安全漏洞總數。

    掃描後發現有安全漏洞的映像檔

  4. 如要查看映像檔的安全漏洞清單,請按一下「Vulnerabilities」(安全漏洞) 欄中的連結。

    「掃描結果」部分會顯示掃描的套件類型摘要、安全漏洞總數、有修正程式的安全漏洞、沒有修正程式的安全漏洞,以及實際嚴重性。

    「掃描結果」頁面會列出安全漏洞、修正方式和實際嚴重性

    安全漏洞表格會列出找到的每個安全漏洞的常見安全漏洞與資料外洩風險 (CVE) 名稱、實際嚴重性、通用漏洞評分系統 (CVSS) 分數、修正程式 (如有)、含有安全漏洞的套件名稱,以及套件類型。

    Google Cloud 控制台在這個表格中,每頁最多顯示 1,200 個安全漏洞。你可以篩選及排序這些檔案,依副檔名查看特定檔案、目錄、圖層或檔案類型。

  5. 如要查看特定 CVE 的詳細資料,請按一下 CVE 名稱。

  6. 如要查看安全漏洞發生詳細資料 (例如版本號碼和受影響的位置),請在安全漏洞名稱所在的資料列中,按一下「View」(查看) 或「View Fixed」(查看已修正)。如果安全漏洞沒有修正,連結文字會顯示「查看」;如果安全漏洞已修正,連結文字則會顯示「查看已修正」。

查看特定層中的安全漏洞

構件分析會提供特定層級的中繼資料,協助您找出含有安全漏洞的套件,以及導入該層級的 Docker 建構指令。

如要在 Google Cloud 控制台中查看以層為準的安全性弱點中繼資料,請按照下列步驟操作:

  1. 在 Artifact Registry 中開啟存放區清單。

    開啟「Repositories」(存放區) 頁面

  2. 在「Repositories」(存放區) 頁面中,按一下存放區。

  3. 在「Repository Details」(存放區詳細資料) 頁面中,按一下圖片。

  4. 在圖片版本清單中,按一下圖片摘要。

  5. 在映像檔摘要詳細資料頁面中,按一下「安全漏洞」分頁標籤。

    如果提供以圖層為準的中繼資料,構件分析會在「圖層」列中顯示可選取的圖層清單:

    圖片摘要的「安全漏洞」頁面圖片,包括「層」列。圖層列的下拉式選單會列出編號清單,供您選取。

  6. 如要查看圖層清單,請按一下圖層下拉式選單。

    系統會開啟下拉式選單,顯示圖層的編號清單。第 0 層代表最底層,後續各層都建立在前一層之上。這裡只會顯示偵測到安全漏洞的層。

    圖片:展開的圖層下拉式選單。這個選單會顯示用於建構層的 Docker 指令,以及每個層的弱點類型和數量。

    Artifact Analysis 會顯示用於建構各層的 Docker 指令,以及在該層中發現的安全漏洞數量。

  7. 如要進一步瞭解特定層中的安全漏洞,請從層清單中選取層。

    安全漏洞表格會更新,只顯示在所選層中發現的安全漏洞。您可以套用更多篩選條件,或調查特定安全漏洞。

  8. 點選安全漏洞旁的「查看」或「查看修正」,即可查看更詳細的安全漏洞資訊。

    「Vulnerability details」(安全漏洞詳細資料) 側邊面板會顯示套件有安全漏洞的檔案位置。

  9. 在「檔案位置」表格中,將游標懸停在問號上,即可開啟其他圖層中繼資料。

    對話方塊會顯示層索引、層建構指令、層摘要和基礎映像檔,方便您修正安全漏洞。

使用 gcloud 查看發生項目

如要查看 Artifact Registry 中映像檔的發生事項,請執行 gcloud artifacts docker images list 指令:

  gcloud artifacts docker images list --show-occurrences \
      LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

其中:

  • LOCATION 是存放區的區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • REPOSITORY 是儲存映像檔的存放區名稱。
  • IMAGE_ID 是存放區中的映像檔名稱。 您無法使用這個指令指定映像檔標記。

根據預設,指令會傳回最近 10 筆結果。如要顯示不同數量的結果,請使用 --show-occurrences-from 旗標。舉例來說,下列指令會傳回最近 25 筆結果:

gcloud artifacts docker images list --show-occurrences-from=25 \
    us-central1-docker.pkg.dev/my-project/my-repo/my-image

輸出內容大致如下:

圖片輸出內容範例

  {
      "name": "projects/my-project/locations/us-central1/occurrences/22d3edfb-34f2-4d3f-be08-fd90c549f010",
      "resource": {
        "uri": "https://us-central1-docker.pkg.dev/my-project/my-repo/golang-nginx@sha256:5b54ef20748417ccdb0b87afedf98c44e699e2f59bd6cv48cbdc1ca2e72c80e3"
      },
      "noteName": "projects/my-project/locations/us-central1/notes/CVE-2005-2541",
      "kind": "VULNERABILITY",
      "createTime": "2025-01-21T15:57:01.238832Z",
      "updateTime": "2025-01-21T15:57:01.238832Z",
      "vulnerability": {
        "severity": "CRITICAL",
        "cvssScore": 10,
        "packageIssue": [
          {
            "affectedLocation": {
              "cpeUri": "cpe:/o:debian:debian_linux:12",
              "package": "tar",
              "version": {
                "name": "1.34+dfsg",
                "revision": "1.2+deb12u1",
                "kind": "NORMAL"
              }
            },
            "fixedLocation": {
              "cpeUri": "cpe:/o:debian:debian_linux:12",
              "package": "tar",
              "version": {
                "kind": "MAXIMUM"
              }
            },
            "packageType": "OS",
            "effectiveSeverity": "LOW",
            "file_location": [
                {
                "file_path": "/var/lib/dpkg/status",
                "layerDetails": {
                  "index": 0,
                  "diffID": "sha256:123",
                  "buildCommand": "FROM golang:example_sha256",
                  "BaseImages": [
                    {
                      "name": "library/golang",
                    },
                  ],
                },
              },
            ],
          }
        ],
        "shortDescription": "CVE-2005-2541",
        "longDescription": "NIST vectors: AV:N/AC:L/Au:N/C:C/I:C/A:C",
        "relatedUrls": [
          {
            "url": "https://security-tracker.debian.org/tracker/CVE-2005-2541",
            "label": "More Info"
          }
        ],
        "effectiveSeverity": "LOW",
        "cvssVersion": "CVSS_VERSION_2",
        "cvssV2": {
          "baseScore": 10,
          "attackVector": "ATTACK_VECTOR_NETWORK",
          "attackComplexity": "ATTACK_COMPLEXITY_LOW",
          "authentication": "AUTHENTICATION_NONE",
          "confidentialityImpact": "IMPACT_COMPLETE",
          "integrityImpact": "IMPACT_COMPLETE",
          "availabilityImpact": "IMPACT_COMPLETE"
        }
      }
    }
  

篩選安全漏洞發生次數

如要篩選弱點發生次數,請使用 --occurrence-filter 參數:

gcloud artifacts docker images list --show-occurrences \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
    --occurrence-filter=FILTER_EXPRESSION

其中:

  • LOCATION 是存放區的單一區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • REPOSITORY 是儲存映像檔的存放區名稱。
  • IMAGE_ID 是存放區中的圖片名稱。
  • FILTER_EXPRESSION 是範例篩選運算式,格式請參閱「篩選安全漏洞發生次數」。

查看特定層的安全漏洞

您可以透過 layerDetails 欄位,判斷哪個特定層引進了有安全漏洞的套件,並查看該層的其他資訊。例如,請考慮下列圖片的 layerDetails 輸出:

  "layerDetails": {
    "index": 0,
    "diffID": "sha256:123",
    "buildCommand": "FROM golang:example_sha256",
    "BaseImages": [
      {
        "name": "library/golang",
      },
    ],
  }

輸出內容顯示映像檔中的層索引為 0,層雜湊為 sha256:123。用於建構這個層的 Docker 建構指令是 FROM golang:example_sha256,這個層也會出現在 library/golang 基本映像檔中。

使用 API 查看發生記錄

如何取得專案的例項清單:

 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences

如何取得專案的安全漏洞匯總資料:

 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences:vulnerabilitySummary

如要取得特定事件的詳細資料,請按照下列步驟操作:

 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences/OCCURRENCE_ID

在 Cloud Build 中查看安全漏洞

如果您使用 Cloud Build,也可以在 Google Cloud 控制台的「安全洞察」側邊面板中查看映像檔安全漏洞。

安全性深入分析側邊面板會提供儲存在 Artifact Registry 中的構件建構安全性資訊高階總覽。如要進一步瞭解側邊面板,以及如何使用 Cloud Build 協助保護軟體供應鏈,請參閱「查看建構作業安全性洞察資訊」。

篩選發生次數

您可以在 gcloud 指令和 Artifact Analysis API 中使用篩選器字串,先篩選出現項目再查看。以下各節說明支援的搜尋篩選器。

查看特定類型的事件

您可以使用 kind 值,依發生類型篩選資料。請參閱可用的種類。

以下範例說明如何篩選套件安全漏洞發生次數:

gcloud

在 gcloud CLI 中執行下列指令:

gcloud artifacts docker images list --show-occurrences \
    --occurrence-filter='kind="PACKAGE_VULNERABILITY"' --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

其中:

  • PACKAGE_VULNERABILITY 是發生的類型。
  • LOCATION 是存放區的單一區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • REPOSITORY 是儲存映像檔的存放區名稱。
  • IMAGE_ID 是存放區中的圖片名稱。

API

在 API 查詢中,使用下列篩選運算式:

kind="PACKAGE_VULNERABILITY" AND resourceUrl="RESOURCE_URL"

其中:

  • DEPLOYMENT 是發生項目種類。
  • RESOURCE_URL 是圖片的完整網址,格式為 https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@sha256:HASH:
    • LOCATION 是存放區的區域或多區域位置。
    • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
    • REPOSITORY 是儲存映像檔的存放區名稱。
    • IMAGE_ID 是存放區中的映像檔名稱。 您無法使用這項指令指定映像檔標記。

您可以使用 hasPrefix 函式,以更廣泛的範圍進行篩選。

舉例來說,下列篩選器會篩選同一套件多個版本中特定類型的項目:

kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")

其中:

  • RESOURCE_URL_PREFIX 指定資源網址中的子字串。
    • 如要篩選映像檔的所有版本,請省略映像檔摘要。請使用以下格式:https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
    • 如要篩選專案中的所有圖片,請只指定資源位置和專案。請使用以下格式:https://LOCATION-docker.pkg.dev/PROJECT_ID/

查看安全漏洞例項

您可以使用 gcloud CLI 或 Artifact Analysis API 查看安全漏洞發生次數清單。

gcloud

如要擷取映像檔的安全漏洞發生次數清單,可以依 VULNERABILITY 發生次數類型篩選:

gcloud artifacts docker images list \
    --show-occurrences \
    --occurrence-filter='kind="VULNERABILITY"' \
    --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

其中:

  • VULNERABILITY 是發生的類型。
  • LOCATION 是存放區的區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • REPOSITORY 是儲存映像檔的存放區名稱。
  • IMAGE_ID 是存放區中的圖片名稱。

API

在 API 查詢中,使用下列篩選運算式:

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22

其中:

  • ENCODED_RESOURCE_URL 是圖片的編碼路徑。如要瞭解編碼,請參閱網址編碼。

如要進一步瞭解如何使用 API,請參閱 projects.occurrences.get。

依套裝組合類型篩選

如要將安全漏洞掃描結果限制為單一套件類型,請執行下列 gcloud CLI 指令:

  gcloud artifacts docker images list /
      --show-occurrences /
      --occurrence-filter='kind="VULNERABILITY" AND packageType="PACKAGE_TYPE"' /
      LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

其中:

  • VULNERABILITY 是發生的類型。
  • PACKAGE_TYPE 是應用程式語言套件類型。 可用的類型包括:COMPOSER、GO、MAVEN、NPM、NUGET、PYTHON、RUBYGEMS 和 RUST。
  • LOCATION 是存放區的單一區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • REPOSITORY 是儲存映像檔的存放區名稱。
  • IMAGE_ID 是存放區中的映像檔名稱。 您無法使用這個指令指定映像檔標記。

查看與特定記事相關聯的圖片

您可以擷取與特定附註 ID 相關聯的資源清單。例如,您可以列出含有特定 CVE 安全漏洞的映像檔。

如要列出專案中與特定註記相關聯的的所有映像檔,請使用下列篩選器運算式:

gcloud

gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID

其中:

  • goog-vulnz 是 Artifact Analysis 漏洞分析的 PROVIDER_PROJECT_ID。如果您在自訂專案中使用 Artifact Analysis,可以將這個值替換為自己的供應商專案 ID。
  • LOCATION 是存放區的單一區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • NOTE_ID 是註記的 ID。舉例來說,當您在構件分析掃描結果中看到安全性弱點時,通常會使用類似 CVE-2019-12345 的 CVE ID 格式。

API

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=noteProjectId%3D%22goog-vulnz%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22%20AND%20noteId%3D%22NOTE_ID%22

其中:

  • goog-vulnz 是 Artifact Analysis 漏洞分析的 PROVIDER_PROJECT_ID。如果您在自訂專案中使用構件分析,可以將這個值換成自己的提供者專案 ID。
  • ENCODED_RESOURCE_URL 是圖片的編碼路徑。如要瞭解編碼,請參閱「網址編碼」。
  • NOTE_ID 是註記的 ID。舉例來說,當您在 Artifact Analysis 掃描結果中看到安全漏洞時,通常會使用類似 CVE-2019-12345 的 CVE ID 格式。

如要檢查特定附註的特定圖片,請使用下列篩選運算式:

gcloud

gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

地點

  • LOCATION 是存放區的單一區域或多區域位置。
  • PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
  • REPOSITORY 是儲存映像檔的存放區名稱。
  • IMAGE_ID 是存放區中的映像檔名稱。您無法使用這項指令指定圖片標記。

API

在 API 查詢中,加入下列篩選運算式:

resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \
AND noteId="NOTE_ID"

其中:

  • RESOURCE_URL 是圖片的完整網址,格式為 http://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@sha256:HASH。
  • goog-vulnz 是 Artifact Analysis 漏洞分析的 PROVIDER_PROJECT_ID。
  • NOTE_ID 是註記的 ID。安全性相關附註通常會以 CVE-2019-12345 格式呈現。

後續步驟