Cloud Storage にアップロードされたファイルのマルウェア スキャンを自動化する

Last reviewed 2022-12-05 UTC

このチュートリアルでは、悪意のあるコードのファイルの評価を自動化するためのイベント ドリブン パイプラインを構築する方法について説明します。

Cloud Storage にアップロードされた多数のファイルを手動で評価することは、ほとんどのアプリにとって時間がかかりすぎます。

このパイプラインは、Google Cloud プロダクトと、ClamAV というオープンソースのウィルス対策エンジンを使用して構築されています。このチュートリアルでは、ClamAV は Cloud Run でホストされている Docker コンテナで実行されます。 パイプラインは、Cloud Logging にログエントリを書き込み、Cloud Monitoring に指標を記録します。

これらの Logging ログエントリを使用して、感染したファイルのログベースのアラートをトリガーできますが、このようなアラートの設定はこのチュートリアルの対象外です。

このチュートリアルでは、「マルウェア」という用語を、トロイの木馬、ウイルス、その他の悪意のあるコードを指す包括的な用語として使用します。

このチュートリアルでは、Cloud StorageCloud RunCloud SchedulerEventarcDockerNode.js の基本的な機能について理解していることを前提としています。

アーキテクチャ

次の図は、アーキテクチャの概要を示しています。

マルウェア スキャン パイプラインのアーキテクチャ。

このアーキテクチャによって管理されるパイプラインは 2 つあります。

  • ファイル スキャン パイプライン。アップロードされたファイルにマルウェアが含まれているかどうかを確認します。
  • ClamAV マルウェア ミラー更新パイプライン。ClamAV が使用するマルウェア データベースの最新のミラーを維持します。

ファイル スキャン パイプライン

ファイル スキャン パイプラインは次のように動作します。

  1. エンドユーザーは、スキャンされていない Cloud Storage バケットにファイルをアップロードします。
  2. Eventarc サービスはこのアップロード イベントを検出し、この新しいファイルについて Cloud Run サービスに通知します。
  3. Cloud Run サービスが、スキャンされていない Cloud Storage バケットから新しいファイルをダウンロードし、ClamAV マルウェア スキャナに渡します。
  4. マルウェアのスキャン結果に応じて、次のいずれかのアクションが行われます。
    • ファイルがクリーンであることを ClamAV が宣言すると、スキャンされていない Cloud Storage バケットからクリーンな Cloud Storage バケットにファイルが移動します。
    • ファイルにマルウェアが含まれていることが ClamAV によって宣言された場合、ファイルはスキャンされていない Cloud Storage バケットから隔離された Cloud Storage バケットに移動します。
  5. サービスはこれらのアクションの結果を Logging と Monitoring に報告し、管理者がアクションを行えるようにします。

ClamAV マルウェア データベースのミラー更新パイプライン

スキャンを効果的に行うには、マルウェア シグネチャを最新のデータベースに保存する必要があります。

ClamAV サービスは、ステートレス サービスである Cloud Run を使用して実行されます。サービスのインスタンスの起動時に、ClamAV は常に最新の完全なマルウェア データベースをダウンロードする必要があります。これは、数百メガバイトのサイズです。

ClamAV のパブリック マルウェア データベースは、コンテンツ配信ネットワーク(CDN)でホストされており、これらのダウンロードにはレート制限があります。複数のインスタンスが起動し、データベース全体をダウンロードしようとすると、レート制限がトリガーされることがあります。これにより、Cloud Run で使用される外部 IP アドレスが 24 時間ブロックされます。これにより、ClamAV サービスが起動されなくなり、マルウェア データベースの更新がダウンロードされるのを防止できます。

また、Cloud Run は外部 IP アドレスの共有プールを使用します。その結果、異なるプロジェクトのマルウェア スキャン インスタンスからのダウンロードは、CDN から 1 つのアドレスからのものと見なされ、ブロックもトリガーされます。

このパイプラインは、Cloud Storage のデータベースの最新のプライベート ローカルミラーを保持します。これにより、ClamAV 一般公開データベースには、更新ごとに 1 回だけアクセスして、より小さい差分更新ファイルをダウンロードします。完全なデータベースはアクセスしないため、レート制限が回避されます。

このパイプラインは次のように動作します。

  1. Cloud Scheduler のジョブは、2 時間ごとにトリガーされるように構成されています。これは、ClamAV 新しい clclam サービスで使用されるデフォルトの更新チェック間隔と同じです。このジョブは、Cloud Run サービスに HTTP POST リクエストを行い、マルウェア データベース ミラーを更新するよう指示します。
  2. Cloud Run インスタンスが、マルウェア データベース ミラーを Cloud Storage バケットからローカル ファイル システムにコピーします。
  3. 次に、インスタンスは ClamAV CVDUpdate ツールを実行します。このツールは、使用可能な差分更新をダウンロードして、データベース ミラーに適用します。
  4. 次に、更新されたマルウェア データベースのミラーを Cloud Storage バケットにコピーします。

Cloud Run インスタンスで実行されている ClamAV cleanclam サービスでは、起動時に Cloud Storage からマルウェア データベースをダウンロードします。また、実行時に、使用可能なデータベースの更新を確認し、Cloud Storage バケットからダウンロードします。

目標

  • ClamAV マルウェア定義データベースのミラーを Cloud Storage バケットに作成します。

  • 以下の関数を使用して、Cloud Run サービスを構築します。

    • Cloud Storage バケット内のファイルで ClamAV を使用してスキャンし、スキャン結果に基づいてスキャンされたファイルをクリーンまたは隔離されたバケットに移動します。
    • ClamAV マルウェア定義データベースのミラーを Cloud Storage に維持します。
  • ファイルが Cloud Storage にアップロードされたときにマルウェア スキャン サービスをトリガーする Eventarc トリガーを作成します。

  • マルウェア スキャン サービスをトリガーして Cloud Storage のマルウェア定義データベースのミラーを更新する Cloud Scheduler ジョブを作成します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  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. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Artifact Registry, Cloud Run, Eventarc, Logging, Cloud Scheduler, Pub/Sub, and Cloud Build API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Artifact Registry, Cloud Run, Eventarc, Logging, Cloud Scheduler, Pub/Sub, and Cloud Build API を有効にします。

    API を有効にする

  8. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  9. このチュートリアルでは、すべてのコマンドを Cloud Shell で実行します。

環境の設定

このセクションでは、チュートリアル全体で使用される値(リージョンやゾーンなど)の設定を行います。このチュートリアルでは、Cloud Run サービスのリージョンとして us-central1 を使用し、Eventarc トリガーと Cloud Storage バケットのロケーションとして us を使用します。

  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"
    

    プロジェクト ID に PROJECT_ID を設定します。

  2. プロジェクト ID で gcloud 環境を初期化します。

    gcloud config set project "${PROJECT_ID}"
    
  3. 一意の名前で 3 つの Cloud Storage バケットを作成します。

    gsutil mb -l "${LOCATION}" "gs://unscanned-${PROJECT_ID}"
    gsutil mb -l "${LOCATION}" "gs://quarantined-${PROJECT_ID}"
    gsutil mb -l "${LOCATION}" "gs://clean-${PROJECT_ID}"
    

    ${PROJECT_ID} は、バケット名が一意となるようにするために使用されます。

    これら 3 つのバケットは、ファイル スキャン パイプライン中のさまざまな段階で、アップロードされたファイルを保持します。

    • unscanned-PROJECT_ID: スキャン前のファイルを保持します。ユーザーは、このバケットにファイルをアップロードします。

    • quarantined-PROJECT_ID: マルウェア スキャン サービスでスキャンされ、マルウェアが含まれていると判断されたファイルが保存されます。

    • clean-PROJECT_ID: マルウェア スキャン サービスでスキャンされ、感染していないと判断されたファイルが保存されます。

  4. 4 つ目の Cloud Storage バケットを作成します。

    gsutil mb -l "${LOCATION}" "gs://cvd-mirror-${PROJECT_ID}"
    

    ${PROJECT_ID} は、バケット名が一意であるようにするために使用されます。

    このバケット cvd-mirror-PROJECT_ID は、マルウェア定義データベースのローカルミラーを維持するために使用されます。これにより、CllamAV CDN によってレート制限がトリガーされることがなくなります。

マルウェア スキャン サービスのサービス アカウントの作成と権限の付与

このセクションでは、マルウェア スキャン サービスに使用するサービス アカウントを作成し、サービス アカウントに適切なロールを付与して、Cloud Storage バケットに対する読み取りと書き込みの権限を付与します。これは、アカウントに最小限の権限が付与され、必要なリソースにのみアクセスできるようにすることを目的としています。

  1. malware-scanner サービス アカウントを作成します。

    gcloud iam service-accounts create ${SERVICE_NAME}
    
  2. バケットにオブジェクト管理者ロールを付与して、サービスでスキャンされていないバケットからのファイルの読み取り、削除、検疫されたバケットとクリーンなバケットへのファイルの書き込ができるようにします。

    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://unscanned-${PROJECT_ID}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://clean-${PROJECT_ID}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://quarantined-${PROJECT_ID}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://cvd-mirror-${PROJECT_ID}"
    
  3. サービスが Monitoring に指標を書き込むことができるように、指標の書き込みロールを付与します。

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

Cloud Run にマルウェア スキャン サービスを作成する

このセクションでは、マルウェア スキャン サービスを Cloud Run にデプロイします。このサービスは Docker コンテナで実行され、次のものが含まれます。

  • サービス、Node.js ランタイム、GCloud SDK、ClamAV バイナリを含むコンテナ イメージをビルドするための Dockerfile
  • マルウェア スキャン Cloud Run サービスの Node.js ファイル
  • config.json 構成ファイルを使用して Cloud Storage バケット名を指定します。
  • updateCvdMirror.sh シェル スクリプトを実行して、Cloud Storage にある ClamAV マルウェア定義データベース ミラーを更新します。
  • cloud-run-proxy サービス。freshclam HTTP リクエストをプロキシすることで、Cloud Storage API への認証済みアクセスを提供します。
  • 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. config.json 構成ファイルを編集して、作成した Cloud Storage バケットを指定します。これらはプロジェクト ID に基づいているため、単純な検索と置換を使用できます。

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

    更新された構成ファイルを表示できます。

    cat config.json
    
  4. Cloud Storage で ClamAV マルウェア データベース ミラーの最初の母集団を実行します。

    python3 -m venv pyenv
    . pyenv/bin/activate
    pip3 install crcmod cvdupdate
    ./updateCvdMirror.sh "cvd-mirror-${PROJECT_ID}"
    deactivate
    

    これにより、CVDUpdate ツールのローカル インストールが実行され、これを使用してマルウェア データベースがダウンロードされ、前に作成した Cloud Storage cvd-mirror バケットにアップロードします。

    ミラーの内容は確認できます。

    gsutil ls "gs://cvd-mirror-${PROJECT_ID}/cvds"
    

    バケットには、完全なマルウェア データベースを含むいくつかの CVD ファイル、日次差分更新を含むいくつかの .cdiff ファイル、および構成と状態に関する情報を含む 2 つの .json ファイルが含まれている必要があります。

  5. 前の手順で作成したサービス アカウントを使用して 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 \
      --service-account="${SERVICE_ACCOUNT}"
    

    これにより、1 個の vCPU と 4 GiB の RAM を使用する Cloud Run インスタンスが作成されます。このチュートリアルでは、これが許容できるサイズですが、本番環境では、インスタンスにより大きい CPU とメモリサイズを選択し、より大きなサイズを選択することをおすすめします。より大きな --max-instances パラメータは、サービスが処理する必要があるトラフィックの量に応じて変わります。

    --concurrency パラメータは、各インスタンスが処理できる同時リクエスト数を指定します。

    --no-cpu-throttling パラメータを使用すると、マルウェア定義の更新など、バックグラウンドでのオペレーションを実行できます。

    --cpu-boost パラメータは、インスタンスの起動時の vCPU 数を 2 倍にすることによって、起動レイテンシを短縮します。

    各インスタンスの起動時間は比較的長いため、--min-instances 1 パラメータは少なくとも 1 つのインスタンスをアクティブに保ちます。

    --max-instances 5 パラメータは、サービスのスケールアップが高すぎるのを防ぎます。

  6. プロンプトが表示されたら、「Y」と入力します。

ビルドとデプロイには約 10 分かかります。完了すると、次のメッセージが表示されます。

Service [malware-scanner] revision [malware-scanner-NNNNN-XXX] has been deployed and is serving 100 percent of traffic.
Service URL: https://malware-scanner-XXXXXXXX-XX.a.run.app

デプロイ コマンドの出力の Service URL 値をシェル変数に保存します。これは、後で Cloud Scheduler ジョブを作成するときに使用します。

SERVICE_URL="SERVICE_URL"

Cloud Run サービスでは、すべての呼び出しの認証を行う必要があり、認証 ID がサービスに対する run.routes.invoke 権限を持っている必要があります。

実行中のサービスと ClamAV のバージョンを確認するには、次のコマンドを実行します。

curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)"  \
     ${SERVICE_URL}

Eventarc Cloud Storage トリガーを作成する

このセクションでは、Eventarc が Cloud Storage イベントをキャプチャするための権限と、これらのイベントを Cloud Run malware-scanner サービスに送信するためのトリガーを追加します。

  1. 2021 年 4 月 8 日より前に作成された既存のプロジェクトを使用している場合は、Pub/Sub をプッシュ通知用に構成します。

  2. Cloud Shell で、Cloud Storage サービス アカウントに roles/pubsub.publisher ロールを付与します。

    STORAGE_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p "${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. スキャンされていない Cloud Storage バケット内のファイナライズされたオブジェクト イベントをキャプチャして、Cloud Run サービスに送信する Eventarc トリガーを作成します。トリガーでは、認証に 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}"
    

    次のいずれかのエラーが表示された場合は、1 分ほど待ってからコマンドを再度実行します。

    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 サブスクリプションのメッセージ確認応答期限を 2 分に変更します。

    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=120
    

    大きなファイルや負荷が高い場合、デフォルト値の 10 秒は短すぎます。

ClamAV データベースのミラー更新をトリガーする Cloud Scheduler ジョブを作成する

マルウェア定義データベースのミラーを更新するコマンドを使用して、Cloud Run サービスで HTTP POST リクエストを実行する Cloud Scheduler ジョブを作成します。同じ時間枠を使用するクライアントが多くなりすぎないように、ClamAV では、10 の倍数以外の 3 ~ 57 のランダムな分でジョブをスケジュールする必要があります。

while : ; do
  # set MINUTE to a random number between 3 and 57
  MINUTE="$((RANDOM%55 + 3))"
  # exit loop if MINUTE is not 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 文字列形式を使用してジョブが実行されるタイミングを定義します。指定した値は、2 時間おきにランダムに生成された特定の分で実行することを示します。

このジョブは、Cloud Storage 内の ClamAV ミラーのみを更新します。Cloud Run の各インスタンスの ClamAV cleanclam daemon は、30 分ごとにミラーで新しい定義をチェックし、ClamAV デーモンを更新します。

ファイルをアップロードしてパイプラインをテストする

クリーンな(マルウェアのない)ファイルと感染したファイルを 1 つずつアップロードして、パイプラインをテストします。

  1. サンプル テキスト ファイルを作成するか、既存のクリーンなファイルを使用して、パイプライン プロセスをテストします。

  2. サンプル データファイルをスキャンされていないファイル バケットにコピーします。

    gsutil cp filename "gs://unscanned-${PROJECT_ID}"
    

    filename を、クリーンなテキスト ファイルの名前に置き換えます。マルウェア スキャン サービスは、各ファイルを検査し、適切なバケットに移動します。このファイルはクリーンなバケットに移動されます。

  3. パイプラインで数秒間ファイルを処理してから、クリーンなバケットをチェックして、処理されたファイルがあるかどうかを確認します。

    gsutil ls -r "gs://clean-${PROJECT_ID}"
    
  4. スキャンされていないバケットからファイルが削除されました。

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    
  5. EICAR 標準のマルウェア対策テスト署名を含むeicar-infected.txtというファイルをスキャンしていないバケットにアップロードします。

    echo -e 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \
        | gsutil cp - "gs://unscanned-${PROJECT_ID}/eicar-infected.txt"
    
  6. 数秒待ってから、隔離バケットをチェックし、ファイルがパイプラインを正常に通過したかどうかを確認します。また、マルウェアに感染したファイルが検出されると、Logging のログエントリが記録されます。

    gsutil ls -r "gs://quarantined-${PROJECT_ID}"
    
  7. スキャンされていないバケットからファイルが削除されました。

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    

マルウェア定義データベース更新メカニズムをテストする

  • 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. [ログフィールド] フィルタの [サービス名] セクションで、[マルウェア スキャン] をクリックします。

ログクエリの結果には、サービスからのログが表示されます。このログには、アップロードした 2 つのファイルに対するスキャン リクエストとステータスを示すいくつかの行が含まれています。次に例を示します。

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

鮮度の高い更新ログは 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)

データベースが更新された場合は、代わりに clclam log 行は次のようになります。

DATE_TIME -> daily.cld updated (version: VERSION_INFO)

指標の表示

このサービスでは、モニタリングとアラートの目的で次の指標が生成されます。

  • 処理された感染していないファイルの数:
    custom.googleapis.com/opencensus/malware-scanning/clean_files
  • 処理された感染ファイルの数:
    custom.googleapis.com/opencensus/malware-scanning/infected_files
  • ファイルのスキャンに費やした時間:
    custom.googleapis.com/opencensus/malware-scanning/scan_duration
  • スキャンされた総バイト数:
    custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
  • 失敗したマルウェア スキャンの数:
    custom.googleapis.com/opencensus/malware-scanning/scans_failed
  • CVD ミラー更新チェック数:
    custom.googleapis.com/opencensus/malware-scanning/cvd-mirror-updates

これらの指標は、Cloud Monitoring の Metrics Explorer で表示できます。

  1. Google Cloud コンソール で、Cloud Monitoring の [Metrics Explorer] ページに移動します。

    Metrics Explorer に移動

  2. [指標の選択] フィールドをクリックして、フィルタ文字列 malware を入力します。

  3. [OpenCensus/malware-scanning/clean_files] 指標を選択します。グラフには、感染していないファイルがスキャンされた時を示すデータポイントが表示されます。

指標を使用してパイプラインをモニタリングし、マルウェアが検出された時点、またはファイルの処理に失敗した場合のアラートを作成できます。

その他の詳細を表示するために、さまざまな指標ラベルで指標を分類できます。

  • 転送元バケット
  • 転送先バケット
  • clam_version
  • cloud_run_revision

複数のバケットを処理する

マルウェア スキャン サービスは複数のソースバケットからファイルをスキャンし、クリーンなバケットと隔離されたバケットに分けて送信できます。

この高度な構成はこのチュートリアルの範囲外ですが、以下におおまかな手順を示します。

  1. スキャンされていない Cloud Storage バケット、クリーンな Cloud Storage バケット、検疫された Cloud Storage バケットを一意の名前で作成します。

  2. さまざまなバケットの malware-scanner サービス アカウントに適切なロールを付与します。

  3. 構成ファイル config.json を編集して、各構成のバケット名を指定します。

    {
      "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 トリガーを作成し、バケットごとに一意のトリガー名を指定します。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

  • Cloud Storage のドキュメントを確認する。
  • Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。