本文說明如何啟用 Container Scanning API、將映像檔推送至 Artifact Registry,以及查看映像檔中發現的安全漏洞清單。
Artifact Analysis 會將安全漏洞資訊儲存為附註。每當某個映像檔有相關聯的註記時,系統便會建立相對應的例項。詳情請參閱總覽和定價文件。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
-
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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry and Container Scanning APIs.
-
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 存放區,並將含有 Go 程式碼的容器映像檔推送至該存放區。如果您不熟悉 Artifact Registry,請參閱 Docker 快速入門導覽課程。
如要瞭解如何使用 Cloud Build 建構 Go 應用程式並將其容器化,請參閱「 建構 Go 應用程式」。
取得存放區清單。
在存放區清單中,按一下存放區。
在圖片清單中,按一下圖片名稱。
每個映像檔摘要的安全漏洞總數會顯示在「Vulnerabilities」(安全漏洞) 資料欄中。
如要查看映像檔的安全漏洞清單,請按一下「Vulnerabilities」(安全漏洞) 資料欄中的連結。
「掃描結果」部分會顯示掃描的套件類型摘要、安全漏洞總數、有修正的安全漏洞、沒有修正的安全漏洞,以及有效嚴重程度。
安全漏洞表格會列出每個安全漏洞的「常見安全漏洞與資料外洩風險 (CVE)」名稱、實際嚴重程度、「常見安全漏洞評分系統 (CVSS)」分數、修正 (如有)、內含安全漏洞的套件名稱,以及套件類型。
您可以篩選及排序這些檔案,依檔案副檔名檢查特定檔案、目錄或檔案類型。
Google Cloud 控制台最多會在表格中顯示 1200 個安全漏洞。如果映像檔有超過 1200 個安全漏洞,您必須使用 gcloud 或 API 查看完整清單。
如要查看特定 CVE 的詳細資料,請按一下 CVE 名稱。
如要查看安全漏洞發生詳細資料,例如版本號碼和受影響的位置,請在安全漏洞名稱的資料列中,按一下「查看」或「查看已修正」。如果安全漏洞尚未修正,連結文字會顯示「查看」;如果安全漏洞已修正,連結文字則會顯示「查看已修正」。
- 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
- LOCATION 是存放區的區域或多區域位置。
- PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
- REPOSITORY 是儲存映像檔的存放區名稱。
- IMAGE_ID 是存放區中的映像檔名稱。
- TAG 是您要取得相關資訊的映像檔標記。
HASH 是映像檔摘要。
Artifact Analysis 會傳回結果,包括
packageType
。- LOCATION 是存放區的區域或多區域位置。
- PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
- REPOSITORY 是儲存映像檔的存放區名稱。
- IMAGE_ID 是存放區中的映像檔名稱。
- FILTER_EXPRESSION 是採用篩選安全漏洞例項一文所述格式的篩選器運算式範例。
DEPLOYMENT
是例項的種類。- RESOURCE_URL 是圖片的完整網址,格式為
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
。 - RESOURCE_URL_PREFIX:指定資源網址中的子字串。
- 如要篩選圖片的所有版本,請省略圖片摘要。請使用下列格式:
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
- 如要篩選專案中的所有映像檔,請只指定資源位置和專案。請使用下列格式:
https://LOCATION-docker.pkg.dev/PROJECT_ID/
- 如要篩選圖片的所有版本,請省略圖片摘要。請使用下列格式:
- ENCODED_RESOURCE_URL 是圖片的編碼路徑。如要瞭解編碼,請參閱網址編碼。
VULNERABILITY
是例項的種類。- PACKAGE_TYPE 是應用程式語言套件類型。
可用的類型包括:
COMPOSER
、GO
、MAVEN
、NPM
、NUGET
、PYTHON
、RUBYGEMS
和RUST
。 - LOCATION 是存放區的區域或多區域位置。
- PROJECT_ID 是您的 Google Cloud 控制台專案 ID。
- REPOSITORY 是儲存映像檔的存放區名稱。
- IMAGE_ID 是存放區中的映像檔名稱。 您無法使用此指令指定圖片標記。
- RESOURCE_URL 是圖片的完整網址,格式為
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
。 goog-vulnz
是 Artifact Analysis 漏洞分析的PROVIDER_PROJECT_ID
。如果您在自訂專案中使用構件分析,可以將這個值替換為自己的供應商專案 ID。- NOTE_ID 是註記的 ID。安全性相關註記的格式通常為
CVE-2019-12345
。 使用 Pub/Sub 通知,接收安全漏洞和其他中繼資料的通知。
整合構件分析與二進位授權,建立驗證,避免在部署環境中執行具有已知安全問題的容器映像檔。
查看映像檔安全漏洞
將新的映像檔上傳至 Artifact Registry 時,Artifact Analysis 會掃描這些映像檔。這項掃描會擷取容器中套件的相關資訊。
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Container Analysis API,查看 Artifact Registry 中映像檔的安全漏洞例項。如果映像檔有安全漏洞,您就能取得詳細資料。
Artifact Analysis 只會更新過去 30 天內推送或提取的映像檔中繼資料。30 天後,中繼資料將不再更新,結果也會過時。此外,Artifact Analysis 會封存過時逾 90 天的中繼資料,且這些中繼資料不會顯示在 Google Cloud 控制台、gcloud 或 API 中。如要重新掃描中繼資料已過時或已封存的映像檔,請提取該映像檔。 重新整理中繼資料最多可能需要 24 小時才能完成。
在 Google Cloud 控制台中查看發生次數
如要查看映像檔中的安全漏洞:
使用 gcloud 查看發生次數
如要查看 Artifact Registry 中映像檔的發生事項,請執行下列指令:
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
其中:
如何查看映像檔標記或分層的安全漏洞:
gcloud artifacts docker images describe \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID:TAG \
--show-package-vulnerability
或
gcloud artifacts docker images describe \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH \
--show-package-vulnerability
其中:
如何篩選安全漏洞的例項:
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
--occurrence-filter=FILTER_EXPRESSION
其中:
使用 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="DEPLOYMENT"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
其中:
API
在 API 查詢中,使用下列篩選運算式:
kind="DEPLOYMENT" AND resourceUrl="RESOURCE_URL"
其中:
您可以使用 hasPrefix
函式,以更廣泛的範圍進行篩選。
舉例來說,下列篩選器可針對多個圖片擷取特定種類的例項:
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
其中:
查看安全漏洞例項
如要擷取映像檔的安全漏洞例項清單,可以依 VULNERABILITY
例項類型篩選。
gcloud
在 gcloud CLI 中執行下列指令:
gcloud artifacts docker images list \
--show-occurrences \
--occurrence-filter='kind="VULNERABILITY"' \
--format=json \
LOCATION-docker.pkg.dev/PROJECT_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
其中:
如要進一步瞭解如何使用 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
其中:
查看與特定記事相關聯的圖片
您可以擷取與特定註記 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
其中:
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
其中:
如要查看特定註記的特定映像檔,請使用下列篩選器運算式:
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
地點
API
在 API 查詢中,加入下列篩選運算式:
resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \ AND noteId="NOTE_ID"
其中: