為上傳至 Cloud Storage 的檔案部署自動惡意軟體掃描功能

Last reviewed 2024-12-02 UTC

本文說明如何部署「自動掃描上傳至 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

事前準備

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    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.

  9. 在本部署作業中,您將透過 Cloud Shell 執行所有指令。

    部署架構

    您可以透過下列任一方法,部署本文所述的架構:

    • 使用 Cloud Shell:如果您想瞭解如何使用 Google Cloud CLI 指令列工具部署及設定解決方案的每個元件,請使用這個方法。

      如要使用這種部署方法,請按照「使用 Cloud Shell 部署」一文中的操作說明進行。

    • 使用 Terraform CLI:如果您希望盡量減少手動步驟來部署解決方案,請使用這個方法。這個方法會使用 Terraform 部署及設定個別元件。

      如要使用這個部署方法,請按照「使用 Terraform CLI 部署」一文中的操作說明進行。

    使用 Cloud Shell 部署

    如要手動部署本文所述架構,請完成下列小節的步驟。

    準備環境

    在本節中,您將指派在整個部署作業中使用的各種值,例如地區和區域。在本部署作業中,您會使用 us-central1 做為 Cloud Run 服務的區域,並使用 us 做為 Eventarc 觸發程序和 Cloud Storage 值區的位置。

    1. 在 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。

    2. 使用專案 ID 初始化 gcloud 環境:

      gcloud config set project "${PROJECT_ID}"
      
    3. 建立三個 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:存放待掃描的檔案。使用者會將檔案上傳至這個值區。

      • quarantined-PROJECT_ID:存放惡意軟體掃描服務掃描後,判定含有惡意軟體的檔案。

      • clean-PROJECT_ID:存放惡意軟體掃描服務掃描後判定為未受感染的檔案。

    4. 建立第四個 Cloud Storage 值區:

      gcloud storage buckets create "gs://cvd-mirror-${PROJECT_ID}" --location="${LOCATION}"
      

      ${PROJECT_ID} 可確保 bucket 名稱不重複。

      這個值區 cvd-mirror-PROJECT_ID 用於維護惡意軟體定義資料庫的本機鏡像,可避免 ClamAV CDN 觸發速率限制。

    為惡意軟體掃描器服務設定服務帳戶

    在本節中,您將建立服務帳戶,供惡意軟體掃描器服務使用。接著,將適當的角色授予服務帳戶,讓服務帳戶有權讀取及寫入 Cloud Storage 值區。這些角色可確保帳戶具備最低權限,且只能存取所需的資源。

    1. 建立 malware-scanner 服務帳戶:

      gcloud iam service-accounts create ${SERVICE_NAME}
      
    2. 將 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
      
    3. 授予「指標寫入者」角色,允許服務將指標寫入 Monitoring:

      gcloud projects add-iam-policy-binding \
            "${PROJECT_ID}" \
            --member="serviceAccount:${SERVICE_ACCOUNT}" \
            --role=roles/monitoring.metricWriter
      

    在 Cloud Run 中建立惡意軟體掃描器服務

    在本節中,您會將惡意軟體掃描器服務部署至 Cloud Run。 這項服務會在 Docker 容器中執行,其中包含下列項目:

    • Dockerfile,以建構含有服務、Node.js 執行階段、Google Cloud SDK 和 ClamAV 二進位檔的容器映像檔。
    • 惡意軟體掃描器 Cloud Run 服務的 TypeScript 檔案
    • config.json 設定檔,用於指定 Cloud Storage bucket 名稱。
    • updateCvdMirror.sh 殼層指令碼,用於重新整理 Cloud Storage 中的 ClamAV 惡意軟體定義資料庫鏡像。
    • 在執行個體啟動時執行必要服務的 bootstrap.sh 殼層指令碼。

    如要部署服務,請按照下列步驟操作:

    1. 在 Cloud Shell 中,複製包含程式碼檔案的 GitHub 存放區:

      git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
      
    2. 切換至 cloudrun-malware-scanner 目錄:

      cd docker-clamav-malware-scanner/cloudrun-malware-scanner
      
    3. 根據 GitHub 存放區中的 config.json.tmpl 範本檔案,建立 config.json 設定檔:

      sed "s/-bucket-name/-${PROJECT_ID}/" config.json.tmpl > config.json
      

      上述指令會使用搜尋和取代作業,根據專案 ID 為 Cloud Storage 值區提供不重複的名稱。

    4. 選用:查看更新後的設定檔:

      cat config.json
      
    5. 在 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 檔案 (內含設定和狀態資訊)。

    6. 使用您稍早建立的服務帳戶,建立及部署 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 參數可防止服務過度擴充。
    7. 系統顯示提示訊息時,請輸入 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
      
    8. 將部署指令輸出中的 Service URL 值儲存在殼層變數中。您稍後建立 Cloud Scheduler 工作時會用到這個值。

      SERVICE_URL="SERVICE_URL"
      
    9. (選用) 如要檢查執行中的服務和 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
      

    Cloud Run 服務要求所有叫用作業都必須經過驗證,且驗證身分必須具備服務的 run.routes.invoke 權限。您會在下一節中新增權限。

    建立 Eventarc Cloud Storage 觸發條件

    在本節中,您會新增權限,允許 Eventarc 擷取 Cloud Storage 事件,並建立觸發條件,將這些事件傳送至 Cloud Run malware-scanner 服務。

    1. 如果您使用 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 服務

    2. 在 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"
      
    3. 允許 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"
      
    4. 建立 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.
      
    5. 將 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 工作,觸發 ClamAV 資料庫鏡像更新

    • 建立 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 Storage 中的 ClamAV 鏡像。每個 Cloud Run 執行個體中的 ClamAV freshclam 精靈,每 30 分鐘會檢查一次鏡像是否有新定義,並更新 ClamAV 精靈。

    使用 Terraform CLI 部署

    本節說明如何使用 Terraform CLI 部署本文所述架構。

    複製 GitHub 存放區

    1. 在 Cloud Shell 中,複製包含程式碼和 Terraform 檔案的 GitHub 存放區:

      git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
      

    準備環境

    在本節中,您將指派在整個部署作業中使用的各種值,例如地區和區域。在本部署作業中,您會使用 us-central1 做為 Cloud Run 服務的區域,並使用 us 做為 Eventarc 觸發程序和 Cloud Storage 值區的位置。

    1. 在 Cloud Shell 中設定常見的殼層變數,包括區域和位置:

      REGION=us-central1
      LOCATION=us
      PROJECT_ID=PROJECT_ID
      

      PROJECT_ID 替換為您的專案 ID。

    2. 使用專案 ID 初始化 gcloud CLI 環境:

      gcloud config set project "${PROJECT_ID}"
      
    3. 根據 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 值區提供不重複的名稱。

    4. 選用:查看更新後的設定檔:

      cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
      
    5. 設定 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
      

    部署基礎架構

    1. 在 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 惡意軟體定義資料庫的鏡像

    為服務建構容器

    1. 在 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" \
        .
      

      請稍候幾分鐘,等待建構作業完成。

    部署服務和觸發條件

    1. 在 Cloud Shell 中執行下列指令,部署 Cloud Run 服務:

      cd ../terraform/service/
      terraform init
      terraform apply
      

      在系統提示時回覆 yes

      服務部署及啟動可能需要幾分鐘的時間。

      這個 Terraform 指令碼會執行下列工作:

      • 使用您剛建構的容器映像檔,部署 Cloud Run 服務。
      • unscanned Cloud 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..
      
    2. (選用) 如要檢查執行中的服務和使用的 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
      

    上傳檔案來測試管道

    如要測試管道,請上傳一個乾淨 (不含惡意軟體) 的檔案,以及一個模擬受感染檔案的測試檔案:

    1. 建立範例文字檔或使用現有乾淨的檔案,測試管道程序。

    2. 在 Cloud Shell 中,將範例資料檔案複製到未掃描的值區:

      gcloud storage cp FILENAME "gs://unscanned-${PROJECT_ID}"
      

      FILENAME 替換為乾淨文字檔的名稱。惡意軟體掃描器服務會檢查每個檔案,並將檔案移至適當的 bucket。這個檔案會移至乾淨值區。

    3. 讓管道處理檔案幾秒鐘,然後檢查乾淨的 bucket,看看處理後的檔案是否在其中:

      gcloud storage ls "gs://clean-${PROJECT_ID}" --recursive
      

      您可以檢查檔案是否已從未掃描的 bucket 中移除:

      gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
      
    4. 上傳名為 eicar-infected.txt 的檔案,其中包含 EICAR 標準防範惡意軟體測試簽章,至未掃描的值區:

      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"
      

      這個文字字串的簽章會觸發惡意軟體掃描器,以供測試。這個測試檔案是廣泛使用的測試,並非實際的惡意軟體,對工作站無害。如果嘗試在安裝惡意軟體掃描器的電腦上建立含有這個字串的檔案,就會觸發警示。

    5. 等待幾秒鐘,然後檢查隔離值區,確認檔案是否已順利通過管道:

      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}"
      

      這項指令的結果只會顯示在詳細記錄中。

    監控服務

    您可以使用 Cloud Logging 和 Cloud Monitoring 監控服務。

    查看詳細記錄

    1. 前往 Google Cloud 控制台的 Cloud Logging 記錄檔探索工具頁面。

      前往記錄檔探索工具

    2. 如果沒有顯示「記錄檔欄位」篩選器,請按一下「記錄檔欄位」

    3. 在「記錄欄位」篩選器中,按一下「Cloud Run 修訂版本」

    4. 在「Log Fields」(記錄欄位) 篩選器的「Service Name」(服務名稱) 部分,按一下「malware-scanner」

    記錄查詢結果會顯示服務中的記錄,包括顯示您上傳的兩個檔案掃描要求和狀態的多行內容:

    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)
    

    查看指標

    這項服務會產生下列指標,用於監控和快訊:

    • 處理的乾淨檔案數量:
      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

    您可以在 Cloud Monitoring Metrics Explorer 中查看這些指標:

    1. 前往 Google Cloud 控制台的 Cloud Monitoring Metrics Explorer 頁面。

      前往「Metrics Explorer」

    2. 按一下「選取指標」欄位,然後輸入篩選器字串 malware

    3. 展開「Generic Task」資源。

    4. 展開「Googlecloudplatform」Googlecloudplatform類別。

    5. 選取 googlecloudplatform/gcs-malware-scanning/clean-files 指標。圖表會顯示資料點,指出掃描乾淨檔案的時間。

    您可以運用指標監控管道,並在偵測到惡意軟體或檔案處理失敗時建立快訊。

    產生的指標具有下列標籤,可用於篩選和匯總,以便透過 Metrics Explorer 查看更精細的詳細資料:

    • source_bucket
    • destination_bucket
    • clam_version
    • cloud_run_revision

    ignored_files 指標中,下列 reason 標籤會定義檔案遭到忽略的原因:

    • ZERO_LENGTH_FILE:如果設定了 ignoreZeroLengthFiles 設定值,但檔案為空白。
    • FILE_TOO_LARGE:檔案超過掃描大小上限 500 MiB。
    • REGEXP_MATCH:當檔案名稱符合 fileExclusionPatterns 中定義的其中一個模式時。
    • FILE_SIZE_MISMATCH:如果檔案大小在檢查期間發生變化。

    進階設定

    下列各節說明如何使用更進階的參數設定掃描器。

    處理多個值區

    惡意軟體掃描器服務可以掃描多個來源 bucket 中的檔案,並將檔案傳送至不同的乾淨和隔離 bucket。雖然這項進階設定不在本次部署作業的範圍內,但以下是必要步驟的摘要:

    1. 建立名稱不重複的未掃描、乾淨和隔離 Cloud Storage bucket。

    2. 在每個 bucket 中,將適當的角色指派給 malware-scanner 服務帳戶。

    3. 編輯 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"
      }
      
    4. 為每個未掃描的值區建立 Eventarc 觸發條件。請務必為每個值區建立不重複的觸發條件名稱。

      Cloud Storage 值區必須與 Eventarc 觸發程序位於相同專案和區域。

    如果您使用 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 專案。

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    後續步驟