Tenable Security Center

Versión de integración: 15.0

En este documento, se explica cómo integrar Tenable Security Center en Google Security Operations (Google SecOps).

Antes de comenzar

Para configurar la integración de Tenable Security Center, primero debes obtener las credenciales de conexión necesarias y confirmar que comprendes el método de autenticación requerido.

Requisitos previos para la autenticación

La integración admite dos métodos de autenticación mutuamente exclusivos. Debes proporcionar un par completo de credenciales.

  • Nombre de usuario y contraseña: Usa tus credenciales de acceso estándar.

  • Clave de acceso y clave secreta (recomendado): Este método usa la autorización de la clave de API y tiene prioridad si se proporcionan ambos pares de credenciales.

    Para generar estas claves, consulta Autorización de la clave de API.

Verificación de SSL

De forma predeterminada, la integración verifica el certificado SSL del servidor de Tenable Security Center. Si tu entorno usa un certificado interno o autofirmado, debes inhabilitar el parámetro de configuración Verify SSL.

Entradas de integración

Para configurar la integración, usa los siguientes parámetros:

Parámetros
Server Address Obligatorio

Es la dirección del servidor de Tenable Security Center que se usará en la integración.

Username Optional

Nombre de usuario para acceder al servidor de Tenable Security Center.

Se deben proporcionar Username y Password.

Password Optional

Contraseña para acceder al servidor de Tenable Security Center.

Se deben proporcionar Username y Password.

Access Key Optional

Es la clave de acceso de la cuenta de Tenable Security Center.

Se deben proporcionar Access Key y Secret Key.

Secret Key Optional

Clave secreta de la cuenta de Tenable Security Center.

Se deben proporcionar Access Key y Secret Key.

Verify SSL Optional

Si se selecciona, verifica que el certificado SSL para la conexión al servidor de Tenable sea válido.

Esta opción se selecciona de forma predeterminada.

Acciones

Agregar IP al recurso de lista de IPs

Agrega un activo de lista de IPs a la lista de IPs en Tenable Security Center.

Parámetros

Nombre visible del parámetro Tipo Valor predeterminado Is Mandatory Descripción
Nombre de elemento String N/A Especifica el nombre del recurso de lista de IPs al que deseas agregar IPs nuevas.

Fecha de ejecución

Esta acción se ejecuta en la entidad Dirección IP.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
{
    "type": "regular",
    "response": {
        "id": "41",
        "name": "api_test_5",
        "type": "static",
        "description": "",
        "tags": "qweqwe",
        "context": "",
        "status": "0",
        "createdTime": "1606129689",
        "modifiedTime": "1606129689",
        "ioSyncStatus": "Not Synced",
        "ioFirstSyncTime": "-1",
        "ioLastSyncSuccess": "-1",
        "ioLastSyncFailure": "-1",
        "ioSyncErrorDetails": null,
        "typeFields": {
            "definedIPs": "203.0.113.1,203.0.113.10"
        },
        "repositories": [
            {
                "ipCount": "-1",
                "repository": {
                    "id": "1",
                    "name": "Example-Repository",
                    "description": ""
                }
            }
        ],
        "ipCount": -1,
        "groups": [],
        "assetDataFields": [],
        "canUse": "true",
        "canManage": "true",
        "creator": {
            "id": "1",
            "username": "security_manager",
            "firstname": "Manager",
            "lastname": "Security"
        },
        "owner": {
            "id": "1",
            "username": "security_manager",
            "firstname": "Manager",
            "lastname": "Security"
        },
        "ownerGroup": {
            "id": "0",
            "name": "Full Access",
            "description": "Full Access group"
        },
        "targetGroup": {
            "id": -1,
            "name": "",
            "description": ""
        },
        "template": {
            "id": -1,
            "name": "",
            "description": ""
        }
    },
    "error_code": 0,
    "error_msg": "",
    "warnings": [],
    "timestamp": 1606129688
}
Muro de casos
Tipo de resultado Valor/Descripción Tipo
Mensaje de salida*

La acción no debe fallar ni detener la ejecución de un playbook:
Si el código estático es 200(is_success = true): print "Successfully added the following IPs to the IP List Asset {0} in Tenable Security Center:\n{1}".format(name, entity.identifier)

Si no hay entidades de IP: No se agregaron direcciones IP al activo de lista de IPs {0}.format(name)

La acción debería fallar y detener la ejecución del playbook:
Si hay un error fatal, como credenciales incorrectas, no hay conexión con el servidor, etc.: Imprime "Error executing action "Add IP to IP List Asset". Motivo: {0}''.format(error.Stacktrace)


Si no se encuentra el recurso: Imprime "Error al ejecutar la acción "Agregar IP al recurso de lista de IPs". Motivo: No se encontró el recurso {0} en Tenable Security Center. ''.format(error.Stacktrace)

Si no es el código estático 200 (is_success = false): Imprime "Error al ejecutar la acción "Agregar IP al activo de la lista de IPs". Motivo: {0}''.format(error_msg)

General

Crea un recurso de lista de IPs

Crea un activo de lista de IPs en Tenable Security Center. Se requiere al menos una entidad de IP para una ejecución exitosa.

Parámetros

Nombre visible del parámetro Tipo Valor predeterminado Is Mandatory Descripción
Nombre String N/A Especifica el nombre del activo de la lista de IPs.
Descripción String N/A No Especifica la descripción del activo de la lista de IPs.
Etiqueta String N/A No Especifica la etiqueta del activo de la lista de IPs.

Fecha de ejecución

Esta acción se ejecuta en la entidad Dirección IP.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
{
    "type": "regular",
    "response": {
        "id": "41",
        "name": "api_test_5",
        "type": "static",
        "description": "",
        "tags": "qweqwe",
        "context": "",
        "status": "0",
        "createdTime": "1606129689",
        "modifiedTime": "1606129689",
        "ioSyncStatus": "Not Synced",
        "ioFirstSyncTime": "-1",
        "ioLastSyncSuccess": "-1",
        "ioLastSyncFailure": "-1",
        "ioSyncErrorDetails": null,
        "typeFields": {
            "definedIPs": "203.0.113.1,203.0.113.10"
        },
        "repositories": [
            {
                "ipCount": "-1",
                "repository": {
                    "id": "1",
                    "name": "Example-Repository",
                    "description": ""
                }
            }
        ],
        "ipCount": -1,
        "groups": [],
        "assetDataFields": [],
        "canUse": "true",
        "canManage": "true",
        "creator": {
            "id": "1",
            "username": "security_manager",
            "firstname": "Manager",
            "lastname": "Security"
        },
        "owner": {
            "id": "1",
            "username": "security_manager",
            "firstname": "Manager",
            "lastname": "Security"
        },
        "ownerGroup": {
            "id": "0",
            "name": "Full Access",
            "description": "Full Access group"
        },
        "targetGroup": {
            "id": -1,
            "name": "",
            "description": ""
        },
        "template": {
            "id": -1,
            "name": "",
            "description": ""
        }
    },
    "error_code": 0,
    "error_msg": "",
    "warnings": [],
    "timestamp": 1606129688
}
Muro de casos
Tipo de resultado Valor/Descripción Tipo
Mensaje de salida*

La acción no debe fallar ni detener la ejecución de un playbook:
Si el código estático es 200(is_success = true): Imprime "Se creó correctamente el nuevo activo de lista de IPs {0} con las siguientes IPs en Tenable Security Center:\n{1}".format(name, entity.identifier)

Si no hay entidades de IP: Imprime el mensaje "At least 1 IP entity should be available in order to create an IP List Asset".


La acción debería fallar y detener la ejecución de un playbook:
Si hay un error irrecuperable, como credenciales incorrectas, no hay conexión con el servidor, o bien otro error: Imprime "Error al ejecutar la acción "Crear activo de lista de IPs". Motivo: {0}''.format(error.Stacktrace)

Si no es el código estático 200 (is_success = false): Imprime "Error al ejecutar la acción "Crear activo de lista de IPs". Motivo: {0}''.format(error_msg)

General

Enriquecer IP

Obtener información sobre las direcciones IP y enriquecerlas

Parámetros

Parámetro Tipo Valor predeterminado Descripción
Nombre de repositorio String N/A Es el nombre del repositorio.

Fecha de ejecución

Esta acción se ejecuta en la entidad Dirección IP.

Resultados de la acción

Enriquecimiento de entidades
Nombre del campo de enriquecimiento Lógica: Cuándo aplicar
macAddress Devuelve si existe en el resultado JSON
severityLow Devuelve si existe en el resultado JSON
vínculos Devuelve si existe en el resultado JSON
ip Devuelve si existe en el resultado JSON
Último análisis Devuelve si existe en el resultado JSON
severityCritical Devuelve si existe en el resultado JSON
total Devuelve si existe en el resultado JSON
severityAll Devuelve si existe en el resultado JSON
mcafeeGUID Devuelve si existe en el resultado JSON
policyName Devuelve si existe en el resultado JSON
uuid Devuelve si existe en el resultado JSON
lastAuthRun Devuelve si existe en el resultado JSON
severityInfo Devuelve si existe en el resultado JSON
osCPE Devuelve si existe en el resultado JSON
unicidad Devuelve si existe en el resultado JSON
dnsName Devuelve si existe en el resultado JSON
repositorio Devuelve si existe en el resultado JSON
ip Devuelve si existe en el resultado JSON
descripción Devuelve si existe en el resultado JSON
nombre Devuelve si existe en el resultado JSON
lastUnauthRun Devuelve si existe en el resultado JSON
biosGUID Devuelve si existe en el resultado JSON
tpmID Devuelve si existe en el resultado JSON
puntuación Devuelve si existe en el resultado JSON
hasPassive Devuelve si existe en el resultado JSON
pluginSet Devuelve si existe en el resultado JSON
hasCompliance Devuelve si existe en el resultado JSON
severityHigh Devuelve si existe en el resultado JSON
netbiosName Devuelve si existe en el resultado JSON
severityMedium Devuelve si existe en el resultado JSON
os Devuelve si existe en el resultado JSON
Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
[
{
"EntityResult":
{
"macAddress": "",
"severityLow": "0",
"links": [],
"ip": "203.0.113.1",
"lastScan": "1549425224",
"severityCritical": "0",
"total": "2",
"severityAll": "0,0,0,0,2",
"mcafeeGUID": "",
"policyName": "1e2e4247-0de7-56d5-8026-34ab1f3150ef-1130313/Basic Discovery Scan",
"uuid": "",
"lastAuthRun": "",
"severityInfo": "2",
"osCPE": "",
"uniqueness": "repositoryID,ip,dnsName",
 "dnsName": "example.com",
"repository":
          {
"id": "1",
"description": "",
"name": "repository"
          },
"lastUnauthRun": "1549363419",
"biosGUID": "",
"tpmID": "",
"score": "0",
"hasPassive": "No",
"pluginSet": "201902020242",
"hasCompliance": "No",
"severityHigh": "0",
"netbiosName": "",
"severityMedium": "0",
"os": ""
},
"Entity": "203.0.113.1"
}
]

Obtén recursos relacionados con una dirección IP.

Parámetros

Parámetro Tipo Valor predeterminado Descripción
Nombre de repositorio String N/A Es el nombre del repositorio.

Fecha de ejecución

Esta acción se ejecuta en la entidad Dirección IP.

Resultados de la acción

Enriquecimiento de entidades
Nombre del campo de enriquecimiento Lógica: Cuándo aplicar
id Devuelve si existe en el resultado JSON
nombre Devuelve si existe en el resultado JSON
Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
[
{
"EntityResult":
[
{
"id": "0",
"description": "All defining ranges of the Group in whose context this Asset is being evaluated.",
"name": "All Defined Ranges"
}, {
"id": "2",
"description": "This asset uses the Scan Summary plugin to detect if a host has been scanned by Nessus. The Scan Summary plugin contains the list of tests conducted during the most recent scan.",
"name": "Systems that have been Scanned"
}, {
"id": "13",
"description": "Leverage Nessus plugin 10180 (Ping the remote host) and Nessus plugin 12503 (Host Fully Qualified Domain Name (FQDN) Resolution) to find hosts that don't have a resolvable FQDN in DNS.",
"name": "Scanned Hosts Not in DNS"
}
],
"Entity": "203.0.113.1"
}
]

Obtener informes

Obtiene el contenido del informe por ID o nombre.

Parámetros

Parámetro Tipo Valor predeterminado Descripción
ID del informe String N/A Es el número de ID del informe, que se puede encontrar en la URL del informe.

Ejecutar en

Esta acción se ejecuta en todas las entidades.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
{
"pubSites":
[
"https://example.com",
"https://example.net"
]
}

Obtén resultados del análisis

Espera a que se complete el análisis y obtén sus resultados.

Parámetros

Parámetro Tipo Valor predeterminado Descripción
ID del resultado del análisis

String

N/A Es el ID de los resultados del análisis.

Fecha de ejecución

Esta acción se ejecuta en todas las entidades.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON

{
"severity_summary":
[
{
"count": "0",
"severity":
{
"id": "4",
"name": "Critical",
"description": "Critical Severity"
}
}, {
"count": "0",
"severity":
{
"id": "3",
"name": "High",
"description": "High Severity"
}
}, {
"count": "3",
"severity":
{"id": "2",
"name": "Medium",
"description": "Medium Severity"
}}
],
"results":
[
{
"name": "DNS Server Recursive Query Cache Poisoning Weakness",
"family": "DNS",
"hostTotal": "1",
"pluginID": "10539",
"total": "1",
"severity": "Medium"
}, {
"name": "DNS Server Spoofed Request Amplification DDoS",
"family": "DNS",
"hostTotal": "1",
"pluginID": "35450",
"total": "1",
"severity": "Medium"
}, {
"name": "SSL Medium Strength Cipher Suites Supported",
"family": "General",
"hostTotal": "1",
"pluginID": "42873",
"total": "1",
"severity": "Medium"
}
]
}

Obtén vulnerabilidades para la IP

Obtén un resumen de las vulnerabilidades y la gravedad de una dirección IP.

Parámetros

N/A

Fecha de ejecución

Esta acción se ejecuta en la entidad Dirección IP.

Resultados de la acción

Enriquecimiento de entidades
Nombre del campo de enriquecimiento Lógica: Cuándo aplicar
macAddress Devuelve si existe en el resultado JSON
protocolo Devuelve si existe en el resultado JSON
uuid Devuelve si existe en el resultado JSON
familia Devuelve si existe en el resultado JSON
pluginInfo Devuelve si existe en el resultado JSON
ip Devuelve si existe en el resultado JSON
pluginID Devuelve si existe en el resultado JSON
gravedad, Devuelve si existe en el resultado JSON
repositorio Devuelve si existe en el resultado JSON
unicidad Devuelve si existe en el resultado JSON
dnsName Devuelve si existe en el resultado JSON
puerto Devuelve si existe en el resultado JSON
netbiosName Devuelve si existe en el resultado JSON
nombre

Devuelve si existe en el resultado JSON

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
[
{
"EntityResult":
[
{
"macAddress": "",
"protocol": "TCP",
"uuid": "",
"family": "Web Servers",
"pluginInfo": "10107 (443/6) HTTP Server Type and Version",
"ip": "203.0.113.1",
"pluginID": "10107",
"severity": "Info",
"repository": "repo",
"uniqueness": "repositoryID,ip,dnsName",
"dnsName": "example.com",
"port": "443",
"netbiosName": "",
"name": "HTTP Server Type and Version"
}, {
"macAddress": "",
"protocol": "UDP",
"uuid": "",
"family": "DNS",
"pluginInfo": "10539 (53/17) DNS Server Recursive Query Cache Poisoning Weakness",
"ip": "203.0.113.1",
"pluginID": "10539",
"severity": "Medium",
"repository": "repo",
"uniqueness": "repositoryID,ip,dnsName",
"dnsName": "exaample.com",
"port": "53",
"netbiosName": "",
"name": "DNS Server Recursive Query Cache Poisoning Weakness"
}, {
"macAddress": "",
"protocol": "TCP",
"uuid": "",
"family": "General",
"pluginInfo": "10863 (443/6) SSL Certificate Information",
"ip": "203.0.113.1",
"pluginID": "10863",
"severity": "Info",
"repository": "repo",
"uniqueness": "repositoryID,ip,dnsName",
"dnsName": "example.com",
"port": "443",
"netbiosName": "",
"name": "SSL Certificate Information"
}
],
"Entity": "203.0.113.1"
}
]

Ping

Prueba la conectividad.

Fecha de ejecución

Esta acción se ejecuta en todas las entidades.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
null N/A N/A

Analizar IPs

Inicia un análisis de direcciones IP.

Parámetros

Parámetro Tipo Valor predeterminado Descripción
Nombre del análisis String N/A Es el nombre del análisis que se creará.
Nombre de la política String N/A Es el nombre de la política.

Fecha de ejecución

Esta acción se ejecuta en la entidad Dirección IP.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
scan_result_id N/A N/A

Ejecuta el análisis de recursos

Ejecuta el análisis de activos en Tenable Security Center.

Dónde encontrar el ID de política y el ID de repositorio

Para el ID de política:

  1. Navega hacia https://INSTANCE_IP_ADDRESS/#policies.
  2. Selecciona la política que deseas usar en la acción.
  3. En la URL, podrás ver el ID de esa política.

Para el ID del repositorio:

  1. Navega hacia https://INSTANCE_IP_ADDRESS/#repositories.
  2. Selecciona el repositorio que quieres usar en la acción.
  3. En la URL, podrás ver el ID de ese repositorio.

Parámetros

Nombre visible del parámetro Tipo Valor predeterminado Is Mandatory Descripción
Nombre del análisis N/A Especifica el nombre del análisis.
Nombre de elemento String N/A Especifica el nombre del activo que se debe analizar.
ID de la política Número entero N/A Especifica el ID de la política que se debe usar en el análisis.
ID del repositorio Número entero N/A Especifica el ID del repositorio que se debe usar en el análisis.
Descripción String N/A No Especifica la descripción del análisis.

Fecha de ejecución

Esta acción no se ejecuta en entidades.

Resultados de la acción

Resultado de secuencia de comandos
Nombre del resultado de la secuencia de comandos Opciones de valor Ejemplo
is_success Verdadero/Falso is_success:False
Resultado de JSON
{
    "type": "regular",
    "response": {
        "id": "11",
        "name": "Scan Name",
        "description": "",
        "ipList": "",
        "type": "policy",
        "dhcpTracking": "false",
        "classifyMitigatedAge": "0",
        "emailOnLaunch": "false",
        "emailOnFinish": "false",
        "timeoutAction": "import",
        "scanningVirtualHosts": "false",
        "rolloverType": "template",
        "status": "0",
        "createdTime": "1606132784",
        "modifiedTime": "1606132784",
        "maxScanTime": "3600",
        "reports": [],
        "assets": [
            {
                "id": "38",
                "name": "api_test_1",
                "description": ""
            }
        ],
        "credentials": [],
        "numDependents": "0",
        "schedule": {
            "id": -1,
            "objectType": -1,
            "type": "now",
            "start": "",
            "repeatRule": "",
            "enabled": "true",
            "nextRun": -1,
            "dependent": {
                "id": -1,
                "name": "",
                "description": ""
            }
        },
        "policy": {
            "id": "1000002",
            "context": "",
            "name": "Host Discovery",
            "description": "",
            "tags": "",
            "owner": {
                "id": "1",
                "username": "security_manager",
                "firstname": "Manager",
                "lastname": "Security"
            },
            "ownerGroup": {
                "id": "0",
                "name": "Full Access",
                "description": "Full Access group"
            }
        },
        "policyPrefs": [
            {
                "name": "MODE|discovery",
                "value": "host_enumeration"
            },
            {
                "name": "description",
                "value": ""
            },
            {
                "name": "display_unreachable_hosts",
                "value": "no"
            },
            {
                "name": "log_live_hosts",
                "value": "yes"
            },
            {
                "name": "name",
                "value": "Host Discovery"
            },
            {
                "name": "reverse_lookup",
                "value": "no"
            }
        ],
        "repository": {
            "id": "1",
            "name": "Example-Repository",
            "description": ""
        },
        "canUse": "true",
        "canManage": "true",
        "plugin": {
            "id": -1,
            "name": "",
            "description": ""
        },
        "zone": {
            "id": -1,
            "name": "",
            "description": ""
        },
        "ownerGroup": {
            "id": "0",
            "name": "Full Access",
            "description": "Full Access group"
        },
        "creator": {
            "id": "1",
            "username": "security_manager",
            "firstname": "Manager",
            "lastname": "Security"
        },
        "owner": {
            "id": "1",
            "username": "security_manager",
            "firstname": "Manager",
            "lastname": "Security"
        },
        "scanResultID": "34"
    },
    "error_code": 0,
    "error_msg": "",
    "warnings": [],
    "timestamp": 1606132783
}
Muro de casos
Tipo de resultado Valor/Descripción Tipo
Mensaje de salida*

La acción no debe fallar ni detener la ejecución de un playbook:
Si el código estático es 200(is_success = true): Imprime "Se inició correctamente el análisis de activos {0} en Tenable Security Center".format(name)

La acción debe fallar y detener la ejecución de un playbook:
Si se produce un error no recuperable, como credenciales incorrectas, falta de conexión con el servidor o algún otro problema, imprime "Error al ejecutar la acción "Ejecutar análisis de activos"". Reason: {0}''.format(error.Stacktrace)

Si no se encuentra el recurso: Imprime "Error al ejecutar la acción "Ejecutar análisis de recursos". Motivo: No se encontró el recurso {0} en Tenable Security Center. ''.format(name)

Si no es el código estático 200 (is_success = false): Imprime "Error al ejecutar la acción "Ejecutar análisis de recursos". Reason:{0}".format(error_msg)

General

Conectores

Conector de Tenable Security Center

Si quieres obtener instrucciones detalladas para configurar un conector en Google SecOps, consulta Cómo configurar el conector.

Parámetros del conector

Usa los siguientes parámetros para configurar el conector:

Parámetro Tipo Valor predeterminado Descripción
DeviceProductField String device_product Nombre del campo que se usa para determinar el producto del dispositivo.
EventClassId String nombre Es el nombre del campo que se usa para determinar el nombre del evento (subtipo).
PythonProcessTimeout String 60 Es el límite de tiempo de espera (en segundos) para el proceso de Python que ejecuta el script actual.
Dirección del servidor String null N/A
Nombre de usuario String null N/A
Contraseña Contraseña null N/A
Clave de acceso String null Optional

Es la clave de acceso de la cuenta de Tenable Security Center.

Se deben proporcionar Access Key y Secret Key.

Clave secreta Contraseña null Optional

Clave secreta de la cuenta de Tenable Security Center.

Se deben proporcionar Access Key y Secret Key.

Usa SSL Casilla de verificación Desmarcado N/A
Máx. de días hacia atrás Número entero 1 Cantidad de días hacia atrás desde los que deseas recuperar datos.
Límite por ciclo Número entero 10 Es la cantidad de alertas transferidas al conector en cada ciclo de ejecución.
Dirección del servidor proxy String null Es la dirección del servidor proxy que se usará.
Nombre de usuario del proxy String null Nombre de usuario del proxy con el que se realizará la autenticación.
Contraseña de proxy Contraseña null Es la contraseña del proxy con la que se realizará la autenticación.

Reglas del conector

El conector admite proxies.

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.