Integrare Apigee con Google SecOps

Questa pagina si applica ad Apigee e Apigee hybrid.

Questo documento spiega come integrare Apigee con Google Security Operations (Google SecOps). Se utilizzi Google SecOps come soluzione SIEM, segui i passaggi descritti in questo documento per configurare Apigee in modo da inviare i dati di log a SecOps.

Per facilitare questa integrazione, Google SecOps supporta un parser Apigee per l'importazione dei dati di log di Apigee. Vedi anche Importare dati di Google Cloud in Google Security Operations. Dopo aver completato i passaggi di configurazione descritti in questo documento, i dati dei log di Apigee verranno inviati a Google SecOps.

Per informazioni su come integrare SecOps con altre soluzioni SIEM, consulta Integrare Apigee con la soluzione SIEM.

Pubblico

Il pubblico di questo documento include:

  • Amministratori API responsabili di garantire la sicurezza delle API, gestire le configurazioni della piattaforma, supportare l'efficienza operativa e rispettare i requisiti di conformità alla sicurezza.
  • Analisti della sicurezza che si concentrano sul rilevamento e sull'analisi proattivi degli incidenti di sicurezza correlati alle API per ridurre al minimo i rischi e proteggere i dati sensibili.

Panoramica configurazione

La configurazione descritta in questo documento utilizza i criteri MessageLogging di Apigee per inviare a SecOps un'ampia gamma di dati di log di Apigee, incluse variabili di flusso specifiche.

Google SecOps fornisce un filtro Cloud Logging speciale che può inviare tipi di log specifici, inclusi i log Apigee, a Google SecOps in tempo reale. Google SecOps supporta un parser Apigee per l'importazione dei dati di log di Apigee in Google SecOps. Vedi anche Importare dati di Google Cloud in Google Security Operations.

Prerequisiti

Una volta soddisfatti questi prerequisiti, segui le istruzioni riportate in questo documento per integrare Apigee con la tua istanza SecOps. Prima di iniziare l'integrazione, assicurati di disporre di quanto segue:

  • Un account Apigee o Apigee hybrid con privilegi amministrativi per sviluppare ed eseguire il deployment di proxy API
  • Un account Google SecOps
  • Cloud Logging abilitato e prova a configurare e utilizzare Cloud Logging
  • Una conoscenza delle variabili di flusso di Apigee
  • Conoscenza della norma MessageLogging di Apigee e dell'utilizzo e della configurazione delle norme
  • (Facoltativo) Una conoscenza di come vengono utilizzati i parser Google SecOps per interpretare i log inseriti. I parser SecOps sono integrati per impostazione predefinita per analizzare e comprendere i log Apigee importati dai criteri MessageLogging.
  • Autorizzazioni Google Cloud IAM per utilizzare l'API Cloud Logging e concedere ruoli IAM al account di servizio SecOps

Integrazione di Apigee con SecOps

Se utilizzi Google SecOps come soluzione SIEM, segui questi passaggi per inviare i dati di log di Apigee a SecOps. Esistono due passaggi di base:

  • Configura una norma MessageLogging per inviare i dati di log di Apigee a Cloud Logging
  • Collega il criterio MessageLogging a un proxy Apigee

Una volta completata la configurazione del criterio MessageLogging descritta in questa sezione, i dati di log di Apigee inviati a Cloud Logging verranno analizzati da SecOps. Per informazioni dettagliate sul parser e su come i dati delle variabili di flusso Apigee vengono mappati ai campi di dati SecOps, consulta Integrare Apigee con Google SecOps SIEM. Vedi anche Raccogliere i log di Apigee.

Segui questi passaggi per integrare Apigee con SecOps utilizzando il criterio MessageLogging:

  1. Configura una nuova policy MessageLogging. Vedi Collegamento e configurazione di criteri nell'interfaccia utente.

    Di seguito è riportato un esempio di criterio MessageLogging che invia dati a Cloud Logging. Il criterio specifica un numero elevato di variabili di flusso da inviare a Cloud Logging. Puoi aggiungere o rimuovere le variabili di flusso in base ai campi che ritieni importanti per l'analisi SecOps. Per informazioni su come i dati delle variabili di flusso Apigee vengono mappati ai campi di dati SecOps, vedi Integrare 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>
  2. Allega il criterio come passaggio condizionale in un proxy API. Un'opzione è allegare la policy a una FaultRule in PostFlow, dove in genere vengono generati errori correlati alla sicurezza. Ad esempio:

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

    Ora, quando viene eseguito il proxy API che utilizza questo criterio, i dati di log di Apigee vengono inviati a Google SecOps.

    Un'altra pratica comune consiste nel posizionare il criterio MessageLogging in PostClientFlow della risposta ProxyEndpoint.

    Quando colleghi il criterio MessageLogging al proxy API, tieni presente i seguenti suggerimenti:

    • Inserisci la policy in una FaultRule. FaultRule è la posizione consigliata per registrare le eccezioni di sicurezza e le violazioni dei criteri di sicurezza.
    • Inserisci la policy in PostFlow. PostFlow è un altro luogo adatto per registrare i problemi di sicurezza.
    • Evita di registrare le richieste riuscite. Per il monitoraggio della sicurezza incentrato sulle minacce, in genere vengono registrati i dettagli quando si verifica un problema (viene segnalato un errore). La registrazione di ogni richiesta riuscita con il contenuto completo del messaggio può generare un numero eccessivo di log e aumentare i costi.
    • Prendi in considerazione le variabili personalizzate per determinati casi d'uso. Ad esempio, se devi acquisire l'URI della richiesta originale in un flusso di errori, puoi utilizzare il criterio AssignMessage nel PreFlow della richiesta per copiarlo in una variabile personalizzata (ad esempio original.request.uri) e poi registrare questa variabile nel criterio MessageLogging.

Best practice

Tieni presente queste best practice quando configuri Apigee con Google SecOps:

  • Concentrati sul contesto di sicurezza:registra solo le variabili di flusso che forniscono un contesto prezioso per il monitoraggio della sicurezza e il rilevamento delle minacce. Evita la registrazione eccessiva di dati non correlati alla sicurezza.
  • Utilizza un formato di logging coerente: mantieni un formato di logging coerente in tutti i proxy API che utilizzano SecOps.
  • Utilizza account di servizio sicuri:rispetta le best practice di sicurezza per la gestione e la protezione dell'account di servizio Google Cloud utilizzato per l'importazione di SecOps. Se possibile, limita l'autorizzazione al visualizzatore log.
  • Monitora il feed SecOps:monitora regolarmente l'integrità e lo stato del feed SecOps per assicurarti che i log vengano inseriti correttamente e senza errori.
  • Utilizza regole e dashboard SecOps:una volta che i log pertinenti alla sicurezza si trovano in SecOps, sviluppa regole e dashboard specifiche per rilevare e visualizzare le minacce alla sicurezza in base alle informazioni dettagliate che stai registrando.

Risoluzione dei problemi

Questa sezione descrive diversi possibili problemi che potresti riscontrare durante la configurazione di Apigee con SecOps e le cose da controllare.

Problema: i log degli eventi di sicurezza non vengono visualizzati in Cloud Logging

Aspetti da controllare:

  • Verifica che il criterio MessageLogging sia configurato correttamente con Condition da attivare quando si verifica un evento di sicurezza.
  • Assicurati che il criterio MessageLogging sia collegato al contesto di flusso appropriato, ad esempio a FaultRule o PostFlow.
  • Verifica che Cloud Logging sia abilitato nel tuo progetto Google Cloud.
  • Controlla eventuali messaggi di errore nei log del proxy Apigee relativi al criterio MessageLogging.

Problema: i log degli eventi di sicurezza non vengono visualizzati in SecOps

  • Verifica che il feed SecOps sia configurato correttamente con l'ID progetto, il filtro dei log (assicurandoti che acquisisca i log dalla tua norma di logging della sicurezza) e le credenziali del account di servizio corretti.
  • Controlla lo stato del feed SecOps nell'interfaccia utente di SecOps per verificare la presenza di messaggi di errore o problemi di importazione.
  • Assicurati che l'account di servizio utilizzato da SecOps disponga del ruolo Visualizzatore log nel tuo progetto Google Cloud.
  • Esamina la struttura JSON dei log in Cloud Logging per assicurarti che siano ben formati e contengano i nomi dei campi previsti.
  • Verifica che il parser Google Cloud appropriato sia abilitato.
  • Se sospetti un problema di analisi, esamina una voce di log di esempio nei dati non elaborati di SecOps per vedere come è stata importata prima dell'analisi. Se campi specifici non vengono estratti come previsto, potresti dover esaminare la documentazione del parser SecOps o valutare se è necessario un parser personalizzato.

Integrare Apigee con Google SecOps SIEM

La tabella seguente mappa i nomi delle variabili di flusso Apigee ai nomi dei campi SIEM di Google SecOps equivalenti. Ad esempio, quando visualizzi i dati dei log di Apigee in Cloud Logging, la variabile di flusso client.id viene mappata al campo SIEM di SecOps chiamato principle_ip. Vedi anche Raccogliere i log di Apigee.

Variabile di flusso Apigee Nome del campo SIEM SecOps Descrizione
client.country principal.hostname L'IP host HTTP associato alla richiesta ricevuta da ProxyEndpoint.
client.host principal.location.country_or_region Il paese nel certificato TLS/SSL presentato dall'app client. Richiesta proxy principal.location.country_or_region.
client.ip principle.ip L'indirizzo IP del client o del sistema che invia il messaggio al bilanciatore del carico. Ad esempio, potrebbe trattarsi dell'IP client originale o di un IP del bilanciatore del carico.
client.locality principal.location.city La località (città) nel certificato TLS/SSL presentato dal client.
client.port principal.port La porta HTTP associata alla richiesta del client di origine a ProxyEndpoint.
client.state principal.location.state Lo stato nel certificato TLS/SSL presentato dal client.
organization.name intermediary.cloud.project.name Nome dell'organizzazione Apigee.
proxy.client.ip src.ip L'indirizzo X-Forwarded-For della chiamata in entrata, ovvero l'indirizzo IP ricevuto da Apigee dall'ultimo handshake TCP esterno. Potrebbe trattarsi del client chiamante o di un bilanciatore del carico.
proxy.name intermediary.resource.name L'attributo name configurato per ProxyEndpoint.
proxy.pathsuffix intermediary.resource.attribute.labels[pathsuffix] "Il valore del suffisso del percorso nell'URL inviato dal client e ricevuto in ProxyEndpoint. Il percorso di base è il componente del percorso più a sinistra che identifica in modo univoco un proxy API all'interno di un gruppo di ambienti. Supponiamo di avere un endpoint proxy API configurato con un basepath di /v2/weatherapi. In questo caso, una richiesta inviata a https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282, la variabile proxy.pathsuffix conterrà la stringa /forecastrss."
proxy.url intermediary.url "Restituisce l'URL completo associato alla richiesta proxy ricevuta da ProxyEndpoint, inclusi eventuali parametri di ricerca presenti. Per un esempio che crea un URL di richiesta utilizzando l'host della richiesta originale (anziché l'host del router utilizzato in proxy.url), vedi Accesso ai messaggi di richiesta."
request.uri target.resource.name Il nome di dominio del servizio di destinazione che restituisce la risposta al proxy API.
request.verb network.http.method Il verbo HTTP utilizzato per la richiesta. Ad esempio, GET, PUT e DELETE.
response.content security_result.description Contenuto del payload del messaggio di risposta restituito dalla destinazione.
response.status.code network.http.response_code Il codice di risposta restituito per una richiesta. Puoi utilizzare questa variabile per sostituire il codice di stato della risposta, che è memorizzato in message.status.code. Per saperne di più, consulta il messaggio.
system.region.name intermediary.location.name Il nome della regione del data center in cui è in esecuzione il proxy.
system.timestamp additional.fields[jsonPayload_system_timestamp] L'intero (long) a 64 bit che rappresenta l'ora in cui è stata letta questa variabile. Il valore è il numero di millisecondi trascorsi dalla mezzanotte del 1° gennaio 1970 UTC. Ad esempio, 1534783015000.
system.uuid intermediary.process.pid o intermediary.process.product_specific_process_id L'UUID del processore di messaggi che gestisce il proxy.
target.country target.location.country_or_region Paese del certificato TLS/SSL presentato dal server di destinazione
target.host target.hostname Il nome di dominio del servizio di destinazione che restituisce la risposta al proxy API.
target.ip target.ip L'indirizzo IP del servizio di destinazione che restituisce la risposta al proxy API.
target.locality target.location.city Località (città) del certificato TLS/SSL presentato dal server di destinazione
target.organization target.resource_ancestors.name Organizzazione del certificato TLS/SSL presentato dal server di destinazione.
target.port target.port Il numero di porta del servizio di destinazione che restituisce la risposta al proxy API.
target.scheme target.network.application_protocol Restituisce HTTP o HTTPS a seconda del messaggio di richiesta.
target.state target.location.state Stato del certificato TLS/SSL presentato dal server di destinazione.
target.url target.url L'URL configurato nel file XML TargetEndpoint o l'URL di destinazione dinamico (se target.url è impostato durante il flusso di messaggi). La variabile non include elementi del percorso o parametri di ricerca aggiuntivi. Restituisce null se chiamato al di fuori dell'ambito o altrimenti non impostato.

Nota: utilizza una policy JavaScript collegata a TargetEndpoint per impostare questa variabile.