Esta página se aplica a Apigee y Apigee Hybrid.
En este documento, se explica cómo integrar Apigee en Google Security Operations (Google SecOps). Si usas Google SecOps como tu solución de SIEM, sigue los pasos que se indican en este documento para configurar Apigee para que envíe datos de registro a SecOps.
Para facilitar esta integración, Google SecOps admite un analizador de Apigee para transferir datos de registro de Apigee. Consulta también Cómo transferir datos de Google Cloud a Google Security Operations. Después de completar los pasos de configuración de este documento, tus datos de registro de Apigee se transferirán a Google SecOps.
Para obtener información sobre cómo integrar SecOps con otras soluciones de SIEM, consulta Cómo integrar Apigee en tu solución de SIEM.
Público
El público de este documento incluye lo siguiente:
- Los administradores de API que son responsables de garantizar la seguridad de la API, administrar las configuraciones de la plataforma, respaldar la eficiencia operativa y cumplir con los requisitos de cumplimiento de seguridad.
- Los analistas de seguridad se enfocaron 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 analiza en este documento usa la política MessageLogging de Apigee para enviar una amplia variedad de datos de registro de Apigee, incluidas variables de flujo específicas, a SecOps.
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 transferir datos de registro de Apigee a Google SecOps. Consulta también Cómo transferir datos de Google Cloud a Google Security Operations.
Requisitos previos
Una vez que se cumplan estos requisitos previos, sigue las instrucciones de este documento para integrar Apigee a tu instancia de SecOps. Antes de comenzar la integración, asegúrate de tener lo siguiente:
- Una cuenta de Apigee o Apigee Hybrid con privilegios administrativos para desarrollar e implementar proxies de API
- Una cuenta de Google SecOps
- Cloud Logging habilitado y experiencia de configuración y uso de Cloud Logging
- Conocimiento de las variables de flujo de Apigee
- Conocimientos sobre la política de MessageLogging de Apigee y el uso y la configuración generales de las políticas
- (Opcional) Conocimiento de cómo se usan los analizadores de Google SecOps para interpretar los registros transferidos Los analizadores de SecOps están integrados de forma predeterminada para analizar y comprender los registros de Apigee que transfiere la política de MessageLogging.
- Permisos de IAM de Google Cloud para usar la API de Cloud Logging y otorgar roles de IAM a la cuenta de servicio de SecOps
Integra Apigee en SecOps
Si usas Google SecOps como tu solución de SIEM, sigue estos pasos para enviar los datos de registro de Apigee a SecOps. Hay dos pasos básicos:
- Configura una política de MessageLogging para enviar datos de registro de Apigee a Cloud Logging
- Adjunta la política MessageLogging a un proxy de Apigee
Cuando se complete la configuración de la política de MessageLogging que se describe en esta sección, SecOps analizará los datos de registro de Apigee que se envíen 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 Cómo integrar Apigee con el SIEM de Google SecOps. Consulta también Cómo recopilar registros de Apigee.
Sigue estos pasos para integrar Apigee con SecOps con la política de MessageLogging:
Configura una nueva política de MessageLogging. Consulta Adjunta y configura políticas en la IU.
A continuación, se muestra un ejemplo de una política de MessageLogging que envía datos a Cloud Logging. La política especifica una gran cantidad de variables de flujo que se enviarán a Cloud Logging. Puedes agregar o quitar variables de flujo según desees, según los campos que determines que son 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 Cómo integrar Apigee con Google SecOps SIEM.
<?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>
Adjunta la política como un paso condicional en un proxy de API. Una opción es adjuntar la política en una FaultRule en PostFlow, donde suelen generarse fallas relacionadas 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 transferirán a Google SecOps.
Otra práctica común es colocar la política de MessageLogging en PostClientFlow de la respuesta de ProxyEndpoint.
Ten en cuenta los siguientes consejos cuando adjuntes la política de MessageLogging a tu proxy de API:
- Coloca la política en una FaultRule. FaultRule es la ubicación recomendada para registrar excepciones de seguridad y incumplimientos de políticas.
- Coloca la política en el PostFlow. PostFlow es otra ubicación adecuada para registrar problemas de seguridad.
- Evita registrar solicitudes correctas. En el caso de la supervisión de seguridad centrada en las amenazas, por lo general, se registran los detalles cuando algo sale mal (se genera una falla). Registrar cada solicitud correcta con el contenido completo del mensaje puede generar registros excesivos y aumentar los costos.
- Considera las variables personalizadas para ciertos casos de uso. Por ejemplo, si necesitas capturar el URI de la solicitud original en un flujo de fallas, puedes usar la política AssignMessage en el flujo previo a la solicitud para copiarlo en una variable personalizada (como
original.request.uri
) y, luego, registrar esa variable en la política MessageLogging.
Prácticas recomendadas
Ten en cuenta estas prácticas recomendadas cuando configures Apigee con Google SecOps:
- Enfócate en el contexto de seguridad: Registra solo las variables de flujo que proporcionan un contexto valioso para la supervisión de seguridad y la detección de amenazas. Evita el registro excesivo de datos que no estén relacionados con la seguridad.
- Usa un formato de registro coherente: Mantén un formato de registro coherente en todos los proxies de API que usan SecOps.
- Usa cuentas de servicio seguras: Cumple con las prácticas recomendadas de seguridad para administrar y proteger la cuenta de servicio de Google Cloud que se usa para la transferencia de SecOps. Si es posible, limita el permiso al visor de registros.
- Supervisa el feed de SecOps: Supervisa periódicamente el estado y el estado de tu feed de SecOps para asegurarte de que los registros se transfieran correctamente y sin errores.
- Usa reglas y paneles de SecOps: Una vez que los registros relevantes para la seguridad estén en SecOps, desarrolla reglas y paneles específicos para detectar y visualizar amenazas de seguridad en función de la información detallada que registras.
Solución de problemas
En esta sección, se describen varios problemas posibles que puedes encontrar cuando configuras Apigee con SecOps y lo que debes verificar.
Problema: Los registros de eventos de seguridad no aparecen en Cloud Logging
Aspectos que debes verificar:
- Verifica que tu política de 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 de MessageLogging esté adjunta al contexto de flujo adecuado, como una FaultRule o un PostFlow.
- Verifica que Cloud Logging esté habilitado en tu proyecto de Google Cloud.
- Revisa los mensajes de error en los registros del proxy de Apigee relacionados con la política MessageLogging.
Problema: Los registros de eventos de seguridad no aparecen en SecOps
- Verifica que tu feed de SecOps esté configurado correctamente con el ID del proyecto, el filtro de registros (que garantice que capture los registros de tu política de registro de seguridad) y las credenciales de la cuenta de servicio correctos.
- Verifica el estado de tu feed de SecOps en la IU de SecOps para ver si hay mensajes de error o problemas de transferencia.
- Asegúrate de que la cuenta de servicio que usa SecOps tenga el rol de Visualizador de registros en tu proyecto de Google Cloud.
Los campos relacionados con la seguridad no se analizan correctamente en SecOps.
- 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 muestra en los datos sin procesar de SecOps para ver cómo se transfirió antes del análisis. Si los campos específicos no se extraen como se espera, es posible que necesites revisar la documentación del analizador de SecOps o considerar si es necesario un analizador personalizado.
Integra Apigee con el SIEM de Google SecOps
En la siguiente tabla, se asignan los nombres de las variables de flujo de Apigee a los nombres de campo de SIEM de Google SecOps equivalentes. Por ejemplo, cuando se ven los datos de registro de Apigee en Cloud Logging, la variable de flujo client.id
se asigna al campo SIEM de SecOps llamado principle_ip
. Consulta también Cómo recopilar registros de Apigee.
Variable de flujo de Apigee | Nombre del campo del SIEM de SecOps | Descripción |
---|---|---|
client.country | principal.hostname | La IP del host HTTP asociada con la solicitud que recibió ProxyEndpoint. |
client.host | principal.location.country_or_region | El país del certificado TLS/SSL que presentó la app cliente. Solicitud de proxy
principal.location.country_or_region . |
client.ip | principle.ip | La dirección IP del cliente o sistema que envía el mensaje al balanceador de cargas. Por ejemplo, puede ser la IP de cliente original o una IP del balanceador de cargas. |
client.locality | principal.location.city | La localidad (ciudad) en el certificado TLS/SSL que presentó el cliente. |
client.port | principal.port | El puerto HTTP asociado a la solicitud del cliente de origen al ProxyEndpoint. |
client.state | principal.location.state | El estado del certificado TLS/SSL que presentó el cliente. |
organization.name | intermediary.cloud.project.name | Es el 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 recibió del último protocolo de enlace TCP externo. Puede ser el cliente que realiza la llamada o un balanceador de cargas. |
proxy.name | intermediary.resource.name | El atributo name configurado para ProxyEndpoint |
proxy.pathsuffix | intermediary.resource.attribute.labels[pathsuffix] | "El valor del sufijo de ruta en la URL que se envía del cliente y se recibe en el ProxyEndpoint. La ruta base es el componente de ruta de acceso más a la izquierda que identifica de forma exclusiva un proxy de API dentro de un grupo de entornos. Supongamos que tienes un extremo de proxy de API configurado con una ruta base de /v2/weatherapi. En ese caso, 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 con la solicitud de proxy que recibió el ProxyEndpoint, incluidos los parámetros de consulta presentes. Para ver un ejemplo que construye una URL de solicitud con el host de solicitud original (en lugar del host de router que se usa en proxy.url), consulta "Mensajes de solicitud de acceso". |
request.uri | target.resource.name | El nombre de dominio del servicio de destino que muestra la respuesta al proxy de API. |
request.verb | Verbo de HTTP que se usa para la solicitud. Por ejemplo, GET, PUT y DELETE. | |
response.content | Contenido de la carga útil del mensaje de respuesta que muestra el destino. | |
response.status.code | El código de respuesta que se muestra para una solicitud. Puedes usar esta variable para anular el código de estado de respuesta, que se almacena en message.status.code. Para obtener más información, consulta el mensaje. | |
system.region.name | intermediary.location.name | El nombre de la región del centro de datos donde se ejecuta el proxy. |
system.timestamp | El número entero de 64 bits (largo) que representa la hora a la que se leyó esta variable. El valor es la cantidad 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 | UUID del procesador de mensajes que controla el proxy. |
target.country | target.location.country_or_region | País del certificado TLS/SSL que presentó el servidor de destino |
target.host | El nombre de dominio del servicio de destino que muestra la respuesta al proxy de API. | |
target.ip | La dirección IP del servicio de destino que muestra la respuesta al proxy de API. | |
target.locality | target.location.city | Localidad (ciudad) del certificado TLS/SSL que presentó el servidor de destino |
target.organization | Organización del certificado TLS/SSL que presentó el servidor de destino. | |
target.port | El número de puerto del servicio de destino que muestra la respuesta al proxy de API. | |
target.scheme | Muestra HTTP o HTTPS según el mensaje de solicitud. | |
target.state | target.location.state | Estado del certificado TLS/SSL que presentó el servidor de destino. |
target.url | La URL configurada en el archivo XML de TargetEndpoint o la URL de destino dinámica (si se configura target.url durante el flujo de mensajes). La variable no incluye elementos de ruta de acceso ni parámetros de consulta adicionales. Muestra un valor nulo si se llama fuera del alcance o no se configura. Nota: Usa una política de JavaScript adjunta a TargetEndpoint para configurar esta variable. |