Integrar Apigee con Google SecOps

Esta página se aplica a Apigee y Apigee Hybrid.

En este documento se explica cómo integrar Apigee con Google Security Operations (Google SecOps). Si usas Google SecOps como solución SIEM, sigue los pasos que se indican en este documento para configurar Apigee de forma que envíe datos de registro a SecOps.

Para facilitar esta integración, Google SecOps admite un analizador de Apigee para ingerir datos de registro de Apigee. Consulta también Ingerir datos de Google Cloud en Google Security Operations. Una vez que hayas completado los pasos de configuración de este documento, tus datos de registro de Apigee se enviarán a Google SecOps.

Para obtener información sobre cómo integrar SecOps con otras soluciones SIEM, consulta el artículo Integrar Apigee con tu solución SIEM.

Audiencia

La audiencia de este documento incluye:

  • Administradores de APIs responsables de garantizar la seguridad de las APIs, gestionar las configuraciones de la plataforma, mejorar la eficiencia operativa y cumplir los requisitos de cumplimiento de seguridad.
  • Analistas de seguridad centrados en detectar e investigar de forma proactiva los incidentes de seguridad relacionados con las APIs para minimizar los riesgos y proteger los datos sensibles.

Descripción general de la configuración

La configuración que se describe en este documento usa la política MessageLogging de Apigee para enviar a SecOps una amplia gama de datos de registro de Apigee, incluidas variables de flujo específicas.

Google SecOps proporciona un filtro especial de Cloud Logging que puede enviar tipos de registros específicos, incluidos los registros de Apigee, a Google SecOps en tiempo real. Google SecOps admite un analizador de Apigee para ingerir datos de registro de Apigee en Google SecOps. Consulta también Ingerir datos de Google Cloud en Google Security Operations.

Requisitos previos

Una vez que se cumplan estos requisitos previos, sigue las instrucciones de este documento para integrar Apigee con tu instancia de SecOps. Antes de empezar la integración, asegúrate de que tienes lo siguiente:

  • Una cuenta de Apigee o Apigee Hybrid con privilegios de administrador para desarrollar y desplegar proxies de API
  • Una cuenta de Google SecOps
  • Cloud Logging habilitado y experiencia en la configuración y el uso de Cloud Logging
  • Conocimientos sobre las variables de flujo de Apigee
  • Conocimientos sobre la política MessageLogging de Apigee y sobre el uso y la configuración de políticas en general
  • (Opcional) Conocer cómo se usan los analizadores de Google SecOps para interpretar los registros insertados. Los analizadores de SecOps están integrados de forma predeterminada para analizar y comprender los registros de Apigee ingeridos por la política MessageLogging.
  • Permisos de Google Cloud IAM para usar la API Cloud Logging y conceder roles de IAM a la cuenta de servicio de SecOps

Integrar Apigee con SecOps

Si usas Google SecOps como solución SIEM, sigue estos pasos para enviar datos de registro de Apigee a SecOps. Hay dos pasos básicos:

  • Configurar una política MessageLogging para enviar datos de registro de Apigee a Cloud Logging
  • Adjuntar la política MessageLogging a un proxy de Apigee

Cuando se complete la configuración de la política MessageLogging descrita en esta sección, SecOps analizará los datos de registro de Apigee enviados a Cloud Logging. Para obtener información detallada sobre el analizador y cómo se asignan los datos de las variables de flujo de Apigee a los campos de datos de SecOps, consulta el artículo Integrar Apigee con el SIEM de Google SecOps. Consulta también Recoger registros de Apigee.

Sigue estos pasos para integrar Apigee con SecOps mediante la política MessageLogging:

  1. Configura una nueva política MessageLogging. Consulta Vincular y configurar políticas en la interfaz de usuario.

    A continuación, se muestra un ejemplo de una política MessageLogging que envía datos a Cloud Logging. La política especifica un gran número de variables de flujo que se enviarán a Cloud Logging. Puedes añadir o quitar variables de flujo según los campos que consideres importantes para tu análisis de SecOps. Para obtener información sobre cómo se asignan los datos de las variables de flujo de Apigee a los campos de datos de SecOps, consulta el artículo Integrar Apigee con el SIEM de Google SecOps.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <MessageLogging continueOnError="false" enabled="true" name="ML-CloudLoggingSecOps">
       <DisplayName>ML-CloudLoggingSecOps</DisplayName>
       <CloudLogging>
         <LogName>projects/{organization.name}/logs/apigee-secops-integration-{environment.name}</LogName>
         <Message contentType="application/json">{
       "apiproduct.name": "{apiproduct.name}",
       "app.name": "{developer.app.name}",
       "cachehit":"{cachehit}",
       "client.country": "{client.country}",
       "client.cn": "{client.cn}",
       "client.ip": "{proxy.client.ip}",
       "client.locality": "{client.locality}",
       "client.port": "{client.port}",
       "client.scheme": "{client.scheme}",
       "client.state": "{client.state}",
       "developer.email": "{developer.email}",
       "environment.name": "{environment.name}",
       "error":"{is.error}",
       "error.state":"{error.state}",
       "error.message":"{escapeJSON(error.message)}",
       "fault.name":"{fault.name}",
       "messageid":"{messageid}",
       "organization.name": "{organization.name}",
       "proxy.name": "{apiproxy.name}",
       "proxy.basepath": "{proxy.basepath}",
       "proxy.pathsuffix": "{proxy.pathsuffix}",
       "proxy.proxyendpoint.name": "{proxy.name}",
       "proxy.revision":"{apiproxy.revision}",
       "request.content-length":"{request_msg.header.content-length}",
       "request.content-type":"{request_msg.header.content-type}",
       "request.host":"{request_msg.header.host}",
       "request.httpversion": "{request.version}",
       "request.url": "{client.scheme}://{request_msg.header.host}{request_msg.uri}",
       "request.user-agent":"{request.header.user-agent}",
       "request.verb": "{request.verb}",
       "request.x-b3-traceid": "{request.header.x-b3-traceid}",
       "request.x-cloud-trace-context": "{request.header.x-cloud-trace-context}",
       "response.content-length":"{response.header.content-length}",
       "response.content-type":"{response.header.content-type}",
       "response.status.code": "{message.status.code}",
       "system.region.name": "{system.region.name}",
       "system.timestamp": "{system.timestamp}",
       "system.uuid": "{system.uuid}",
       "target.cn": "{target.cn}",
       "target.country": "{target.country}",
       "target.host": "{target.host}",
       "target.ip": "{target.ip}",
       "target.locality": "{target.locality}",
       "target.organization": "{target.organization}",
       "target.port": "{target.port}",
       "target.scheme": "{target.scheme}",
       "target.state": "{target.state}",
       "target.url": "{request.url}"
      }
         </Message>
         <ResourceType>api</ResourceType>
       </CloudLogging>
      </MessageLogging>
  2. Adjunta la política como un paso condicional en un proxy de API. Una opción es adjuntar la política en un elemento FaultRule del PostFlow, donde normalmente se producen errores relacionados con la seguridad. Por ejemplo:

    <PostFlow name="PostFlow">
      <Request>
        <Step>
          <Condition>flow.isError == true)</Condition>
          <Name>ML-CloudLoggingSecOps</Name>
        </Step>
      </Request>
    </PostFlow>

    Ahora, cuando se ejecute el proxy de API que usa esta política, los datos de registro de Apigee se enviarán a Google SecOps.

    Otra práctica habitual es colocar la política MessageLogging en el PostClientFlow de la respuesta ProxyEndpoint.

    Ten en cuenta los siguientes consejos al adjuntar la política MessageLogging a tu proxy de API:

    • Coloca la política en un FaultRule. FaultRule es la ubicación recomendada para registrar excepciones de seguridad e infracciones de políticas.
    • Coloca la política en PostFlow. PostFlow es otro lugar adecuado para registrar problemas de seguridad.
    • Evita registrar las solicitudes correctas. Para la monitorización de seguridad centrada en las amenazas, normalmente se registran los detalles cuando algo va mal (se produce un fallo). Registrar cada solicitud correcta con el contenido completo del mensaje puede generar un número excesivo de registros y aumentar los costes.
    • Considera la posibilidad de usar variables personalizadas en determinados casos prácticos. Por ejemplo, si necesita registrar el URI de solicitud original en un flujo de errores, puede usar la política AssignMessage en el PreFlow de la solicitud para copiarlo en una variable personalizada (como original.request.uri) y, a continuación, registrar esa variable en la política MessageLogging.

Prácticas recomendadas

Ten en cuenta estas prácticas recomendadas al configurar Apigee con Google SecOps:

  • Centrarse en el contexto de seguridad: registrar solo las variables de flujo que proporcionen un contexto valioso para la monitorización de la seguridad y la detección de amenazas. Evita registrar demasiados datos que no estén relacionados con la seguridad.
  • Usa un formato de registro coherente: mantén un formato de registro coherente en todas las proxies de API que usen SecOps.
  • Usa cuentas de servicio seguras: sigue las prácticas recomendadas de seguridad para gestionar y proteger la cuenta de servicio de Google Cloud que se usa para la ingestión de SecOps. Si es posible, limita el permiso a Lector de registros.
  • Monitoriza el feed de SecOps: comprueba periódicamente el estado de tu feed de SecOps para asegurarte de que los registros se ingieren correctamente y sin errores.
  • Usa reglas y paneles de control de SecOps: una vez que los registros relevantes para la seguridad estén en SecOps, desarrolla reglas y paneles de control específicos para detectar y visualizar las amenazas de seguridad en función de la información detallada que estés registrando.

Solución de problemas

En esta sección se describen varios problemas que pueden surgir al configurar Apigee con SecOps y los aspectos que debes comprobar.

Problema: Los registros de eventos de seguridad no aparecen en Cloud Logging

Qué debes comprobar:

  • Comprueba que tu política MessageLogging esté configurada correctamente con el Condition para que se active cuando se produzca un evento de seguridad.
  • Asegúrate de que la política MessageLogging esté vinculada al contexto de flujo adecuado, como un elemento FaultRule o PostFlow.
  • Verifica que Cloud Logging esté habilitado en tu proyecto de Google Cloud.
  • Revisa los mensajes de error de los registros de tu proxy de Apigee relacionados con la política MessageLogging.

Problema: los registros de eventos de seguridad no aparecen en SecOps

  • Verifique que su feed de SecOps esté configurado correctamente con el ID de proyecto, el filtro de registro (para asegurarse de que registra los registros de su política de registro de seguridad) y las credenciales de la cuenta de servicio correctos.
  • Comprueba el estado de tu feed de SecOps en la interfaz de usuario de SecOps para ver si hay mensajes de error o problemas de ingesta.
  • Asegúrate de que la cuenta de servicio que usa SecOps tenga el rol Lector de registros en tu proyecto de Google Cloud.
  • Revisa la estructura JSON de tus registros en Cloud Logging para asegurarte de que tengan el formato correcto y contengan los nombres de campo esperados.
  • Confirma que el analizador de Google Cloud adecuado esté habilitado.
  • Si sospechas que hay un problema de análisis, examina una entrada de registro de ejemplo en los datos sin procesar de SecOps para ver cómo se ingirió antes del análisis. Si no se extraen campos específicos como se esperaba, puede que tengas que consultar la documentación del analizador de SecOps o plantearte si es necesario usar un analizador personalizado.

Integrar Apigee con Google SecOps SIEM

En la siguiente tabla se asignan los nombres de las variables de flujo de Apigee a los nombres de los campos de SIEM de Google SecOps equivalentes. Por ejemplo, al ver datos de registro de Apigee en Cloud Logging, la variable de flujo client.id se asigna al campo principle_ip de SecOps SIEM. Consulta también Recoger registros de Apigee.

Variable de flujo de Apigee Nombre del campo de SIEM de SecOps Descripción
client.country principal.hostname La IP del host HTTP asociada a la solicitud recibida por ProxyEndpoint.
client.host principal.location.country_or_region El país del certificado TLS/SSL presentado por la aplicación cliente. Solicitud de proxy principal.location.country_or_region.
client.ip principle.ip Dirección IP del cliente o del sistema que envía el mensaje al balanceador de carga. Por ejemplo, podría ser la IP del cliente original o la IP de un balanceador de carga.
client.locality principal.location.city La localidad (ciudad) del certificado TLS/SSL presentado por el cliente.
client.port principal.port Puerto HTTP asociado a la solicitud del cliente de origen a ProxyEndpoint.
client.state principal.location.state El estado del certificado TLS/SSL presentado por el cliente.
organization.name intermediary.cloud.project.name Nombre de la organización de Apigee.
proxy.client.ip src.ip La dirección X-Forwarded-For de la llamada entrante, que es la dirección IP que Apigee ha recibido del último handshake TCP externo. Puede ser el cliente que llama o un balanceador de carga.
proxy.name intermediary.resource.name El atributo name configurado para ProxyEndpoint.
proxy.pathsuffix intermediary.resource.attribute.labels[pathsuffix] "El valor del sufijo de la ruta de la URL que se envía desde el cliente y se recibe en ProxyEndpoint. La ruta base es el componente de ruta situado más a la izquierda que identifica de forma única un proxy de API en un grupo de entornos. Supongamos que tiene un endpoint de proxy de API configurado con una ruta base /v2/weatherapi. En ese caso, en una solicitud enviada a https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282, la variable proxy.pathsuffix contendrá la cadena /forecastrss."
proxy.url intermediary.url "Obtiene la URL completa asociada a la solicitud de proxy recibida por ProxyEndpoint, incluidos los parámetros de consulta presentes. Para ver un ejemplo de cómo se crea una URL de solicitud usando el host de la solicitud original (en lugar del host del enrutador usado en proxy.url), consulta Acceder a mensajes de solicitud."
request.uri target.resource.name Nombre de dominio del servicio de destino que devuelve la respuesta al proxy de la API.
request.verb network.http.method Verbo HTTP usado en la solicitud. Por ejemplo, GET, PUT y DELETE.
response.content security_result.description Contenido de la carga útil del mensaje de respuesta devuelto por el destino.
response.status.code network.http.response_code El código de respuesta devuelto para una solicitud. Puedes usar esta variable para anular el código de estado de la respuesta, que se almacena en message.status.code. Para obtener más información, consulta el mensaje.
system.region.name intermediary.location.name Nombre de la región del centro de datos en la que se ejecuta el proxy.
system.timestamp additional.fields[jsonPayload_system_timestamp] Número entero (largo) de 64 bits que representa la hora en la que se leyó esta variable. El valor es el número de milisegundos transcurridos desde la medianoche del 1 de enero de 1970 (UTC). Por ejemplo, 1534783015000.
system.uuid intermediary.process.pid o intermediary.process.product_specific_process_id El UUID del procesador de mensajes que gestiona el proxy.
target.country target.location.country_or_region País del certificado TLS/SSL presentado por el servidor de destino.
target.host target.hostname Nombre de dominio del servicio de destino que devuelve la respuesta al proxy de la API.
target.ip target.ip Dirección IP del servicio de destino que devuelve la respuesta al proxy de la API.
target.locality target.location.city Localidad (ciudad) del certificado TLS/SSL presentado por el servidor de destino
target.organization target.resource_ancestors.name Organización del certificado TLS/SSL presentado por el servidor de destino.
target.port target.port Número de puerto del servicio de destino que devuelve la respuesta al proxy de API.
target.scheme target.network.application_protocol Devuelve HTTP o HTTPS en función del mensaje de solicitud.
target.state target.location.state Estado del certificado TLS/SSL presentado por el servidor de destino.
target.url target.url La URL configurada en el archivo XML TargetEndpoint o la URL de destino dinámica (si target.url se define durante el flujo de mensajes). La variable no incluye ningún elemento de ruta adicional ni parámetros de consulta. Devuelve un valor nulo si se llama fuera del ámbito o si no se ha definido.

Nota: Usa una política de JavaScript adjunta a TargetEndpoint para definir esta variable.