Men-deploy pemindaian malware otomatis untuk file yang diupload ke Cloud Storage

Last reviewed 2024-12-02 UTC

Dokumen ini menjelaskan cara Anda men-deploy arsitektur dalam Mengotomatiskan pemindaian malware untuk file yang diupload ke Cloud Storage.

Panduan deployment ini mengasumsikan bahwa Anda sudah memahami fungsi dasar teknologi berikut:

Arsitektur

Diagram berikut menunjukkan arsitektur deployment yang Anda buat di dokumen ini:

Arsitektur pipeline pemindaian malware.

Diagram ini menunjukkan dua pipeline berikut yang dikelola oleh arsitektur ini:

  • Pipeline pemindaian file, yang memeriksa apakah file yang diupload berisi malware.
  • Pipeline update duplikat database malware ClamAV, yang mempertahankan duplikat terbaru database malware yang digunakan ClamAV.

Untuk informasi selengkapnya tentang arsitektur, lihat Mengotomatiskan pemindaian malware untuk file yang diupload ke Cloud Storage.

Tujuan

  • Membangun duplikat database definisi malware ClamAV di bucket Cloud Storage.

  • Bangun layanan Cloud Run dengan fungsi berikut:

    • Memindai file di bucket Cloud Storage untuk mendeteksi malware menggunakan ClamAV dan memindahkan file yang dipindai ke bucket yang bersih atau dikarantina berdasarkan hasil pemindaian.
    • Mempertahankan duplikat database definisi malware ClamAV di Cloud Storage.
  • Membuat pemicu Eventarc untuk memicu layanan pemindaian malware saat file diupload ke Cloud Storage.

  • Membuat tugas Cloud Scheduler untuk memicu layanan pemindaian malware guna memperbarui duplikat database definisi malware di Cloud Storage.

Biaya

Arsitektur ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan, gunakan kalkulator harga.

Sebelum memulai

  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. Dalam deployment ini, Anda menjalankan semua perintah dari Cloud Shell.

Men-deploy arsitektur

Anda dapat men-deploy arsitektur yang dijelaskan dalam dokumen ini menggunakan salah satu metode berikut:

  • Gunakan Cloud Shell: Gunakan metode ini jika Anda ingin melihat cara setiap komponen solusi di-deploy dan dikonfigurasi menggunakan alat command line Google Cloud CLI.

    Untuk menggunakan metode deployment ini, ikuti petunjuknya di Men-deploy menggunakan Cloud Shell.

  • Menggunakan Terraform CLI: Gunakan metode ini jika Anda ingin men-deploy solusi dengan seminimal mungkin langkah manual. Metode ini mengandalkan Terraform untuk men-deploy dan mengonfigurasi setiap komponen.

    Untuk menggunakan metode deployment ini, ikuti instruksinya di Men-deploy menggunakan Terraform CLI.

Men-deploy menggunakan Cloud Shell

Untuk men-deploy arsitektur yang dijelaskan dalam dokumen ini secara manual, selesaikan langkah-langkah di subbagian berikut.

Menyiapkan lingkungan Anda

Di bagian ini, Anda akan menetapkan setelan untuk nilai yang digunakan selama deployment, seperti region dan zona. Dalam deployment ini, Anda menggunakan us-central1 sebagai region untuk layanan Cloud Run dan us sebagai lokasi untuk pemicu Eventarc dan bucket Cloud Storage.

  1. Di Cloud Shell, tetapkan variabel shell umum termasuk region dan lokasi:

    REGION=us-central1
    LOCATION=us
    PROJECT_ID=PROJECT_ID
    SERVICE_NAME="malware-scanner"
    SERVICE_ACCOUNT="${SERVICE_NAME}@${PROJECT_ID}."
    

    Ganti PROJECT_ID dengan project ID Anda.

  2. Lakukan inisialisasi lingkungan gcloud dengan ID project Anda:

    gcloud config set project "${PROJECT_ID}"
    
  3. Buat tiga bucket Cloud Storage dengan nama unik:

    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} digunakan untuk memastikan bahwa nama bucket unik.

    Ketiga bucket ini menyimpan file yang diupload di berbagai tahap selama pipeline pemindaian file:

    • unscanned-PROJECT_ID: Menyimpan file sebelum dipindai. Pengguna Anda mengupload file mereka ke bucket ini.

    • quarantined-PROJECT_ID: Menyimpan file yang telah dipindai dan dianggap berisi malware oleh layanan pemindai malware.

    • clean-PROJECT_ID: Menyimpan file yang telah dipindai oleh layanan pemindai malware dan ternyata tidak terinfeksi.

  4. Buat bucket Cloud Storage keempat:

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

    ${PROJECT_ID} digunakan untuk memastikan bahwa nama bucket unik.

    Bucket ini cvd-mirror-PROJECT_ID digunakan untuk mempertahankan duplikat lokal database definisi malware, yang mencegah pembatasan kapasitas dipicu oleh CDN ClamAV.

Menyiapkan akun layanan untuk layanan pemindai malware

Di bagian ini, Anda akan membuat akun layanan yang akan digunakan untuk layanan pemindai malware. Anda kemudian memberikan peran yang sesuai untuk akun layanan sehingga akun tersebut memiliki izin untuk membaca dan menulis ke bucket Cloud Storage. Peran ini memastikan bahwa akun memiliki izin minimal dan hanya memiliki akses ke resource yang diperlukan.

  1. Buat akun layanan malware-scanner:

    gcloud iam service-accounts create ${SERVICE_NAME}
    
  2. Berikan peran Object Admin ke bucket. Peran ini memungkinkan layanan membaca dan menghapus file dari bucket yang tidak dipindai, serta menulis file ke bucket yang dikarantina dan bersih.

    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. Berikan peran Metric Writer, yang memungkinkan layanan menulis metrik ke Monitoring:

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

Membuat layanan pemindai malware di Cloud Run

Di bagian ini, Anda akan men-deploy layanan pemindai malware ke Cloud Run. Layanan ini berjalan di container Docker yang berisi hal-hal berikut:

  • Dockerfile untuk mem-build image container dengan layanan, runtime Node.js, Google Cloud SDK, dan biner ClamAV.
  • File TypeScript untuk layanan Cloud Run pemindai malware.
  • File konfigurasi config.json untuk menentukan nama bucket Cloud Storage Anda.
  • Skrip shell updateCvdMirror.sh untuk memperbarui duplikat database definisi malware ClamAV di Cloud Storage.
  • Skrip shell bootstrap.sh untuk menjalankan layanan yang diperlukan saat instance dimulai.

Untuk men-deploy layanan, lakukan hal berikut:

  1. Di Cloud Shell, buat clone repositori GitHub yang berisi file kode:

    git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
    
  2. Ubah ke direktori cloudrun-malware-scanner:

    cd docker-clamav-malware-scanner/cloudrun-malware-scanner
    
  3. Buat file konfigurasi config.json berdasarkan file template config.json.tmpl di repositori GitHub:

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

    Perintah sebelumnya menggunakan operasi telusuri dan ganti untuk memberi bucket Cloud Storage nama unik yang didasarkan pada Project ID.

  4. Opsional: Lihat file konfigurasi yang diperbarui:

    cat config.json
    
  5. Jalankan populasi awal duplikat database malware ClamAV di Cloud Storage:

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

    Perintah ini menjalankan penginstalan lokal alat CVDUpdate, lalu menjalankan skrip updateCvdMirror.sh yang menggunakan CVDUpdate untuk menyalin database malware ClamAV ke bucket cvd-mirror-PROJECT_ID yang Anda buat sebelumnya.

    Anda dapat memeriksa isi bucket mirror:

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

    Bucket harus berisi beberapa file CVD yang berisi database malware lengkap, beberapa file .cdiff yang berisi update diferensial harian, dan dua file JSON dengan informasi konfigurasi dan status.

  6. Buat dan deploy layanan Cloud Run menggunakan akun layanan yang Anda buat sebelumnya:

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

    Perintah ini membuat instance Cloud Run yang memiliki 1 vCPU dan menggunakan RAM sebesar 4 GiB. Ukuran ini dapat diterima untuk deployment ini. Namun, dalam lingkungan produksi, Anda mungkin ingin memilih ukuran CPU dan memori yang lebih besar untuk instance, dan parameter --max-instances yang lebih besar. Ukuran resource yang mungkin Anda perlukan bergantung pada jumlah traffic yang perlu ditangani oleh layanan.

    Perintah tersebut menyertakan spesifikasi berikut:

    • Parameter --concurrency menentukan jumlah permintaan simultan yang dapat diproses oleh setiap instance.
    • Parameter --no-cpu-throttling memungkinkan instance melakukan operasi di latar belakang, seperti memperbarui definisi malware.
    • Parameter --cpu-boost menggandakan jumlah vCPU pada startup instans untuk mengurangi latensi startup.
    • Parameter --min-instances 1 mempertahankan setidaknya satu instance yang aktif, karena waktu startup untuk setiap instance relatif tinggi.
    • Parameter --max-instances 5 mencegah peningkatan skala layanan yang terlalu tinggi.
  7. Saat diminta, masukkan Y untuk membangun dan men-deploy layanan. Build dan deployment memerlukan waktu sekitar 10 menit. Jika sudah selesai, pesan berikut akan ditampilkan:

    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. Simpan nilai Service URL dari output perintah deployment dalam variabel shell. Anda akan menggunakan nilai ini nanti saat membuat tugas Cloud Scheduler.

    SERVICE_URL="SERVICE_URL"
    
  9. Opsional: Untuk memeriksa layanan yang sedang berjalan dan versi ClamAV, jalankan perintah berikut:

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

    Outputnya akan terlihat seperti contoh berikut. Halaman ini menampilkan versi layanan pemindai malware, versi ClamAV, dan versi definisi malware dengan tanggal terakhir diperbarui.

    gcs-malware-scanner version 3.2.0
    Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec  6 09:40:14 2024
    

Layanan Cloud Run mengharuskan semua pemanggilan diautentikasi, dan identitas autentikasi harus memiliki izin run.routes.invoke di layanan. Anda menambahkan izin di bagian berikutnya.

Membuat pemicu Cloud Storage Eventarc

Di bagian ini, Anda akan menambahkan izin untuk mengizinkan Eventarc mengambil peristiwa Cloud Storage dan membuat pemicu untuk mengirim peristiwa ini ke layanan malware-scanner Cloud Run.

  1. Jika Anda menggunakan project yang sudah ada dan dibuat sebelum 8 April 2021, tambahkan peran iam.serviceAccountTokenCreator ke akun layanan Pub/Sub:

    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
    PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub."
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
        --role='roles/iam.serviceAccountTokenCreator'
    

    Penambahan peran ini hanya diperlukan untuk project lama dan memungkinkan Pub/Sub memanggil layanan Cloud Run.

  2. Di Cloud Shell, hibahkan peran Pub/Sub Publisher ke akun layanan 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. Izinkan akun layanan malware-scanner memanggil layanan Cloud Run, dan bertindak sebagai penerima peristiwa 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. Buat pemicu Eventarc untuk mengambil peristiwa objek akhir dalam bucket Cloud Storage yang tidak dipindai dan kirimkan ke layanan Cloud Run Anda. Pemicu menggunakan akun layanan malware-scanner untuk autentikasi:

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

    Jika Anda menerima salah satu error berikut, tunggu satu menit, lalu jalankan perintah lagi:

    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. Ubah batas waktu konfirmasi pesan menjadi lima menit di langganan Pub/Sub yang mendasarinya yang digunakan oleh pemicu Eventarc. Nilai default 10 detik terlalu pendek untuk file yang besar atau beban yang tinggi.

    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
    

    Meskipun pemicu Anda langsung dibuat, diperlukan waktu hingga dua menit agar pemicu tersebut berfungsi sepenuhnya.

Membuat tugas Cloud Scheduler untuk memicu update duplikasi database ClamAV

  • Buat tugas Cloud Scheduler yang menjalankan permintaan POST HTTP di layanan Cloud Run dengan perintah untuk memperbarui duplikat database definisi malware. Agar tidak terlalu banyak klien yang menggunakan slot waktu yang sama, ClamAV mengharuskan Anda menjadwalkan tugas pada menit acak antara 3 dan 57, sehingga menghindari kelipatan 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"
    

    Argumen command line --schedule menentukan kapan tugas dijalankan menggunakan format string unix-cron. Nilai yang diberikan menunjukkan bahwa tugas harus berjalan pada menit tertentu yang dihasilkan secara acak setiap dua jam.

Tugas ini hanya memperbarui duplikat ClamAV di Cloud Storage. Daemon freshclam ClamAV di setiap instance Cloud Run memeriksa duplikat setiap 30 menit untuk mencari definisi baru dan memperbarui daemon ClamAV.

Men-deploy menggunakan Terraform CLI

Bagian ini menjelaskan cara men-deploy arsitektur yang dijelaskan dalam dokumen ini menggunakan Terraform CLI.

Meng-clone Repositori GitHub

  1. Di Cloud Shell, clone repositori GitHub yang berisi kode dan file Terraform:

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

Menyiapkan lingkungan

Di bagian ini, Anda akan menetapkan setelan untuk nilai yang digunakan selama deployment, seperti region dan zona. Dalam deployment ini, Anda menggunakan us-central1 sebagai region untuk layanan Cloud Run dan us sebagai lokasi untuk pemicu Eventarc dan bucket Cloud Storage.

  1. Di Cloud Shell, tetapkan variabel shell umum termasuk region dan lokasi:

    REGION=us-central1
    LOCATION=us
    PROJECT_ID=PROJECT_ID
    

    Ganti PROJECT_ID dengan project ID Anda.

  2. Lakukan inisialisasi lingkungan gcloud CLI dengan ID project Anda:

    gcloud config set project "${PROJECT_ID}"
    
  3. Buat file konfigurasi config.json berdasarkan file template config.json.tmpl di repositori GitHub:

    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
    

    Perintah sebelumnya menggunakan operasi telusuri dan ganti untuk memberi bucket Cloud Storage nama unik yang didasarkan pada Project ID.

  4. Opsional: Lihat file konfigurasi yang diperbarui:

    cat docker-clamav-malware-scanner/cloudrun-malware-scanner/config.json
    
  5. Konfigurasikan variabel Terraform. Isi file konfigurasi config.json diteruskan ke Terraform menggunakan variabel TF_VAR_config_json, sehingga Terraform mengetahui bucket Cloud Storage mana yang harus dibuat. Nilai variabel ini juga diteruskan ke Cloud Run untuk mengonfigurasi layanan.

    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
    

Men-deploy infrastruktur dasar

  1. Di Cloud Shell, jalankan perintah berikut untuk men-deploy infrastruktur dasar:

    gcloud services enable \
      cloudresourcemanager.googleapis.com \
      serviceusage.googleapis.com
    cd docker-clamav-malware-scanner/terraform/infra
    terraform init
    terraform apply
    

    Balas yes saat diminta.

    Skrip Terraform ini melakukan tugas-tugas berikut:

    • Membuat akun layanan
    • Membuat Artifact Registry
    • Membuat bucket Cloud Storage
    • Menetapkan peran dan izin yang sesuai
    • Melakukan populasi awal bucket Cloud Storage yang berisi duplikat database definisi malware ClamAV

Mem-build container untuk layanan

  1. Di Cloud Shell, jalankan perintah berikut untuk meluncurkan tugas Cloud Build guna membuat image container untuk layanan:

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

    Tunggu beberapa menit hingga build selesai.

Men-deploy layanan dan pemicu

  1. Di Cloud Shell, jalankan perintah berikut untuk men-deploy layanan Cloud Run:

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

    Balas yes saat diminta.

    Perlu waktu beberapa menit hingga layanan di-deploy dan dimulai.

    Skrip terraform ini melakukan tugas-tugas berikut:

    • Men-deploy layanan Cloud Run menggunakan image container yang baru saja Anda build.
    • Menyiapkan pemicu Eventarc di bucket Cloud Storage unscanned. Meskipun pemicu Anda langsung dibuat, diperlukan waktu hingga dua menit agar pemicu tersebut berfungsi sepenuhnya.
    • Membuat tugas Cloud Scheduler untuk mengupdate ke duplikat definisi malware ClamAV.

    Jika deployment gagal dengan salah satu error berikut, tunggu satu menit, lalu jalankan kembali perintah terraform apply untuk mencoba membuat pemicu Eventarc lagi.

    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. Opsional: Untuk memeriksa layanan yang sedang berjalan dan versi ClamAV yang digunakan, jalankan perintah berikut:

    MALWARE_SCANNER_URL="$(terraform output -raw cloud_run_uri)"
    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"  \
      "${MALWARE_SCANNER_URL}"
    

    Outputnya akan terlihat seperti contoh berikut. Halaman ini menampilkan versi layanan pemindai malware, versi ClamAV, dan versi definisi malware dengan tanggal terakhir diperbarui.

    gcs-malware-scanner version 3.2.0
    Using Clam AV version: ClamAV 1.4.1/27479/Fri Dec  6 09:40:14 2024
    

Menguji pipeline dengan mengupload file

Untuk menguji pipeline, upload satu file bersih (bebas malware) dan satu file pengujian yang meniru file yang terinfeksi:

  1. Buat file teks contoh atau gunakan file bersih yang ada untuk menguji proses pipeline.

  2. Di Cloud Shell, salin file sampel data ke bucket yang tidak dipindai:

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

    Ganti FILENAME dengan nama file teks yang bersih. Layanan pemindai malware memeriksa setiap file dan memindahkannya ke bucket yang sesuai. File ini dipindahkan ke bucket yang bersih.

  3. Beri waktu pipeline beberapa detik untuk memproses file, lalu periksa bucket Anda yang bersih untuk melihat apakah file yang diproses ada di sana:

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

    Anda dapat memeriksa apakah file telah dihapus dari bucket yang tidak dipindai:

    gcloud storage ls "gs://unscanned-${PROJECT_ID}" --recursive
    
  4. Upload file bernama eicar-infected.txt yang berisi tanda tangan pengujian anti-malware standar EICAR ke bucket yang tidak dipindai:

    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"
    

    String teks ini memiliki tanda tangan yang memicu pemindai malware untuk tujuan pengujian. File pengujian ini adalah pengujian yang banyak digunakan. Ini bukan malware yang sebenarnya dan tidak berbahaya bagi workstation Anda. Jika mencoba membuat file yang berisi string ini di komputer yang menginstal pemindai malware, Anda dapat memicu pemberitahuan.

  5. Tunggu beberapa detik, lalu periksa bucket yang dikarantina untuk melihat apakah file Anda berhasil melewati pipeline:

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

    Layanan ini juga mencatat entri log Logging saat file yang terinfeksi malware terdeteksi.

    Anda dapat memeriksa apakah file telah dihapus dari bucket yang tidak dipindai:

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

Menguji mekanisme update database definisi malware

  • Di Cloud Shell, picu pemeriksaan update dengan memaksa tugas Cloud Scheduler untuk dijalankan:

    gcloud scheduler jobs run "${SERVICE_NAME}-mirror-update" --location="${REGION}"
    

    Hasil perintah ini hanya ditampilkan di log mendetail.

Memantau layanan

Anda dapat memantau layanan menggunakan Cloud Logging dan Cloud Monitoring.

Melihat log mendetail

  1. Di konsol Google Cloud, buka halaman Logs Explorer Cloud Logging.

    Buka Logs Explorer

  2. Jika filter Kolom log tidak ditampilkan, klik Log Fields.

  3. Di filter Kolom log, klik Cloud Run Revision.

  4. Di bagian Nama Layanan pada filter Kolom Log, klik malware-scanner.

Hasil kueri log menampilkan log dari layanan, termasuk beberapa baris yang menampilkan permintaan dan status pemindaian untuk kedua file yang Anda upload:

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)

Output-nya menunjukkan versi ClamAV dan revisi tanda tangan database malware, beserta nama malware untuk file pengujian yang terinfeksi. Anda dapat menggunakan pesan log ini untuk menyiapkan pemberitahuan saat malware ditemukan, atau saat kegagalan terjadi saat pemindaian.

Output-nya juga menunjukkan log update duplikat definisi malware:

Starting CVD Mirror update
CVD Mirror update check complete. output: ...

Jika duplikat diperbarui, output akan menampilkan baris tambahan:

CVD Mirror updated: DATE_TIME - INFO: Downloaded daily.cvd. Version: VERSION_INFO

Log update Freshclam muncul setiap 30 menit:

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)

Jika database telah diperbarui, baris log freshclam akan mirip dengan yang berikut:

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

Melihat Metrik

Layanan ini menghasilkan metrik berikut untuk tujuan pemantauan dan pemberitahuan:

  • Jumlah file bersih yang diproses:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/clean-files
  • Jumlah file terinfeksi yang diproses:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/infected-files
  • Jumlah file yang diabaikan dan tidak dipindai:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/ignored-files
  • Waktu yang dihabiskan untuk memindai file:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scan-duration
  • Total jumlah byte yang dipindai:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/bytes-scanned
  • Jumlah pemindaian malware yang gagal:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/scans-failed
  • Jumlah pemeriksaan update Duplikat CVD:
    workload.googleapis.com/googlecloudplatform/gcs-malware-scanning/cvd-mirror-updates

Anda dapat melihat metrik ini di Metrics Explorer Cloud Monitoring:

  1. Di konsol Google Cloud, buka halaman Metrics Explorer Cloud Monitoring.

    Buka Metrics Explorer

  2. Klik kolom Select a metric dan masukkan string filter malware.

  3. Luaskan resource Tugas Umum.

  4. Luaskan kategori Googlecloudplatform.

  5. Pilih metrik googlecloudplatform/gcs-malware-scanning/clean-files. Grafik ini menunjukkan titik data yang menunjukkan kapan file bersih dipindai.

Anda dapat menggunakan metrik untuk memantau pipeline dan membuat pemberitahuan saat malware terdeteksi, atau saat file gagal diproses.

Metrik yang dihasilkan memiliki label berikut, yang dapat Anda gunakan untuk pemfilteran dan agregasi guna melihat detail terperinci dengan Metrics Explorer:

  • source_bucket
  • destination_bucket
  • clam_version
  • cloud_run_revision

Dalam metrik ignored_files, label reason berikut menentukan alasan file diabaikan:

  • ZERO_LENGTH_FILE: Jika nilai konfigurasi ignoreZeroLengthFiles ditetapkan, dan file kosong.
  • FILE_TOO_LARGE: Jika file melebihi ukuran pemindaian maksimum 500 MiB.
  • REGEXP_MATCH: Jika nama file cocok dengan salah satu pola yang ditentukan di fileExclusionPatterns.
  • FILE_SIZE_MISMATCH: Jika ukuran file berubah saat sedang diperiksa.

Konfigurasi lanjutan

Bagian berikut menjelaskan cara mengonfigurasi pemindai dengan parameter lanjutan lainnya.

Menangani beberapa bucket

Layanan pemindai malware dapat memindai file dari beberapa bucket sumber dan mengirim file untuk memisahkan bucket bersih dan yang dikarantina. Meskipun konfigurasi lanjutan ini berada di luar cakupan deployment ini, berikut adalah ringkasan langkah-langkah yang diperlukan:

  1. Membuat bucket Cloud Storage yang tidak dipindai, bersih, dan dikarantina dengan nama unik.

  2. Berikan peran yang sesuai ke akun layanan malware-scanner di setiap bucket.

  3. Edit file konfigurasi config.json untuk menentukan nama bucket bagi setiap konfigurasi:

    {
      "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. Untuk setiap bucket yang tidak dipindai, buat pemicu Eventarc. Pastikan untuk membuat nama pemicu yang unik untuk setiap bucket.

    Bucket Cloud Storage harus berada dalam project dan region yang sama dengan pemicu Eventarc.

Jika Anda menggunakan deployment Terraform, langkah-langkah di bagian ini akan otomatis diterapkan saat Anda meneruskan file konfigurasi config.json yang telah diperbarui di variabel konfigurasi Terraform TF_VAR_config_json.

Mengabaikan file sementara

Beberapa layanan upload, seperti gateway SFTP ke Cloud Storage, membuat satu atau beberapa file sementara selama proses upload. Layanan ini kemudian mengganti nama file ini menjadi nama file akhir setelah upload selesai.

Perilaku normal pemindai adalah memindai dan memindahkan semua file, termasuk file sementara ini segera setelah ditulis, yang dapat menyebabkan layanan uploader gagal saat tidak dapat menemukan file sementaranya.

Bagian fileExclusionPatterns dari file konfigurasi config.json memungkinkan Anda menggunakan ekspresi reguler untuk menentukan daftar pola nama file yang akan diabaikan. Setiap file yang cocok dengan ekspresi reguler ini akan dibiarkan di bucket unscanned.

Saat aturan ini dipicu, penghitung ignored-files akan bertambah, dan pesan akan dicatat ke dalam log untuk menunjukkan bahwa file yang cocok dengan pola diabaikan.

Contoh kode berikut menunjukkan file konfigurasi config.json dengan daftar fileExclusionPatterns yang disetel untuk mengabaikan file yang diakhiri dengan .tmp atau berisi string .partial_upload..

{
  "buckets": [
    {
      "unscanned": "unscanned-bucket-name",
      "clean": "clean-bucket-name",
      "quarantined": "quarantined-bucket-name"
    },
  ],
  "ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
  "fileExclusionPatterns": [
    "\\.tmp$",
    "\\.partial_upload\\."
  ]
}

Berhati-hatilah saat menggunakan karakter \ dalam ekspresi reguler karena karakter tersebut harus di-escape dalam file JSON dengan \ lain. Misalnya, untuk menentukan . literal dalam ekspresi reguler, simbol harus di-escape dua kali - sekali untuk ekspresi reguler, dan sekali lagi untuk teks dalam file JSON, sehingga menjadi \\., seperti pada baris terakhir contoh kode sebelumnya.

Mengabaikan file dengan panjang nol

Serupa dengan file sementara, beberapa layanan upload membuat file dengan panjang nol di Cloud Storage, lalu memperbarui file ini nanti dengan lebih banyak konten.

File ini juga dapat diabaikan dengan menetapkan parameter config.json ignoreZeroLengthFiles ke true, misalnya:

{
  "buckets": [
    {
      "unscanned": "unscanned-bucket-name",
      "clean": "clean-bucket-name",
      "quarantined": "quarantined-bucket-name"
    },
  ],
  "ClamCvdMirrorBucket": "cvd-mirror-bucket-name",
  "ignoreZeroLengthFiles": true
}

Saat aturan ini dipicu, metrik ignored-files akan bertambah, dan pesan akan dicatat ke dalam log untuk menunjukkan bahwa file dengan panjang nol diabaikan.

Ukuran file pemindaian maksimum

Ukuran file pemindaian maksimum default adalah 500 MiB. Hal ini dipilih karena memerlukan waktu sekitar 5 menit untuk memindai file dengan ukuran ini.

File yang lebih besar dari 500 MiB akan diabaikan, dan dibiarkan di bucket unscanned. Metrik files-ignored bertambah dan pesan dicatat ke dalam log.

Jika Anda perlu meningkatkan batas ini, perbarui batas berikut agar menampung nilai ukuran file maksimum dan durasi pemindaian baru:

Pembersihan

Bagian berikut menjelaskan cara agar Anda tidak dikenai biaya di masa mendatang untuk project Google Cloud yang Anda gunakan dalam deployment ini.

Menghapus project Google Cloud

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam deployment ini, Anda dapat menghapus project 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.

Langkah berikutnya