為上傳至 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. 登入 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, Cloud Build, Resource Manager, Cloud Scheduler, Eventarc, Logging, Monitoring, Pub/Sub, Cloud Run, and Service Usage 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. 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

  6. Verify 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, 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

  8. 在 Google Cloud 控制台啟用 Cloud Shell。

    啟用 Cloud Shell

    Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。

  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 bucket 的位置。

  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 名稱不重複。

    這三個 bucket 會在檔案掃描管道的不同階段,保留上傳的檔案:

    • unscanned-PROJECT_ID:在掃描前保留檔案。使用者會將檔案上傳至這個 bucket。

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

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

  4. 建立第四個 Cloud Storage bucket:

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

    ${PROJECT_ID} 是用來確保 bucket 名稱不重複。

    這個 bucket cvd-mirror-PROJECT_ID 用於維護惡意軟體定義資料庫的本機鏡像,可防止 ClamAV CDN 觸發頻率限制。

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

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

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

    gcloud iam service-accounts create ${SERVICE_NAME}
    
  2. 將物件管理員角色授予 bucket。這項角色可讓服務讀取及刪除未掃描 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
    
  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 bucket 命名。

  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。

    您可以檢查鏡像 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}"
    

    這個指令會建立 Cloud Run 執行個體,該執行個體具有 1 個 vCPU,並使用 4 GiB 的 RAM。這個大小適用於這項部署作業。不過,在正式環境中,您可能需要為執行個體選擇較大的 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 daemon 每 30 分鐘會檢查一次鏡像,確認是否有新的定義,並更新 ClamAV daemon。

使用 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 bucket 的位置。

  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 bucket 命名。

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

    cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
    
  5. 設定 Terraform 變數。config.json 設定檔的內容會透過 TF_VAR_config_json 變數傳遞至 Terraform,讓 Terraform 知道要建立哪些 Cloud Storage bucket。這個變數的值也會傳遞至 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 中,將樣本資料檔案複製到未掃描的 bucket:

    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 標準反惡意軟體測試簽章的 eicar-infected.txt 檔案,上傳至未掃描的 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"
    

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

  5. 等待幾秒鐘,然後檢查隔離 bucket,確認檔案是否成功通過管道:

    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「Logs Explorer」頁面。

    前往 Logs Explorer

  2. 如果畫面上未顯示「Log fields」(記錄欄位) 篩選器,請按一下「Log Fields」(記錄欄位)。

  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. 針對每個未掃描的 bucket,建立 Eventarc 觸發條件。請務必為每個 bucket 建立不重複的觸發條件名稱。

    Cloud Storage bucket 必須與 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. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

後續步驟