Integre o Apigee com o Google SecOps

Esta página aplica-se ao Apigee e ao Apigee Hybrid.

Este documento explica como integrar o Apigee com o Google Security Operations (Google SecOps). Se usar o Google SecOps como solução SIEM, siga os passos neste documento para configurar o Apigee de modo a enviar dados de registo para o SecOps.

Para facilitar esta integração, o Google SecOps suporta um analisador do Apigee para carregar dados de registo do Apigee. Consulte também o artigo Carregue dados do Google Cloud para o Google Security Operations. Depois de concluir os passos de configuração neste documento, os dados de registo do Apigee fluem para o Google SecOps.

Para obter informações sobre como integrar o SecOps com outras soluções SIEM, consulte o artigo Integre o Apigee com a sua solução SIEM.

Público-alvo

O público-alvo deste documento inclui:

  • Administradores de APIs responsáveis por garantir a segurança das APIs, gerir as configurações da plataforma, apoiar a eficiência operacional e cumprir os requisitos de conformidade de segurança.
  • Analistas de segurança focados na deteção e investigação proativas de incidentes de segurança relacionados com APIs para minimizar o risco e proteger dados confidenciais.

Vista geral da configuração

A configuração abordada neste documento usa a política MessageLogging do Apigee para enviar uma vasta gama de dados de registo do Apigee, incluindo variáveis de fluxo específicas, para o SecOps.

O Google SecOps fornece um filtro especial do Cloud Logging que pode enviar tipos de registos específicos, incluindo registos do Apigee, para o Google SecOps em tempo real. O Google SecOps suporta um analisador do Apigee para carregar dados de registo do Apigee para o Google SecOps. Consulte também o artigo Carregue dados do Google Cloud para o Google Security Operations.

Pré-requisitos

Quando estes pré-requisitos forem cumpridos, siga as instruções neste documento para integrar o Apigee com a sua instância do SecOps. Antes de começar a integração, certifique-se de que tem o seguinte:

  • Uma conta do Apigee ou do Apigee Hybrid com privilégios administrativos para desenvolver e implementar proxies de API
  • Uma conta do Google SecOps
  • Cloud Logging ativado e experiência de configuração e utilização do Cloud Logging
  • Conhecimento das variáveis de fluxo do Apigee
  • Conhecimento da política MessageLogging do Apigee e da utilização e configuração de políticas gerais
  • (Opcional) Compreender como os analisadores do Google SecOps são usados para interpretar registos carregados. Por predefinição, os analisadores do SecOps são incorporados para analisar e compreender os registos do Apigee carregados pela política MessageLogging.
  • Autorizações do Google Cloud IAM para usar a API Cloud Logging e conceder funções do IAM à conta de serviço do SecOps

Integração do Apigee com o SecOps

Se estiver a usar o Google SecOps como solução SIEM, siga estes passos para enviar dados de registo do Apigee para o SecOps. Existem dois passos básicos:

  • Configure uma política MessageLogging para enviar dados de registo do Apigee para o Cloud Logging
  • Anexe a política MessageLogging a um proxy do Apigee

Quando a configuração da política MessageLogging descrita nesta secção estiver concluída, os dados de registo do Apigee enviados para o Cloud Logging são analisados pelo SecOps. Para ver informações detalhadas sobre o analisador e como os dados das variáveis de fluxo do Apigee são mapeados para os campos de dados do SecOps, consulte o artigo Integre o Apigee com o SIEM do Google SecOps. Consulte também o artigo Recolha registos do Apigee.

Siga estes passos para integrar o Apigee com o SecOps através da política MessageLogging:

  1. Configure uma nova política MessageLogging. Consulte o artigo Anexar e configurar políticas na IU.

    Segue-se um exemplo de uma política MessageLogging que envia dados para o Cloud Logging. A política especifica um grande número de variáveis de fluxo a serem enviadas para o Cloud Logging. Pode adicionar ou remover variáveis de fluxo conforme quiser, consoante os campos que determinar serem importantes para a sua análise de SecOps. Para informações sobre como os dados das variáveis de fluxo do Apigee são mapeados para os campos de dados do SecOps, consulte o artigo Integre o Apigee com o SIEM do 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. Anexe a política como um passo condicional num proxy de API. Uma opção é anexar a política numa FaultRule no PostFlow, onde os erros relacionados com a segurança são normalmente apresentados. Por exemplo:

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

    Agora, quando o proxy de API que usa esta política é executado, os dados de registo do Apigee fluem para o Google SecOps.

    Outra prática comum é colocar a política MessageLogging no PostClientFlow da resposta ProxyEndpoint.

    Considere o seguinte conselho quando anexar a política MessageLogging ao seu proxy de API:

    • Coloque a política numa FaultRule. FaultRule é a localização recomendada para registar exceções de segurança e violações de políticas.
    • Coloque a política no PostFlow. O PostFlow é outro local adequado para registar problemas de segurança.
    • Evite registar pedidos bem-sucedidos. Para a monitorização de segurança focada em ameaças, normalmente, regista detalhes quando algo corre mal (é gerada uma falha). O registo de cada pedido bem-sucedido com o conteúdo completo da mensagem pode gerar registos excessivos e aumentar os custos.
    • Considere as variáveis personalizadas para determinados exemplos de utilização. Por exemplo, se precisar de capturar o URI do pedido original num fluxo de falhas, pode usar a política AssignMessage no PreFlow do pedido para o copiar para uma variável personalizada (como original.request.uri) e, em seguida, registar essa variável na política MessageLogging.

Práticas recomendadas

Tenha em atenção estas práticas recomendadas ao configurar o Apigee com o Google SecOps:

  • Focar-se no contexto de segurança: registe apenas as variáveis de fluxo que fornecem contexto valioso para a monitorização da segurança e a deteção de ameaças. Evite o registo excessivo de dados não relacionados com a segurança.
  • Use um formato de registo consistente: mantenha um formato de registo consistente nos seus proxies de API que usam o SecOps.
  • Use contas de serviço seguras: siga as práticas recomendadas de segurança para gerir e proteger a conta de serviço do Google Cloud usada para o carregamento do SecOps. Se possível, limite a autorização ao leitor de registos.
  • Monitorize o feed de SecOps: monitorize regularmente o estado e o estado de funcionamento do seu feed de SecOps para garantir que os registos estão a ser carregados com êxito e sem erros.
  • Use regras e painéis de controlo do SecOps: assim que os registos relevantes para a segurança estiverem no SecOps, desenvolva regras e painéis de controlo específicos para detetar e visualizar ameaças de segurança com base nas informações detalhadas que está a registar.

Resolução de problemas

Esta secção descreve vários problemas possíveis que pode encontrar ao configurar o Apigee com o SecOps e aspetos a verificar.

Problema: os registos de eventos de segurança não aparecem no Cloud Logging

Aspetos a verificar:

  • Verifique se a sua política MessageLogging está configurada corretamente com o Condition para ser acionada quando ocorre um evento de segurança.
  • Certifique-se de que a política MessageLogging está anexada ao contexto de fluxo adequado, como um FaultRule ou PostFlow.
  • Verifique se o Cloud Logging está ativado no seu projeto do Google Cloud.
  • Reveja todas as mensagens de erro nos registos do proxy do Apigee relacionadas com a política MessageLogging.

Problema: os registos de eventos de segurança não aparecem no SecOps

  • Verifique se o seu feed do SecOps está configurado corretamente com o ID do projeto, o filtro de registo (garantindo que capta os registos da sua política de registo de segurança) e as credenciais da conta de serviço corretos.
  • Verifique o estado do seu feed do SecOps na IU do SecOps para ver mensagens de erro ou problemas de carregamento.
  • Certifique-se de que a conta de serviço usada pelo SecOps tem a função Leitor de registos no seu projeto do Google Cloud.
  • Reveja a estrutura JSON dos seus registos no Cloud Logging para garantir que têm um formato correto e contêm os nomes dos campos esperados.
  • Confirme que o analisador do Google Cloud adequado está ativado.
  • Se suspeitar de um problema de análise, examine uma entrada de registo de exemplo nos dados não processados do SecOps para ver como foi carregada antes da análise. Se campos específicos não estiverem a ser extraídos como esperado, pode ter de rever a documentação do analisador SecOps ou considerar se é necessário um analisador personalizado.

Integre o Apigee com o SIEM do Google SecOps

A tabela seguinte mapeia os nomes das variáveis de fluxo do Apigee para os nomes dos campos do SIEM do Google SecOps equivalentes. Por exemplo, quando visualiza dados de registo do Apigee no Cloud Logging, a client.idvariável de fluxo é mapeada para o campo do SIEM do SecOps denominado principle_ip. Consulte também o artigo Recolha registos do Apigee.

Variável de fluxo do Apigee Nome do campo do SIEM do SecOps Descrição
client.country principal.hostname O IP do anfitrião HTTP associado ao pedido recebido pelo ProxyEndpoint.
client.host principal.location.country_or_region O país no certificado TLS/SSL apresentado pela app cliente. Pedido de proxy principal.location.country_or_region.
client.ip principle.ip O endereço IP do cliente ou do sistema que envia a mensagem para o equilibrador de carga. Por exemplo, pode ser o IP do cliente original ou um IP do balanceador de carga.
client.locality principal.location.city A localidade (cidade) no certificado TLS/SSL apresentado pelo cliente.
client.port principal.port A porta HTTP associada ao pedido do cliente de origem ao ProxyEndpoint.
client.state principal.location.state O estado no certificado TLS/SSL apresentado pelo cliente.
organization.name intermediary.cloud.project.name Nome da organização do Apigee.
proxy.client.ip src.ip O endereço X-Forwarded-For da chamada recebida, que é o endereço IP que o Apigee recebeu do último handshake TCP externo. Pode ser o cliente de chamadas ou um equilibrador de carga.
proxy.name intermediary.resource.name O atributo name configurado para o ProxyEndpoint.
proxy.pathsuffix intermediary.resource.attribute.labels[pathsuffix] "O valor do sufixo do caminho no URL que é enviado do cliente e recebido no ProxyEndpoint. O caminho base é o componente do caminho mais à esquerda que identifica exclusivamente um proxy de API num grupo de ambientes. Suponhamos que tem um ponto final do proxy de API configurado com um caminho base de /v2/weatherapi. Nesse caso, um pedido enviado para https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282, a variável proxy.pathsuffix vai conter a string /forecastrss".
proxy.url intermediary.url "Obtém o URL completo associado ao pedido de proxy recebido pelo ProxyEndpoint, incluindo quaisquer parâmetros de consulta presentes. Para ver um exemplo que cria um URL de pedido usando o anfitrião do pedido original (em vez do anfitrião do router usado em proxy.url), consulte Aceder a mensagens de pedido."
request.uri target.resource.name O nome do domínio do serviço de destino que devolve a resposta ao proxy de API.
request.verb network.http.method O verbo HTTP usado para o pedido. Por exemplo, GET, PUT e DELETE.
response.content security_result.description Conteúdo do payload da mensagem de resposta devolvida pelo destino.
response.status.code network.http.response_code O código de resposta devolvido para um pedido. Pode usar esta variável para substituir o código de estado da resposta, que está armazenado em message.status.code. Para mais informações, consulte a mensagem.
system.region.name intermediary.location.name O nome da região do centro de dados onde o proxy está a ser executado.
system.timestamp additional.fields[jsonPayload_system_timestamp] O número inteiro de 64 bits (longo) que representa a hora em que esta variável foi lida. O valor é o número de milissegundos decorridos desde a meia-noite de 1 de janeiro de 1970 UTC. Por exemplo, 1534783015000.
system.uuid intermediary.process.pid ou intermediary.process.product_specific_process_id O UUID do processador de mensagens que processa o proxy.
target.country target.location.country_or_region País do certificado TLS/SSL apresentado pelo servidor de destino
target.host target.hostname O nome do domínio do serviço de destino que devolve a resposta ao proxy de API.
target.ip target.ip O endereço IP do serviço de destino que devolve a resposta ao proxy de API.
target.locality target.location.city Localidade (cidade) do certificado TLS/SSL apresentado pelo servidor de destino
target.organization target.resource_ancestors.name Organização do certificado TLS/SSL apresentado pelo servidor de destino.
target.port target.port O número da porta do serviço de destino que devolve a resposta ao proxy da API.
target.scheme target.network.application_protocol Devolve HTTP ou HTTPS, consoante a mensagem de pedido.
target.state target.location.state Estado do certificado TLS/SSL apresentado pelo servidor de destino.
target.url target.url O URL configurado no ficheiro XML TargetEndpoint ou o URL de destino dinâmico (se target.url estiver definido durante o fluxo de mensagens). A variável não inclui elementos de caminho adicionais nem parâmetros de consulta. Devolve o valor nulo se for chamado fora do âmbito ou se não estiver definido.

Nota: use uma política JavaScript anexada ao TargetEndpoint para definir esta variável.