Automatiza el análisis de software malicioso para documentos subidos a Cloud Storage

Last reviewed 2021-10-10 UTC

En este instructivo, se muestra cómo compilar una canalización basada en eventos que pueda ayudarte a automatizar la evaluación de documentos en busca de código malicioso.

La evaluación manual de la gran cantidad de documentos subidos a Cloud Storage toma demasiado tiempo para la mayoría de las apps.

Esta canalización se compila mediante productos de Google Cloud junto con un motor de antivirus de código abierto llamado ClamAV. Para este instructivo, ClamAV se ejecuta en un contenedor de Docker alojado en Cloud Run. La canalización también escribe entradas de registro en Cloud Logging y registra las métricas en Cloud Monitoring.

Puedes activar alertas basadas en registros para documentos infectados mediante el uso de estas entradas de registro de Logging, pero la configuración de estas alertas no se incluye en este instructivo.

El término software malicioso se usa en este instructivo como un término general para describir troyanos, virus y otros códigos maliciosos.

En este instructivo, se da por sentado que estás familiarizado con la funcionalidad básica de Cloud Storage, Cloud Run, Eventarc, Docker y Node.js

Arquitectura

En el siguiente diagrama, se describen los pasos en la canalización.

Arquitectura de la canalización del análisis de software malicioso.

En los siguientes pasos, se describe la canalización de arquitectura:

  • Sube archivos a Cloud Storage.
  • Subir un archivo activa el servicio de análisis de software malicioso de forma automática.
  • El servicio de análisis de software malicioso analiza el documento subido en busca de software malicioso
  • Si el documento está infectado, el servicio lo mueve a un bucket en cuarentena; de lo contrario, lo mueve a otro bucket que contenga documentos analizados no infectados

Objetivos

  • Crear un servicio de análisis de software malicioso de Cloud Run para analizar documentos en busca de software malicioso con ClamAV y mover los documentos analizados a buckets limpios o en cuarentena según el resultado del análisis.

  • Crea un activador de Eventarc para activar el servicio de análisis de software malicioso cuando se suba un documento a Cloud Storage.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  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 Run, Eventarc, Logging, and Cloud Build 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 Run, Eventarc, Logging, and Cloud Build 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. En este instructivo, ejecutarás todos los comandos desde Cloud Shell.

Configura tu entorno

En esta sección, debes asignar parámetros de configuración a los valores que se usan en el instructivo, como la región y la zona. En este instructivo, debes usar us-central1 como la región para el servicio de Cloud Run y us como la ubicación para el activador de Eventarc y los buckets de Cloud Storage.

  1. En Cloud Shell, configura la región y la zona:

    export REGION=us-central1
    export LOCATION=us
    
  2. Inicializa el entorno gcloud con el ID de tu proyecto y establece una variable de entorno:

    export PROJECT_ID=PROJECT_ID
    gcloud config set project "${PROJECT_ID}"
    

    PROJECT_ID: Establece el ID del proyecto.

  3. Crea tres depósitos de Cloud Storage con nombres únicos:

    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} se usa para garantizar que los nombres de los buckets sean únicos.

Los tres buckets que crees contendrán el documento en varias etapas durante la canalización:

  • unscanned-PROJECT_ID: Contiene los documentos antes de que se procesen. Es el bucket donde se suben los documentos.

  • quarantined-PROJECT_ID: Contiene documentos que el servicio de análisis de software malicioso analiza para determinar si contienen software malicioso.

  • clean-PROJECT_ID: Contiene los documentos que el servicio de análisis de software malicioso analizó y descubrió que no están infectados.

Crea una cuenta de servicio para el servicio de análisis de software malicioso y otorga permisos

En esta sección, crearás una cuenta de servicio para usar en el servicio de análisis de software malicioso y otorgarás las funciones correspondientes a la cuenta de servicio a fin de que tenga permisos de lectura y escritura en los buckets de Cloud Storage. Esto garantiza que la cuenta tenga permisos mínimos y solo tenga acceso a los recursos que necesita.

  1. Crea la cuenta de servicio malware-scanner:

    gcloud iam service-accounts create malware-scanner
    export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
    
  2. Otorga la función de administrador de objetos a los buckets, lo que permite que el servicio lea y borre documentos del bucket no analizado y escriba documentos en los buckets en cuarentena y limpios.

    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}"
    
  3. Otorga la función de escritor de métricas, que permite que el servicio escriba métricas en Monitoring:

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

Crea el servicio de análisis de software malicioso en Cloud Run

En esta sección, implementarás el servicio de análisis de software malicioso en Cloud Run. El servicio se ejecuta en un contenedor de Docker y contiene lo siguiente:

  • Archivos Node.js para el servicio de análisis de software malicioso.
  • Un Dockerfile para compilar una imagen con el servicio y los objetos binarios de ClamAV.
  • Una secuencia de comandos de shell bootstrap.sh para ejecutar clamAV y daemons freshclam cuando se inicia el contenedor
  1. En Cloud Shell, clona el repositorio de GitHub que contiene los archivos de código:

    git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
    
  2. Cambia al directorio cloudrun-malware-scanner:

    cd docker-clamav-malware-scanner/cloudrun-malware-scanner
    
  3. Crea e implementa el servicio de Cloud Run mediante la cuenta de servicio creada antes:

    export SERVICE_NAME=malware-scanner
    gcloud beta run deploy "${SERVICE_NAME}" \
      --source . \
      --region "${REGION}" \
      --no-allow-unauthenticated \
      --memory 4Gi \
      --min-instances 1 \
      --no-cpu-throttling \
      --service-account="${SERVICE_ACCOUNT}" \
      --set-env-vars \
        "UNSCANNED_BUCKET=unscanned-${PROJECT_ID},
        CLEAN_BUCKET=clean-${PROJECT_ID},
        QUARANTINED_BUCKET=quarantined-${PROJECT_ID}"
    
  4. Cuando se te solicite, ingresa Y.

Cuando la implementación se haya completado, verás un mensaje:

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

El servicio de Cloud Run requiere que todas las invocaciones se autentiquen, y las identidades en autenticación deben tener el permiso run.routes.invoke en el servicio.

Para verificar el servicio en ejecución y la versión de ClamAV, ejecuta el siguiente comando:

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

SERVICE_URL es la URL informada en el resultado de la implementación que se vio antes.

Crea un activador de Eventarc en Cloud Storage

En esta sección, agregarás permisos para permitir que Eventarc capture eventos de Cloud Storage y un activador a fin de enviar estos eventos al servicio malware-scanner de Cloud Run.

  1. Si usas un proyecto existente que se creó antes del 8 de abril de 2021, configura Pub/Sub para las notificaciones push.

  2. En Cloud Shell, otorga el rol roles/pubsub.publisher a la cuenta de servicio de Cloud Storage:

    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. Permite que la cuenta de servicio malware-scanner invoque el servicio de Cloud Run y actúe como un receptor de eventos de Eventarc:

    gcloud run services add-iam-policy-binding malware-scanner \
      --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. Crea un activador de Eventarc para capturar el evento de objeto final en el bucket no analizado de Cloud Storage y envíalo a tu servicio de Cloud Run. El activador usará la cuenta de servicio malware-scanner para la autenticación:

    gcloud eventarc triggers create trigger-gcs-malware-scanner \
      --destination-run-service="${SERVICE_NAME}" \
      --destination-run-region="${REGION}" \
      --location="${LOCATION}" \
      --event-filters="type=google.cloud.storage.object.v1.finalized" \
      --event-filters="bucket=unscanned-${PROJECT_ID}" \
      --service-account="${SERVICE_ACCOUNT}"
    

    Si recibes el siguiente error, espera un minuto y vuelve a ejecutar el comando:

    ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.

Sube archivos para probar la canalización

Sube un archivo limpio (libre de software malicioso) y un archivo infectado para probar la canalización.

  1. Crea un archivo de texto de muestra o usa un archivo limpio existente para probar los procesos de canalización.

  2. Copia el archivo de datos de muestra en el bucket de archivos no analizado:

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

    Reemplaza filename con el nombre del archivo de texto limpio. El servicio de análisis de software malicioso inspecciona cada documento y lo mueve a un bucket adecuado. Este documento se mueve al bucket clean-PROJECT_ID

  3. Espera unos segundos mientras la canalización procesa el documento y, luego, verifica el bucket clean-PROJECT_ID para ver si el documento procesado está allí:

    gsutil ls -r "gs://clean-${PROJECT_ID}"
    
  4. El documento se quitó del bucket no analizado:

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    
  5. En Cloud Shell, sube un archivo llamado eicar-infected.txt que contenga la firma de prueba de software malicioso estándar de EICAR en el bucket unscanned-PROJECT_ID:

    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. Espera unos segundos y, luego, verifica el bucket quarantined-PROJECT_ID para ver si el documento pasó por la canalización de forma correcta. El servicio también registra una entrada de registro de Logging cuando se detecta un documento infectado con software malicioso.

    gsutil ls -r "gs://quarantined-${PROJECT_ID}"
    
  7. El documento se quitó del bucket no analizado:

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

Supervisa el servicio

El servicio se puede supervisar mediante Cloud Logging y Cloud Monitoring.

Visualice los registros

  1. En la consola de Google Cloud, ve a la página Explorador de registros de Cloud Logging.

    Ir al Explorador de registros

  2. Si el filtro Campos de registro no se muestra, haz clic en el botón Campos de registro.

  3. En el filtro Campos de registro, haz clic en Revisión de Cloud Run.

  4. En la sección Nombre del servicio del filtro Campos de registro, haz clic en malware-scanner

Los resultados de la consulta de registros mostrarán los registros del servicio, incluidas varias líneas que muestran las solicitudes de análisis y el estado de los 2 archivos que subiste, por ejemplo:

Info: "Scan request for gs://unscanned-PROJECT_ID/filename, (##### bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021"
Info: "Scan status for gs://unscanned-PROJECT_ID/filename: CLEAN (##### bytes in #### ms)"
...
Info: "Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021"
Warning: "Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)"

Puedes ver que se informan la versión de ClamAV y la revisión de firma del virus, junto con el nombre del virus del archivo de prueba infectado.

Puedes usar estos mensajes de registro a fin de configurar alertas para cuando se haya encontrado un virus o cuando se hayan producido errores durante el análisis.

Ver métricas

El servicio genera las siguientes métricas para fines de supervisión y alertas:

  • Cantidad de archivos limpios procesados:
    custom.googleapis.com/opencensus/malware-scanning/clean_files
  • Cantidad de archivos infectados procesados:
    custom.googleapis.com/opencensus/malwares-canning/infected_files
  • Tiempo de análisis de archivos:
    custom.googleapis.com/opencensus/malware-scanning/scan_duration
  • Cantidad total de bytes analizados:
    custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
  • Cantidad de análisis de software malicioso con errores:
    custom.googleapis.com/opencensus/malwares-canning/scans_failed

Estas métricas se pueden ver en el Explorador de métricas de Cloud Monitoring.

  1. En la consola de Google Cloud, ve a la página Explorador de métricas de Cloud Monitoring.

    Ir al Explorador de métricas

  2. Haz clic en el campo Métrica y, luego, ingresa la string de filtro malware.

  3. Selecciona la métrica OpenCensus/malware-scanning/clean_files. El gráfico mostrará un dato que indica cuándo se analizó el archivo limpio.

Las métricas se pueden usar para supervisar la canalización y crear alertas cuando se detecte un virus o cuando el procesamiento de archivos falle.

Para obtener más detalles, las métricas se pueden desglosar en varias etiquetas:

  • source_bucket
  • destination_bucket
  • clam_version
  • cloud_run_revision

Controla múltiples buckets

El servicio de análisis de software malicioso puede analizar archivos de varios buckets de origen y enviarlos a buckets limpios y en cuarentena.

Si bien esta configuración avanzada está fuera del alcance de este instructivo, los pasos involucrados se resumen de la siguiente manera:

  1. Crea los diversos buckets de Cloud Storage no analizados, limpios y en cuarentena.

  2. Otorga las funciones correspondientes a la cuenta de servicio malware-scanner en los distintos buckets.

  3. Edita el archivo de configuración config.json para especificar los nombres de los buckets de cada configuración:

    {
      "buckets": [
        {
          "unscanned": "unscanned-bucket-1",
          "clean": "clean-bucket-1",
          "quarantined": "quarantined-bucket-1"
        },
        {
          "unscanned": "unscanned-bucket-2",
          "clean": "clean-bucket-2",
          "quarantined": "quarantined-bucket-2"
        }
      ]
    }
    
  4. Implementa el servicio malware-scanner y especifica la variable de entorno CONFIG_FILE=./config.json en lugar de las tres variables XXX_BUCKET=... para que se use la configuración del archivo.

  5. Para cada uno de los buckets no analizados, crea un activador de Eventarc y cambia el nombre del activador y el nombre del bucket cada vez.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  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.

¿Qué sigue?