本文說明如何部署「自動掃描上傳至 Cloud Storage 的檔案是否含有惡意軟體」架構。
本部署指南假設您熟悉下列技術的基本功能:
架構
下圖顯示您將在本文件中建立的部署架構:
下圖顯示由這個架構管理的下列兩個管道:
- 檔案掃描管道,可檢查上傳的檔案是否含有惡意軟體。
- ClamAV 惡意軟體資料庫鏡像更新管道,可維護 ClamAV 所用惡意軟體資料庫的最新鏡像。
如要進一步瞭解架構,請參閱「自動掃描上傳至 Cloud Storage 的檔案是否含有惡意軟體」。
目標
在 Cloud Storage bucket 中建立 ClamAV 惡意軟體定義資料庫的鏡像。
使用下列函式建構 Cloud Run 服務:
- 使用 ClamAV 掃描 Cloud Storage bucket 中的檔案是否含有惡意軟體,並根據掃描結果將檔案移至乾淨或隔離的 bucket。
- 在 Cloud Storage 中維護 ClamAV 惡意軟體定義資料庫的鏡像。
建立 Eventarc 觸發條件,在檔案上傳至 Cloud Storage 時觸發惡意軟體掃描服務。
建立 Cloud Scheduler 工作,觸發惡意軟體掃描服務,以重新整理 Cloud Storage 中惡意軟體定義資料庫的鏡像。
費用
本架構使用下列 Google Cloud計費元件:
您可以使用 Pricing Calculator 根據預測用量估算費用。
事前準備
- 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.
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, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
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, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
在本部署作業中,您將透過 Cloud Shell 執行所有指令。
使用 Cloud Shell:如果您想瞭解如何使用
Google Cloud CLI指令列工具部署及設定解決方案的每個元件,請使用這個方法。如要使用這種部署方法,請按照「使用 Cloud Shell 部署」一文中的操作說明進行。
使用 Terraform CLI:如果您想盡量減少手動步驟來部署解決方案,請使用這個方法。這個方法會使用 Terraform 部署及設定個別元件。
如要使用這個部署方法,請按照「使用 Terraform CLI 部署」一文中的操作說明進行。
在 Cloud Shell 中設定常見的殼層變數,包括區域和位置:
REGION=us-central1 LOCATION=us PROJECT_ID=PROJECT_ID SERVICE_NAME="malware-scanner" SERVICE_ACCOUNT="${SERVICE_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"將
PROJECT_ID替換為專案 ID。使用專案 ID 初始化
gcloud環境:gcloud config set project "${PROJECT_ID}"建立三個 Cloud Storage bucket,並給予不重複的名稱:
gcloud storage buckets create "gs://unscanned-${PROJECT_ID}" --location="${LOCATION}" gcloud storage buckets create "gs://quarantined-${PROJECT_ID}" --location="${LOCATION}" gcloud storage buckets create "gs://clean-${PROJECT_ID}" --location="${LOCATION}"${PROJECT_ID}可確保 bucket 名稱不重複。這三個值區會在檔案掃描管道的不同階段,保存上傳的檔案:
unscanned-PROJECT_ID:存放待掃描的檔案。使用者將檔案上傳至這個 bucket。quarantined-PROJECT_ID:存放惡意軟體掃描服務掃描後判定含有惡意軟體的檔案。clean-PROJECT_ID:存放惡意軟體掃描服務掃描後,判定為未受感染的檔案。
建立第四個 Cloud Storage bucket:
gcloud storage buckets create "gs://cvd-mirror-${PROJECT_ID}" --location="${LOCATION}"${PROJECT_ID}可確保 bucket 名稱不重複。這個值區
cvd-mirror-PROJECT_ID用於維護惡意軟體定義資料庫的本機鏡像,可避免 ClamAV CDN 觸發速率限制。建立
malware-scanner服務帳戶:gcloud iam service-accounts create ${SERVICE_NAME}授予值區「物件管理員」角色。這個角色可讓服務從未掃描的 bucket 讀取及刪除檔案,並將檔案寫入隔離和乾淨的 bucket。
gcloud storage buckets add-iam-policy-binding "gs://unscanned-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin gcloud storage buckets add-iam-policy-binding "gs://clean-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin gcloud storage buckets add-iam-policy-binding "gs://quarantined-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin gcloud storage buckets add-iam-policy-binding "gs://cvd-mirror-${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" --role=roles/storage.objectAdmin授予「指標寫入者」角色,允許服務將指標寫入 Monitoring:
gcloud projects add-iam-policy-binding \ "${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role=roles/monitoring.metricWriterDockerfile使用服務、Node.js 執行階段、Google Cloud SDK 和 ClamAV 二進位檔建構容器映像檔。- 惡意軟體掃描器 Cloud Run 服務的 TypeScript 檔案。
config.json設定檔,用於指定 Cloud Storage bucket 名稱。updateCvdMirror.sh殼層指令碼,用於更新 Cloud Storage 中的 ClamAV 惡意軟體定義資料庫鏡像。- 在執行個體啟動時執行必要服務的
bootstrap.sh殼層指令碼。 在 Cloud Shell 中,複製包含程式碼檔案的 GitHub 存放區:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git切換至
cloudrun-malware-scanner目錄:cd docker-clamav-malware-scanner/cloudrun-malware-scanner根據 GitHub 存放區中的
config.json.tmpl範本檔案,建立config.json設定檔:sed "s/-bucket-name/-${PROJECT_ID}/" config.json.tmpl > config.json上述指令會使用搜尋和取代作業,根據專案 ID 為 Cloud Storage bucket 提供不重複的名稱。
選用:查看更新後的設定檔:
cat config.json在 Cloud Storage 中,對 ClamAV 惡意軟體資料庫鏡像執行初始填入作業:
python3 -m venv pyenv . pyenv/bin/activate pip3 install crcmod cvdupdate ./updateCvdMirror.sh "cvd-mirror-${PROJECT_ID}" deactivate這些指令會在本機安裝
CVDUpdate工具,然後執行updateCvdMirror.sh指令碼,該指令碼會使用CVDUpdate將 ClamAV 惡意軟體資料庫複製到您先前建立的cvd-mirror-PROJECT_ID值區。您可以檢查鏡像 bucket 的內容:
gcloud storage ls "gs://cvd-mirror-${PROJECT_ID}/cvds"這個值區應包含多個 CVD 檔案 (內含完整的惡意軟體資料庫)、多個
.cdiff檔案 (內含每日差異更新),以及兩個 JSON 檔案 (內含設定和狀態資訊)。使用您稍早建立的服務帳戶,建立及部署 Cloud Run 服務:
gcloud beta run deploy "${SERVICE_NAME}" \ --source . \ --region "${REGION}" \ --no-allow-unauthenticated \ --memory 4Gi \ --cpu 1 \ --concurrency 20 \ --min-instances 1 \ --max-instances 5 \ --no-cpu-throttling \ --cpu-boost \ --timeout 300s \ --service-account="${SERVICE_ACCOUNT}"這個指令會建立具有 1 個 vCPU 且使用 4 GiB RAM 的 Cloud Run 執行個體。這個大小適合這項部署作業。不過,在實際運作環境中,您可能需要為執行個體選擇較大的 CPU 和記憶體大小,以及較大的
--max-instances參數。您可能需要的資源大小取決於服務需要處理的流量。這項指令包含下列規格:
--concurrency參數指定每個執行個體可處理的並行要求數量。--no-cpu-throttling參數可讓執行個體在背景執行作業,例如更新惡意軟體定義。--cpu-boost參數會將執行個體啟動時的 vCPU 數量加倍,以縮短啟動延遲時間。- 由於每個執行個體的啟動時間相對較長,
--min-instances 1參數會維持至少一個執行個體處於運作狀態。 --max-instances 5參數可防止服務擴充過度。
系統提示時,請輸入
Y建構及部署服務。建構及部署作業大約需要 10 分鐘。完成後,系統會顯示以下訊息:Service [malware-scanner] revision [malware-scanner-UNIQUE_ID] has been deployed and is serving 100 percent of traffic. Service URL: https://malware-scanner-UNIQUE_ID.a.run.app將部署指令輸出中的
Service URL值儲存在殼層變數中。您稍後建立 Cloud Scheduler 工作時會用到這個值。SERVICE_URL="SERVICE_URL"(選用) 如要檢查執行中的服務和 ClamAV 版本,請執行下列指令:
curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ ${SERVICE_URL}輸出內容如下列範例所示。當中會顯示惡意軟體掃描器服務版本、ClamAV 版本,以及惡意軟體定義版本和上次更新日期。
gcs-malware-scanner version 3.2.0 Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec 6 09:40:14 2024如果您使用 2021 年 4 月 8 日前建立的現有專案,請將
iam.serviceAccountTokenCreator角色新增至 Pub/Sub 服務帳戶:PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'只有舊版專案才需要新增這個角色,Pub/Sub 才能叫用 Cloud Run 服務。
在 Cloud Shell 中,將 Pub/Sub 發布者角色授予 Cloud Storage 服務帳戶:
STORAGE_SERVICE_ACCOUNT=$(gcloud storage service-agent --project="${PROJECT_ID}") gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member "serviceAccount:${STORAGE_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"允許
malware-scanner服務帳戶叫用 Cloud Run 服務,並做為 Eventarc 事件接收器:gcloud run services add-iam-policy-binding "${SERVICE_NAME}" \ --region="${REGION}" \ --member "serviceAccount:${SERVICE_ACCOUNT}" \ --role roles/run.invoker gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member "serviceAccount:${SERVICE_ACCOUNT}" \ --role "roles/eventarc.eventReceiver"建立 Eventarc 觸發條件,擷取未掃描 Cloud Storage bucket 中的最終物件事件,並傳送至 Cloud Run 服務。觸發條件會使用
malware-scanner服務帳戶進行驗證:BUCKET_NAME="unscanned-${PROJECT_ID}" gcloud eventarc triggers create "trigger-${BUCKET_NAME}-${SERVICE_NAME}" \ --destination-run-service="${SERVICE_NAME}" \ --destination-run-region="${REGION}" \ --location="${LOCATION}" \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=${BUCKET_NAME}" \ --service-account="${SERVICE_ACCOUNT}"如果收到下列任一錯誤,請稍候一分鐘,然後再次執行指令:
ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.ERROR: (gcloud.eventarc.triggers.create) FAILED_PRECONDITION: Invalid resource state for "": Permission denied while using the Eventarc Service Agent. If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Otherwise, verify that it has Eventarc Service Agent role.在 Eventarc 觸發條件使用的基礎 Pub/Sub 訂閱項目中,將訊息確認期限變更為五分鐘。對於大型檔案或高負載,10 秒的預設值太短。
SUBSCRIPTION_NAME=$(gcloud eventarc triggers describe \ "trigger-${BUCKET_NAME}-${SERVICE_NAME}" \ --location="${LOCATION}" \ --format="get(transport.pubsub.subscription)") gcloud pubsub subscriptions update "${SUBSCRIPTION_NAME}" --ack-deadline=300觸發條件會立即建立,但最多可能需要兩分鐘才能正常運作。
建立 Cloud Scheduler 工作,在 Cloud Run 服務上執行 HTTP
POST要求,並使用指令更新惡意軟體定義資料庫的鏡像。為避免過多用戶端使用同一時段,ClamAV 要求您在 3 到 57 分之間的隨機分鐘數排定工作,並避開 10 的倍數。while : ; do # set MINUTE to a random number between 3 and 57 MINUTE="$((RANDOM%55 + 3))" # exit loop if MINUTE isn't a multiple of 10 [[ $((MINUTE % 10)) != 0 ]] && break done gcloud scheduler jobs create http \ "${SERVICE_NAME}-mirror-update" \ --location="${REGION}" \ --schedule="${MINUTE} */2 * * *" \ --oidc-service-account-email="${SERVICE_ACCOUNT}" \ --uri="${SERVICE_URL}" \ --http-method=post \ --message-body='{"kind":"schedule#cvd_update"}' \ --headers="Content-Type=application/json"--schedule指令列引數會使用 unix-cron 字串格式,定義工作執行的時間。這個值表示工作應每兩小時執行一次,且執行時間為隨機產生的特定分鐘。在 Cloud Shell 中,複製包含程式碼和 Terraform 檔案的 GitHub 存放區:
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git在 Cloud Shell 中設定常見的殼層變數,包括區域和位置:
REGION=us-central1 LOCATION=us PROJECT_ID=PROJECT_ID將
PROJECT_ID替換為專案 ID。使用專案 ID 初始化
gcloud CLI環境:gcloud config set project "${PROJECT_ID}"根據 GitHub 存放區中的
config.json.tmpl範本檔案,建立config.json設定檔:sed "s/-bucket-name/-${PROJECT_ID}/" \ docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json.tmpl \ > docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json上述指令會使用搜尋和取代作業,根據專案 ID 為 Cloud Storage bucket 提供不重複的名稱。
選用:查看更新後的設定檔:
cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json設定 Terraform 變數。
config.json設定檔的內容會透過TF_VAR_config_json變數傳遞至 Terraform,讓 Terraform 知道要建立哪些 Cloud Storage 值區。這個變數的值也會傳遞至 Cloud Run,用於設定服務。TF_VAR_project_id=$PROJECT_ID TF_VAR_region=us-central1 TF_VAR_bucket_location=us TF_VAR_config_json="$(cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json)" TF_VAR_create_buckets=true export TF_VAR_project_id TF_VAR_region TF_VAR_bucket_location TF_VAR_config_json TF_VAR_create_buckets在 Cloud Shell 中執行下列指令,部署基礎架構:
gcloud services enable \ cloudresourcemanager.googleapis.com \ serviceusage.googleapis.com cd docker-clamav-malware-scanner/terraform/infra terraform init terraform apply在系統提示時回覆
yes。這段 Terraform 指令碼會執行下列工作:
- 建立服務帳戶
- 建立 Artifact Registry
- 建立 Cloud Storage bucket
- 設定適當的角色和權限
- 對 Cloud Storage bucket 執行初始填入作業,其中包含 ClamAV 惡意軟體定義資料庫的鏡像
在 Cloud Shell 中執行下列指令,啟動 Cloud Build 工作,為服務建立容器映像檔:
cd ../../cloudrun-malware-scanner gcloud builds submit \ --region="$TF_VAR_region" \ --config=cloudbuild.yaml \ --service-account="projects/$PROJECT_ID/serviceAccounts/malware-scanner-build@$PROJECT_ID.iam.gserviceaccount.com" \ .請稍候幾分鐘,等待建構作業完成。
在 Cloud Shell 中執行下列指令,部署 Cloud Run 服務:
cd ../terraform/service/ terraform init terraform apply在系統提示時回覆
yes。服務部署及啟動可能需要幾分鐘的時間。
這個 Terraform 指令碼會執行下列工作:
- 使用您剛建構的容器映像檔,部署 Cloud Run 服務。
- 在
unscannedCloud Storage bucket 上設定 Eventarc 觸發條件。觸發條件會立即建立,但最多可能需要兩分鐘才能正常運作。 - 建立 Cloud Scheduler 工作,以更新至 ClamAV 惡意軟體定義鏡像。
如果部署作業失敗並出現下列任一錯誤,請等待一分鐘,然後再次執行
terraform apply指令,重試建立 Eventarc 觸發程序。Error: Error creating Trigger: googleapi: Error 400: Invalid resource state for "": The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.Error: Error creating Trigger: googleapi: Error 400: Invalid resource state for "": Permission denied while using the Eventarc Service Agent. If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Otherwise, verify that it has Eventarc Service Agent role..(選用) 如要檢查執行中的服務和使用的 ClamAV 版本,請執行下列指令:
MALWARE_SCANNER_URL="$(terraform output -raw cloud_run_uri)" curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ "${MALWARE_SCANNER_URL}"輸出內容如下列範例所示。當中會顯示惡意軟體掃描器服務版本、ClamAV 版本,以及惡意軟體定義版本和上次更新日期。
gcs-malware-scanner version 3.2.0 Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec 6 09:40:14 2024建立範例文字檔或使用現有的乾淨檔案,測試管道程序。
在 Cloud Shell 中,將範例資料檔案複製到未掃描的值區:
gcloud storage cp FILENAME "gs://unscanned-${PROJECT_ID}"將
FILENAME替換為乾淨文字檔的名稱。惡意軟體掃描器服務會檢查每個檔案,並將檔案移至適當的 bucket。這個檔案會移至乾淨值區。讓管道處理檔案幾秒鐘,然後檢查乾淨的 bucket,看看處理後的檔案是否在其中:
gcloud storage ls "gs://clean-${PROJECT_ID}" --recursive您可以檢查檔案是否已從未掃描的 bucket 中移除:
gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive上傳名為
eicar-infected.txt的檔案,其中包含 EICAR 標準防惡意軟體測試簽章,至未掃描的 bucket:echo -e 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \ | gcloud storage cp - "gs://unscanned-${PROJECT_ID}/eicar-infected.txt"這個文字字串的簽章會觸發惡意軟體掃描器,以供測試。這個測試檔案是廣泛使用的測試,並非實際的惡意軟體,對工作站無害。如果嘗試在安裝惡意軟體掃描器的電腦上建立含有這個字串的檔案,就會觸發警示。
等待幾秒鐘,然後檢查隔離值區,確認檔案是否已順利通過管道:
gcloud storage ls "gs://quarantined-${PROJECT_ID}" --recursive偵測到遭惡意軟體感染的檔案時,這項服務也會記錄 Logging 記錄項目。
您可以檢查檔案是否已從未掃描的 bucket 中移除:
gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive在 Cloud Shell 中,強制執行 Cloud Scheduler 工作,觸發更新檢查:
gcloud scheduler jobs run "${SERVICE_NAME}-mirror-update" --location="${REGION}"這項指令的結果只會顯示在詳細記錄中。
前往 Google Cloud 控制台的 Cloud Logging 記錄檔探索工具頁面。
如果沒有顯示「記錄檔欄位」篩選器,請按一下「記錄檔欄位」。
在「記錄欄位」篩選器中,按一下「Cloud Run 修訂版本」。
在「Log Fields」(記錄欄位) 篩選器的「Service Name」(服務名稱) 部分,按一下「malware-scanner」(惡意軟體掃描器)。
- 處理的乾淨檔案數量:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/clean-files - 處理的受感染檔案數量:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/infected-files - 忽略且未掃描的檔案數:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/ignored-files - 掃描檔案所花時間:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scan-duration - 掃描的位元組總數:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/bytes-scanned - 惡意軟體掃描失敗次數:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scans-failed - CVD Mirror 更新檢查次數:
workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/cvd-mirror-updates 前往 Google Cloud 控制台的 Cloud Monitoring Metrics Explorer 頁面。
點選「選取指標」欄位,然後輸入篩選字串
malware。展開「Generic Task」資源。
展開「Googlecloudplatform」Googlecloudplatform類別。
選取 googlecloudplatform/gcs-malware-scanning/clean-files 指標。圖表會顯示資料點,指出掃描乾淨檔案的時間。
source_bucketdestination_bucketclam_versioncloud_run_revisionZERO_LENGTH_FILE:如果設定了ignoreZeroLengthFiles設定值,但檔案為空白。FILE_TOO_LARGE:檔案超過掃描大小上限 500 MiB。REGEXP_MATCH:檔案名稱符合fileExclusionPatterns中定義的其中一個模式。FILE_SIZE_MISMATCH:如果檔案大小在檢查期間發生變化。建立未掃描、乾淨且隔離的 Cloud Storage bucket,並給予不重複的名稱。
在每個 bucket 中,將適當的角色指派給
malware-scanner服務帳戶。編輯
config.json設定檔,為每個設定指定 bucket 名稱:{ "buckets": [ { "unscanned": "unscanned-bucket-1-name", "clean": "clean-bucket-1-name", "quarantined": "quarantined-bucket-1-name" }, { "unscanned": "unscanned-bucket-2-name", "clean": "clean-bucket-2-name", "quarantined": "quarantined-bucket-2-name" } ], "ClamCvdMirrorBucket": "cvd-mirror-bucket-name" }為每個未掃描的 bucket 建立 Eventarc 觸發條件。請務必為每個 bucket 建立不重複的觸發條件名稱。
Cloud Storage bucket 必須與 Eventarc 觸發條件位於相同專案和區域。
- Cloud Run 服務要求逾時 時間為 5 分鐘
- Pub/Sub 訂閱項目訊息確認期限為 5 分鐘
- 掃描器程式碼的常數為 500 MiB。
MAX_FILE_SIZE - ClamAV 服務設定的
StreamMaxLength、MaxScanSize和MaxFileSize設定為 512 MB。這些設定由bootstrap.sh指令碼設定。 - In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- 請參閱 Cloud Storage 說明文件。
- 如要查看更多參考架構、圖表和最佳做法,請瀏覽 Cloud Architecture Center。
部署架構
您可以透過下列任一方法,部署本文所述的架構:
使用 Cloud Shell 部署
如要手動部署本文所述的架構,請完成下列小節的步驟。
準備環境
在本節中,您將指派在部署作業中使用的各種值,例如地區和區域。在本部署作業中,您會使用 us-central1 做為 Cloud Run 服務的區域,並使用 us 做為 Eventarc 觸發程序和 Cloud Storage bucket 的位置。
為惡意軟體掃描器服務設定服務帳戶
在本節中,您將建立服務帳戶,供惡意軟體掃描器服務使用。接著,將適當的角色授予服務帳戶,讓服務帳戶有權讀取及寫入 Cloud Storage bucket。這些角色可確保帳戶具備最低權限,且只會存取所需的資源。
在 Cloud Run 中建立惡意軟體掃描器服務
在本節中,您會將惡意軟體掃描器服務部署至 Cloud Run。 這項服務會在 Docker 容器中執行,其中包含下列項目:
如要部署服務,請按照下列步驟操作:
Cloud Run 服務要求所有叫用作業都必須經過驗證,且驗證身分必須具備服務的 run.routes.invoke 權限。您會在下一節中新增權限。
建立 Eventarc Cloud Storage 觸發條件
在本節中,您會新增權限,允許 Eventarc 擷取 Cloud Storage 事件,並建立觸發條件,將這些事件傳送至 Cloud Run malware-scanner 服務。
建立 Cloud Scheduler 工作,觸發 ClamAV 資料庫鏡像更新
這項工作只會更新 Cloud Storage 中的 ClamAV 鏡像。Cloud Run 檢查的每個執行個體中,ClamAV freshclam daemon 每 30 分鐘會檢查一次鏡像,確認是否有新定義,並更新 ClamAV daemon。
使用 Terraform CLI 部署
本節說明如何使用 Terraform CLI 部署本文所述架構。
複製 GitHub 存放區
準備環境
在本節中,您將指派在部署作業中使用的各種值,例如地區和區域。在本部署作業中,您會使用 us-central1 做為 Cloud Run 服務的區域,並使用 us 做為 Eventarc 觸發程序和 Cloud Storage bucket 的位置。
部署基礎架構
為服務建構容器
部署服務並觸發
上傳檔案來測試管道
如要測試管道,請上傳一個乾淨 (不含惡意軟體) 的檔案,以及一個模擬受感染檔案的測試檔案:
測試惡意軟體定義資料庫更新機制
監控服務
您可以使用 Cloud Logging 和 Cloud Monitoring 監控服務。
查看詳細記錄
記錄查詢結果會顯示服務中的記錄,包括您上傳的兩個檔案的掃描要求和狀態:
Scan request for gs://unscanned-PROJECT_ID/FILENAME, (##### bytes) scanning with clam ClamAV CLAMAV_VERSION_STRING
Scan status for gs://unscanned-PROJECT_ID/FILENAME: CLEAN (##### bytes in #### ms)
...
Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV CLAMAV_VERSION_STRING
Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)
輸出內容會顯示 ClamAV 版本和惡意軟體資料庫簽章修訂版本,以及受感染測試檔案的惡意軟體名稱。您可以根據這些記錄訊息設定快訊,在系統發現惡意軟體或掃描失敗時收到通知。
輸出內容也會顯示惡意軟體定義鏡像更新記錄:
Starting CVD Mirror update
CVD Mirror update check complete. output: ...
如果鏡像已更新,輸出內容會顯示額外幾行:
CVD Mirror updated: DATE_TIME - INFO: Downloaded daily.cvd. Version: VERSION_INFO
Freshclam 更新記錄每 30 分鐘會顯示一次:
DATE_TIME -> Received signal: wake up
DATE_TIME -> ClamAV update process started at DATE_TIME
DATE_TIME -> daily.cvd database is up-to-date (version: VERSION_INFO)
DATE_TIME -> main.cvd database is up-to-date (version: VERSION_INFO)
DATE_TIME -> bytecode.cvd database is up-to-date (version: VERSION_INFO)
如果資料庫已更新,freshclam 記錄行會類似於下列內容:
DATE_TIME -> daily.cld updated (version: VERSION_INFO)
查看指標
這項服務會產生下列指標,用於監控和傳送快訊:
您可以在 Cloud Monitoring Metrics Explorer 中查看這些指標:
您可以透過指標監控管道,並在偵測到惡意軟體或檔案處理失敗時建立快訊。
產生的指標具有下列標籤,可用於篩選和匯總,以便透過 Metrics Explorer 查看更精細的詳細資料:
在 ignored_files 指標中,下列 reason 標籤會定義檔案遭到忽略的原因:
進階設定
下列各節說明如何使用更進階的參數設定掃描器。
處理多個值區
惡意軟體掃描器服務可以掃描多個來源 bucket 中的檔案,並將檔案傳送至不同的乾淨和隔離 bucket。雖然這項進階設定不在本次部署作業的範圍內,但以下是必要步驟的摘要:
如果您使用 Terraform 部署作業,當您在 Terraform 設定變數 TF_VAR_config_json 中傳遞更新後的 config.json 設定檔時,系統會自動套用本節中的步驟。
忽略暫存檔
部分上傳服務 (例如 SFTP 至 Cloud Storage 閘道) 會在上傳過程中建立一或多個暫存檔案。上傳完成後,這些服務會將檔案重新命名為最終名稱。
掃描器通常會在寫入這些暫時性檔案後立即掃描並移動所有檔案,這可能會導致上傳器服務找不到暫時性檔案而失敗。
您可以在 config.json 設定檔的 fileExclusionPatterns 區段中,使用規則運算式指定要忽略的檔案名稱模式清單。與這些規則運算式相符的檔案會保留在 unscanned bucket 中。
觸發這項規則時,ignored-files 計數器會遞增,並記錄訊息,指出符合模式的檔案已遭忽略。
下列程式碼範例顯示 config.json 設定檔,其中 fileExclusionPatterns 清單設為忽略結尾為 .tmp 或包含 .partial_upload. 字串的檔案。
{
"buckets": [
{
"unscanned": "unscanned-bucket-name",
"clean": "clean-bucket-name",
"quarantined": "quarantined-bucket-name"
},
],
"ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
"fileExclusionPatterns": [
"\\.tmp$",
"\\.partial_upload\\."
]
}
在規則運算式中使用 \ 字元時請小心,因為這些字元必須在 JSON 檔案中以另一個 \ 逸出。舉例來說,如要在規則運算式中指定常值 .,符號必須逸出兩次,一次是規則運算式,另一次是 JSON 檔案中的文字,因此會變成 \\.,如上述程式碼範例的最後一行所示。
忽略長度為零的檔案
與暫時性檔案類似,部分上傳服務會在 Cloud Storage 中建立長度為零的檔案,然後稍後更新這個檔案,加入更多內容。
您也可以將 config.json 參數 ignoreZeroLengthFiles 設為 true,忽略這些檔案,例如:
{
"buckets": [
{
"unscanned": "unscanned-bucket-name",
"clean": "clean-bucket-name",
"quarantined": "quarantined-bucket-name"
},
],
"ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
"ignoreZeroLengthFiles": true
}
觸發這項規則時,系統會遞增 ignored-files 指標,並記錄訊息,指出系統已忽略長度為零的檔案。
掃描檔案大小上限
掃描檔案大小上限預設為 500 MiB。這是因為掃描這個大小的檔案大約需要 5 分鐘。
系統會忽略超過 500 MiB 的檔案,並將其留在 unscanned bucket 中。files-ignored 指標會遞增,並記錄訊息。
如要提高這項限制,請更新下列限制,以配合新的檔案大小上限和掃描時間值:
清除所用資源
下一節說明如何避免系統日後向您收取本次部署所用Google Cloud 專案的費用。
刪除 Google Cloud 專案
如要避免系統向您的 Google Cloud 帳戶收取本次部署所用資源的費用,請刪除 Google Cloud 專案。