本文將說明如何啟用 Container Scanning API、將映像檔推送至 Artifact Registry,以及查看映像檔中發現的安全漏洞清單。
Artifact Analysis 會提供 Artifact Registry 中容器映像檔的安全漏洞資訊。中繼資料會儲存為附註。系統會為與圖片相關聯的每個附註執行個體建立「事件」。詳情請參閱總覽和定價文件。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自體驗產品的實際應用成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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.enablepermission. 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.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init -
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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.enablepermission. 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.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init - 在 Artifact Registry 中建立 Docker 存放區,並將容器映像檔推送至該存放區。如果您不熟悉 Artifact Registry,請參閱 Docker 快速入門導覽課程。
啟用這項 API 後,系統也會在 Artifact Registry 中掃描語言套件。請參閱支援的套件類型。
必要的角色
如要取得查看套件掃描結果所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
- Container Scanner 服務代理程式 (
roles/containerscanning.ServiceAgent) - 容器分析例項檢視者 (
roles/containeranalysis.occurrences.viewer) - 容器分析筆記檢視者 (
roles/containeranalysis.notes.viewer) - Artifact Registry 讀取者 (
roles/artifactregistry.reader)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
查看映像檔安全漏洞
Artifact Analysis 會掃描上傳至 Artifact Registry 的新映像檔。這項掃描會擷取容器中系統套件的相關資訊。
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Container Analysis API,查看登錄檔中映像檔的安全漏洞事件。如果映像檔有安全漏洞,您就能取得詳細資料。
只要映像檔和套件在過去 30 天內曾被提取,Artifact Analysis 就會繼續掃描。30 天後,系統將停止更新掃描過的映像檔和套件中繼資料,結果也會過時。
Artifact Analysis 會封存超過 90 天未更新的中繼資料。這類封存中繼資料只能透過 API 評估。如要重新掃描中繼資料過時或已封存的映像檔,請提取該映像檔。 重新整理中繼資料最多可能需要 24 小時才能完成。如果套件的中繼資料過時或已封存,就無法重新掃描。
在 Google Cloud 控制台中查看事件
如要查看映像檔中的安全漏洞,請按照下列步驟操作:
取得存放區清單。
在存放區清單中,按一下存放區。
在圖片清單中,按一下圖片名稱。
「Vulnerabilities」(安全漏洞) 欄會顯示各個映像檔摘要的安全漏洞總數。
如要查看映像檔的安全漏洞清單,請按一下「安全漏洞」欄中的連結。
「掃描結果」部分會顯示掃描的套件類型摘要、安全漏洞總數、有修正程式的安全漏洞、沒有修正程式的安全漏洞,以及實際嚴重性。
安全漏洞表格會列出每個發現的安全漏洞的常見安全漏洞與資料外洩風險 (CVE) 名稱、實際嚴重性、通用漏洞評分系統 (CVSS) 分數、修正程式 (如有)、含有安全漏洞的套件名稱,以及套件類型。
Google Cloud 控制台會在表格中顯示每個頁面最多 1200 個安全漏洞。您可以篩選及排序這些檔案,依副檔名查看特定檔案、目錄、層或檔案類型。
如要查看特定 CVE 的詳細資料,請按一下 CVE 名稱。
如要查看安全漏洞發生詳細資料 (例如版本號碼和受影響的位置),請在安全漏洞名稱所在的資料列中,按一下「View」(查看) 或「View Fixed」(查看已修正)。如果安全漏洞沒有修正,連結文字會顯示「查看」;如果安全漏洞已修正,連結文字則會顯示「查看已修正」。
查看特定層中的安全漏洞
構件分析會提供特定層級的中繼資料,協助您找出含有安全漏洞的套件,以及導入該層級的 Docker 建構指令。如要在 Google Cloud 控制台中查看以層為準的安全性弱點中繼資料,請按照下列步驟操作:
在 Artifact Registry 中開啟存放區清單。
在「Repositories」(存放區) 頁面中,按一下存放區。
在「Repository Details」(存放區詳細資料) 頁面中,按一下圖片。
在圖片版本清單中,按一下圖片摘要。
在映像檔摘要詳細資料頁面中,按一下「安全漏洞」分頁標籤。
如果提供以圖層為準的中繼資料,構件分析會在「圖層」列中顯示可選取的圖層清單:
如要查看圖層清單,請按一下圖層下拉式選單。
下拉式選單會隨即開啟,顯示編號清單圖層。第 0 層代表最底層,後續各層都建立在前一層之上。這裡只會顯示偵測到安全漏洞的層。
Artifact Analysis 會顯示用於建構各層的 Docker 指令,以及在該層中發現的安全漏洞數量。
如要進一步瞭解特定層中的安全漏洞,請從層清單中選取層。
安全漏洞表格會更新,只顯示在所選層中發現的安全漏洞。您可以套用更多篩選器,或調查特定安全漏洞。
點選安全漏洞旁的「查看」或「查看修正」,即可查看更詳細的安全漏洞資訊。
「安全漏洞詳細資料」側邊面板會顯示套件有安全漏洞的檔案位置。
在「檔案位置」表格中,將游標懸停在問號上,即可開啟其他圖層中繼資料。
對話方塊會顯示層索引、層建構指令、層摘要和基礎映像檔,方便您修正安全漏洞。
使用 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 或程式碼查看事件
如要查看圖片的出現次數,請以以下格式指定圖片網址:
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
API
使用 cURL
如何取得專案的例項清單:
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
Java
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Java API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Go API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱 Artifact Analysis Node.js API 參考文件。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Ruby
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Ruby API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱 Artifact Analysis Python API 參考文件。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
在 Cloud Build 中查看發生項目
如果您使用 Cloud Build,也可以在 Google Cloud 控制台的「安全洞察」側邊面板中查看映像檔安全漏洞。
「Security insights」(安全性深入分析) 側邊面板會概略說明 Artifact Registry 中儲存構件的建構安全性資訊。如要進一步瞭解側邊面板,以及如何使用 Cloud Build 協助保護軟體供應鏈,請參閱「查看建構作業安全性洞察資訊」。
篩選發生次數
您可以在 gcloud 指令和 Artifact Analysis API 中使用篩選字串,先篩選出要查看的事件,以下各節說明支援的搜尋篩選器。
查看探索到的例項
首次將映像檔推送至 Artifact Registry 時,Artifact Registry 會建立探索事件,其中包含容器映像檔的初始掃描資訊。
如要擷取映像檔的掃描結果例項,請使用下列篩選器運算式:
kind="DISCOVERY" AND resourceUrl="RESOURCE_URL"
其中 RESOURCE_URL 的格式如下:
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
gcloud
查看圖片的探索事件:
在本例中,運算式不會直接用於指令,但會以引數形式傳遞相同資訊:
Artifact Registry:
gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="DISCOVERY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
API
如要擷取探索事件,篩選運算式必須經過網址編碼,並嵌入 GET 要求中,如下所示:
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22DISCOVERY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
詳情請參閱 projects.occurrences.get API 端點。
Java
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Java API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Go API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱 Artifact Analysis Node.js API 參考文件。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Ruby
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Ruby API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Python API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
查看安全漏洞發生次數
如要查看特定映像檔的安全漏洞例項,請使用篩選器運算式建立查詢:
kind="VULNERABILITY" AND resourceUrl="RESOURCE_URL"
其中 RESOURCE_URL 的格式如下:
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
gcloud
在本例中,運算式不會直接用於指令,但會以引數形式傳遞相同資訊:
Artifact Registry
gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="VULNERABILITY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
API
資源網址必須經過網址編碼,並以 GET 要求內嵌,如下所示:
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
詳情請參閱 projects.occurrences.get API 端點。
Java
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Java API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Go API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Node.js
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱 Artifact Analysis Node.js API 參考文件。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Ruby
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Ruby API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Python
如要瞭解如何安裝及使用 Artifact Analysis 的用戶端程式庫,請參閱「Artifact Analysis 用戶端程式庫」。詳情請參閱「Artifact Analysis Python API 參考文件」。
如要向 Artifact Analysis 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
查看特定類型的事件
在先前的兩個範例中,篩選運算式之間的唯一差異是 kind 的值,這個值會識別事件類型。使用這個欄位,即可將出現項目清單限制為特定類型,例如安全漏洞或部署作業。
如要擷取特定圖片的出現次數,請使用下列篩選運算式:
kind="NOTE_KIND" AND resourceUrl="RESOURCE_URL"
其中:
- NOTE_KIND 是附註的種類。
- 舉例來說,使用
DISCOVERY種類列出探索事件。 映像檔首次推送到 Artifact Registry 時,系統會為映像檔建立探索事件。 - 如要列出安全漏洞例項,請使用
VULNERABILITY種類。
- 舉例來說,使用
-
RESOURCE_URL 是圖片的完整網址
https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
針對多個映像檔擷取特定種類例項的篩選器,運算式如下:
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
其中:
- RESOURCE_URL_PREFIX 是部分圖片的網址前置字元
- 如要列出所有圖片版本,請執行
https://HOSTNAME/PROJECT_ID/IMAGE_ID@。 - 如要列出專案中的所有圖片,請執行
https://HOSTNAME/PROJECT_ID/。
- 如要列出所有圖片版本,請執行
查看與特定記事相關聯的圖片
您可以擷取與特定註記 ID 相關聯的資源清單。例如,您可以使用特定 CVE 安全漏洞來列出映像檔。
如要列出專案中與特定註記相關聯的的所有映像檔,請使用下列篩選器運算式:
noteProjectId="PROVIDER_PROJECT_ID" AND noteId="NOTE_ID"
如要查看特定註記的特定映像檔,請使用下列篩選器運算式:
resourceUrl="RESOURCE_URL" AND noteProjectId="PROVIDER_PROJECT_ID" \ AND noteId="NOTE_ID"
其中:
- PROVIDER_PROJECT_ID 是供應商專案的 ID。舉例來說,
goog-vulnz提供預設的安全漏洞分析。 - NOTE_ID 是註記的 ID。安全性相關附註通常會採用
CVE-2019-12345格式。 -
RESOURCE_URL 是圖片的完整網址
https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
舉例來說,如要檢查 Google 分析結果中所有出現 CVE-2017-16231 的映像檔,請使用下列篩選運算式:
noteProjectId="goog-vulnz" AND noteId="CVE-2017-16231"
後續步驟
使用 Pub/Sub 通知,接收有關安全漏洞和其他中繼資料的通知。
您可以使用 Kritis Signer,在建構管道中建立二進位授權認證。這項工具可根據安全漏洞掃描結果建立二進位授權認證。詳情請參閱「使用 Kritis Signer 建立認證」。