Esta página se aplica à Apigee e à Apigee híbrida.
Este documento explica como integrar a Apigee ao Google Security Operations (Google SecOps). Se você usa o Google SecOps como solução de SIEM, siga as etapas deste documento para configurar a Apigee e enviar dados de registro para o SecOps.
Para facilitar essa integração, o Google SecOps oferece suporte a um analisador da Apigee para ingerir dados de registro da Apigee. Consulte também Ingerir dados do Google Cloud no Google Security Operations. Depois de concluir as etapas de configuração neste documento, os dados de registro da Apigee vão fluir para o Google SecOps.
Para informações sobre como integrar o SecOps a outras soluções de SIEM, consulte Integrar o Apigee à sua solução de SIEM.
Público-alvo
O público-alvo deste documento inclui:
- Administradores de API responsáveis por garantir a segurança da API, gerenciar as configurações da plataforma, oferecer suporte à eficiência operacional e obedecer aos requisitos de conformidade de segurança.
- Analistas de segurança focados em detectar e investigar proativamente incidentes de segurança relacionados a APIs para minimizar riscos e proteger dados sensíveis.
Visão geral da configuração
A configuração discutida neste documento usa a política MessageLogging da Apigee para enviar uma ampla variedade de dados de registros da Apigee, incluindo variáveis de fluxo específicas, para a SecOps.
O Google SecOps oferece um filtro especial do Cloud Logging que pode enviar tipos de registros específicos, incluindo registros do Apigee, para o Google SecOps em tempo real. O Google SecOps oferece suporte a um analisador da Apigee para ingerir dados de registro da Apigee no Google SecOps. Consulte também Ingerir dados do Google Cloud no Google Security Operations.
Pré-requisitos
Depois que esses pré-requisitos forem atendidos, siga as instruções neste documento para integrar o Apigee à sua instância de SecOps. Antes de começar a integração, verifique se você tem o seguinte:
- Uma conta da Apigee ou da Apigee híbrida com privilégios administrativos para desenvolver e implantar proxies de API
- Uma conta do Google SecOps
- Cloud Logging ativado e experiência na configuração e no uso do Cloud Logging
- Conhecimento das variáveis de fluxo da Apigee
- Conhecimento da política MessageLogging da Apigee e do uso e configuração de políticas em geral
- (Opcional) Entender como os analisadores do Google SecOps são usados para interpretar os registros ingeridos. Por padrão, os analisadores do SecOps são integrados para analisar e entender os registros da Apigee ingeridos pela política MessageLogging.
- Permissões do IAM do Google Cloud para usar a API Cloud Logging e conceder papéis do IAM à conta de serviço do SecOps
Como integrar o Apigee ao SecOps
Se você estiver usando o Google SecOps como solução de SIEM, siga estas etapas para enviar dados de registro do Apigee para o SecOps. Há duas etapas básicas:
- Configurar uma política MessageLogging para enviar dados de registros da Apigee ao Cloud Logging
- Anexar a política MessageLogging a um proxy da Apigee
Quando a configuração da política MessageLogging descrita nesta seção for concluída, os dados de registro da Apigee enviados ao Cloud Logging serão analisados pelo SecOps. Para informações detalhadas sobre o analisador e como os dados de variáveis de fluxo da Apigee são mapeados para campos de dados do SecOps, consulte Integrar a Apigee ao SIEM do Google SecOps. Consulte também Coletar registros da Apigee.
Siga estas etapas para integrar a Apigee à SecOps usando a política MessageLogging:
Configure uma nova política MessageLogging. Consulte Como anexar e configurar políticas na interface.
Confira um exemplo de 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 ao Cloud Logging. Você pode adicionar ou remover variáveis de fluxo conforme quiser, dependendo dos campos que determinar como importantes para sua análise de SecOps. Para informações sobre como os dados de variáveis de fluxo da Apigee são mapeados para campos de dados do SecOps, consulte Integrar a Apigee ao 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>
Anexe a política como uma etapa condicional em um proxy de API. Uma opção é anexar a política a uma FaultRule no PostFlow, em que falhas relacionadas à segurança normalmente são geradas. 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 essa política for executado, os dados de registro da Apigee vão fluir para o Google SecOps.
Outra prática comum é colocar a política MessageLogging no PostClientFlow da resposta ProxyEndpoint.
Considere as seguintes dicas ao anexar a política MessageLogging ao seu proxy de API:
- Coloque a política em uma FaultRule. A FaultRule é o local recomendado para registrar exceções de segurança e violações de política.
- Coloque a política no PostFlow. O PostFlow é outro local adequado para registrar problemas de segurança.
- Evite registrar solicitações bem-sucedidas. Para o monitoramento de segurança focado em ameaças, geralmente você registra detalhes quando algo dá errado (uma falha é levantada). Registrar todas as solicitações bem-sucedidas com o conteúdo completo da mensagem pode gerar registros em excesso e aumentar os custos.
- Considere variáveis personalizadas para determinados casos de uso. Por exemplo, se você precisar capturar o
URI de solicitação original em um fluxo de falha, use a política AssignMessage no PreFlow de solicitação
para copiá-lo em uma variável personalizada (como
original.request.uri
) e registre essa variável na política MessageLogging.
Práticas recomendadas
Considere estas práticas recomendadas ao configurar a Apigee com o Google SecOps:
- Foco no contexto de segurança:registre apenas as variáveis de fluxo que fornecem contexto valioso para monitoramento de segurança e detecção de ameaças. Evite o registro excessivo de dados não relacionados à segurança.
- Use um formato de geração de registros consistente:mantenha um formato de geração de registros consistente em todos os proxies de API que usam SecOps.
- Use contas de serviço seguras:siga as práticas recomendadas de segurança para gerenciar e proteger a conta de serviço do Google Cloud usada para a ingestão de SecOps. Se possível, limite a permissão ao Visualizador de registros.
- Monitore o feed de SecOps:verifique regularmente a integridade e o status do feed para garantir que os registros estejam sendo ingeridos sem erros.
- Use regras e painéis da SecOps:depois que os registros relevantes para a segurança estiverem na SecOps, desenvolva regras e painéis específicos para detectar e visualizar ameaças com base nas informações detalhadas que você está registrando.
Solução de problemas
Nesta seção, descrevemos vários problemas possíveis que podem ocorrer ao configurar a Apigee com o SecOps e o que verificar.
Problema: os registros de eventos de segurança não aparecem no Cloud Logging
O que verificar:
- Verifique se a política MessageLogging está configurada corretamente com o
Condition
para ser acionada quando um ocorrência de segurança ocorrer. - Verifique se a política MessageLogging está anexada ao contexto de fluxo adequado, como uma FaultRule ou PostFlow.
- Verifique se o Cloud Logging está ativado no seu projeto do Google Cloud.
- Analise as mensagens de erro nos registros do proxy da Apigee relacionadas à política MessageLogging.
Problema: os registros de eventos de segurança não aparecem no SecOps
- Verifique se o feed de SecOps está configurado corretamente com o ID do projeto, o filtro de registros (garantindo que ele capture os registros da sua política de geração de registros de segurança) e as credenciais da conta de serviço corretos.
- Verifique o status do seu feed de SecOps na interface do usuário do SecOps para encontrar mensagens de erro ou problemas de ingestão.
- Verifique se a conta de serviço usada pelo SecOps tem o papel de Leitor de registros no projeto do Google Cloud.
Campos relacionados à segurança não analisados corretamente na SecOps
- Revise a estrutura JSON dos seus registros no Cloud Logging para garantir que eles estejam bem formados e contenham os nomes de campo esperados.
- Confirme se o analisador do Google Cloud adequado está ativado.
- Se você suspeitar de um problema de análise, examine uma entrada de registro de amostra nos dados brutos do SecOps para ver como ela foi ingerida antes da análise. Se campos específicos não estiverem sendo extraídos conforme o esperado, talvez seja necessário revisar a documentação do analisador do SecOps ou considerar se um analisador personalizado é necessário.
Integrar o Apigee ao SIEM do Google SecOps
A tabela a seguir mapeia os nomes de variáveis de fluxo da Apigee para os nomes de campos equivalentes do SIEM do Google SecOps. Por exemplo, ao visualizar dados de registro da Apigee no Cloud Logging, a variável de fluxo client.id
é mapeada para o campo do SIEM de SecOps chamado principle_ip
. Consulte também Coletar registros da Apigee.
Variável de fluxo da Apigee | Nome do campo do SIEM de SecOps | Descrição |
---|---|---|
client.country | principal.hostname | O IP do host HTTP associado à solicitação recebida pelo ProxyEndpoint. |
client.host | principal.location.country_or_region | O país no certificado TLS/SSL apresentado pelo app cliente. Solicitação de proxy
principal.location.country_or_region . |
client.ip | principle.ip | O endereço IP do cliente ou sistema que envia a mensagem para o balanceador de carga. Por exemplo, pode ser o IP original do cliente 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 à solicitação do cliente de origem para o 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 da Apigee. |
proxy.client.ip | src.ip | O endereço X-Forwarded-For da chamada de entrada, que é o endereço IP recebido pela Apigee
do último handshake TCP externo. Pode ser o cliente que faz a chamada ou um balanceador de carga. |
proxy.name | intermediary.resource.name | O atributo nome 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 em um grupo de ambiente. Suponha que você tenha um endpoint de proxy de API configurado com um caminho base de /v2/weatherapi. Nesse caso, uma solicitação enviada para https://myhost.example.net/v2/weatherapi/forecastrss?w=12797282, a variável proxy.pathsuffix vai conter a string /forecastrss." |
proxy.url | intermediary.url | "Recebe o URL completo associado à solicitação de proxy recebida pelo ProxyEndpoint, incluindo todos os parâmetros de consulta presentes. Para ver um exemplo que cria um URL de solicitação usando o host de solicitação original (em vez do host de roteador usado em proxy.url), consulte Acessar mensagens de solicitação". |
request.uri | target.resource.name | O nome de domínio do serviço de destino que retorna a resposta ao proxy de API. |
request.verb | O verbo HTTP usado para a solicitação. Por exemplo, GET, PUT e DELETE. | |
response.content | Conteúdo de payload da mensagem de resposta retornada pelo destino. | |
response.status.code | O código de resposta retornado para uma solicitação. Use essa variável para substituir o código de status de resposta, armazenado em message.status.code. Para mais informações, consulte message. | |
system.region.name | intermediary.location.name | O nome da região do data center em que o proxy está sendo executado. |
system.timestamp | O inteiro de 64 bits (longo) que representa o momento em que essa 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 | O nome de domínio do serviço de destino que retorna a resposta ao proxy de API. | |
target.ip | O endereço IP do serviço de destino que retorna a resposta ao proxy de API. | |
target.locality | target.location.city | Localidade (cidade) do certificado TLS/SSL apresentado pelo servidor de destino |
target.organization | Organização do certificado TLS/SSL apresentado pelo servidor de destino. | |
target.port | O número da porta do serviço de destino que retorna a resposta ao proxy de API. | |
target.scheme | Retorna HTTP ou HTTPS, dependendo da mensagem de solicitação. | |
target.state | target.location.state | Estado do certificado TLS/SSL apresentado pelo servidor de destino. |
target.url | É o URL configurado no arquivo XML TargetEndpoint ou no URL de destino dinâmico (se target.url
estiver definido durante o fluxo da mensagem). A variável não inclui outros elementos de caminho
ou parâmetros de consulta. Retorna nulo se chamado fora do escopo ou não definido. Observação: use uma política de JavaScript anexada ao TargetEndpoint para definir essa variável. |