Coletar registros do Gateway de Aplicativo do Azure
Este documento explica como coletar registros do Application Gateway do Azure configurando um feed do Google Security Operations. Esse analisador processa estruturas JSON de registro único e múltiplo, extrai campos da matriz "records", realiza conversões de tipo de dados, mapeia campos para a UDM e enriquece os dados com metadados e campos derivados, como o tipo de conexão de rede. Ele também processa uma lógica específica para diferentes valores de operationName
, extraindo endereços IP, sub-redes e outros detalhes de configuração relevantes.
Antes de começar
Verifique se você atende aos seguintes pré-requisitos:
- Instância do Google SecOps
- Acesso privilegiado a uma assinatura do Azure
- Um ambiente (locatário) de gateway de aplicativo do Azure no Azure
Configurar a conta de armazenamento do Azure
- No console do Azure, pesquise Contas de armazenamento.
- Clique em Criar.
- Especifique valores para os seguintes parâmetros de entrada:
- Assinatura: selecione a assinatura.
- Grupo de recursos: selecione o grupo de recursos.
- Região: selecione a região.
- Performance: selecione a performance (padrão recomendado).
- Redundância: selecione a redundância (GRS ou LRS recomendado).
- Nome da conta de armazenamento: insira um nome para a nova conta de armazenamento.
- Clique em Revisar + criar.
- Revise a visão geral da conta e clique em Criar.
- Na página Visão geral da conta de armazenamento, selecione o submenu Chaves de acesso em Segurança + rede.
- Clique em Mostrar ao lado de key1 ou key2.
- Clique em Copiar para a área de transferência para copiar a chave.
- Salve a chave em um local seguro para uso posterior.
- Na página Visão geral da conta de armazenamento, selecione o submenu Endpoints em Configurações.
- Clique em Copiar para a área de transferência para copiar o URL do endpoint do serviço de blob. Por exemplo,
https://<storageaccountname>.blob.core.windows.net
. - Salve o URL do endpoint em um local seguro para uso posterior.
Como configurar o Gateway de aplicativo do Azure
- Faça login no portal do Azure.
- Acesse o grupo de recursos desejado.
- Selecione Gateway de aplicativo (a janela Gateway de aplicativo vai aparecer).
- Na seção Monitoring, selecione Configurações de diagnóstico > Ativar diagnóstico.
- Selecione Adicionar configuração de diagnóstico. A janela Configurações de diagnóstico mostra as configurações dos registros de diagnóstico.
- Na seção log, faça o seguinte:
- Marque a caixa de seleção ApplicationGatewayAccessLog.
- Marque a caixa de seleção ApplicationGatewayFirewallLog.
- Para armazenar registros na conta de armazenamento, faça o seguinte:
- Marque a caixa de seleção Arquivar em uma conta de armazenamento.
- Na lista Assinatura, selecione uma assinatura.
- Na lista Conta de armazenamento, selecione uma conta de armazenamento.
Configurar feeds
Há dois pontos de entrada diferentes para configurar feeds na plataforma do Google SecOps:
- Configurações do SIEM > Feeds
- Central de conteúdo > Pacotes de conteúdo
Configure feeds em Configurações do SIEM > Feeds
Para configurar vários feeds para diferentes tipos de registros nessa família de produtos, consulte Configurar feeds por produto.
Para configurar um único feed, siga estas etapas:
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo, Registros do Application Gateway do Azure).
- Selecione Microsoft Azure Blob Storage como o Tipo de origem.
- Selecione "Azure Application Gateway" como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URI do Azure: o URL do endpoint do blob.
ENDPOINT_URL/BLOB_NAME
- Substitua:
ENDPOINT_URL
: o URL do endpoint do blob. (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: o nome do blob. (comoinsights-logs-<logname>
)
- Substitua:
- URI é um: selecione o TIPO DE URI de acordo com a configuração do fluxo de registros (Arquivo único | Diretório | Diretório que inclui subdiretórios).
- Opções de exclusão de origem: selecione a opção de exclusão de acordo com suas preferências de ingestão.
- Chave compartilhada: a chave de acesso ao Azure Blob Storage.
- Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
- URI do Azure: o URL do endpoint do blob.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Configurar feeds na Central de conteúdo
Especifique valores para os seguintes campos:
- URI do Azure: o URL do endpoint do blob.
ENDPOINT_URL/BLOB_NAME
- Substitua:
ENDPOINT_URL
: o URL do endpoint do blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: o nome do blob (por exemplo,insights-logs-<logname>
)
- Substitua:
- URI é um: selecione o TIPO DE URI de acordo com a configuração do fluxo de registros (Arquivo único | Diretório | Diretório que inclui subdiretórios).
- Opções de exclusão de origem: selecione a opção de exclusão de acordo com suas preferências de ingestão.
- Chave compartilhada: a chave de acesso ao Azure Blob Storage.
Opções avançadas
- Nome do feed: um valor pré-preenchido que identifica o feed.
- Tipo de origem: método usado para coletar registros no Google SecOps.
- Namespace do recurso: namespace associado ao feed.
- Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
Category |
metadata.product_event_type |
Mapeado diretamente do campo Category . |
ClientOperationId |
additional.fields[].key:"ClientOperationId", value.string_value |
Mapeado diretamente do campo ClientOperationId . |
CorrelationRequestId |
additional.fields[].key:"CorrelationRequestId", value.string_value |
Mapeado diretamente do campo CorrelationRequestId . |
GatewayManagerVersion |
additional.fields[].key:"GatewayManagerVersion", value.string_value |
Mapeado diretamente do campo GatewayManagerVersion . |
category |
metadata.product_event_type |
Mapeado diretamente do campo category . |
level |
security_result.severity |
Mapeado diretamente do campo level e convertido para maiúsculas. Se o valor for "WARNING", a gravidade será definida como "HIGH" e security_result.severity_details será definido como o valor original. |
properties.clientIP |
principal.ip , principal.asset.ip |
Mapeado diretamente do campo properties.clientIP . |
properties.clientPort |
principal.port |
Mapeado diretamente do campo properties.clientPort e convertido em um número inteiro. |
properties.clientResponseTime |
additional.fields[].key:"clientResponseTime", value.string_value |
Mapeado diretamente do campo properties.clientResponseTime . |
properties.configuration.BgpConfiguration.GatewayConfig.Asn |
security_result.detection_fields[].key:"ASN", value |
Mapeado diretamente do campo properties.configuration.BgpConfiguration.GatewayConfig.Asn quando operationName é "SetGatewayConfiguration". |
properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress |
target.ip , target.asset.ip |
Mapeado diretamente do campo properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress quando operationName é "SetGatewayConfiguration". |
properties.configuration.BgpConfiguration.GatewayConfig.PeerType |
security_result.detection_fields[].key:"PeerType", value |
Mapeado diretamente do campo properties.configuration.BgpConfiguration.GatewayConfig.PeerType quando operationName é "SetGatewayConfiguration". |
properties.configuration.IkeVersion |
principal.resource.attribute.labels[].key:"ike_version", value |
Mapeado diretamente do campo properties.configuration.IkeVersion quando operationName é "SetConnectionConfiguration". |
properties.configuration.LocalSubnets |
principal.resource.attribute.labels[].key:"local subnets", value |
String concatenada de endereços IP da matriz properties.configuration.LocalSubnets quando operationName é "SetConnectionConfiguration". |
properties.configuration.LocalTunnelEndpoint |
principal.ip , principal.asset.ip |
Mapeado diretamente do campo properties.configuration.LocalTunnelEndpoint quando operationName é "SetConnectionConfiguration". |
properties.configuration.Name |
principal.hostname , principal.asset.hostname |
Mapeado diretamente do campo properties.configuration.Name . Se estiver vazio, o valor será extraído de properties.instance . |
properties.configuration.RemoteSite |
target.hostname , target.asset.hostname |
Mapeado diretamente do campo properties.configuration.RemoteSite . |
properties.configuration.RemoteSubnets |
principal.resource.attribute.labels[].key:"remote subnets", value |
String concatenada de endereços IP da matriz properties.configuration.RemoteSubnets quando operationName é "SetConnectionConfiguration". |
properties.configuration.RemoteTunnelEndpoint |
target.ip , target.asset.ip |
Mapeado diretamente do campo properties.configuration.RemoteTunnelEndpoint quando operationName é "SetConnectionConfiguration". |
properties.configuration.VIPAddress |
principal.ip , principal.asset.ip |
Mapeado diretamente do campo properties.configuration.VIPAddress quando operationName é "SetGatewayConfiguration". |
properties.configuration.VirtualNetworkRanges |
principal.resource.attribute.labels[].key:"virutal network ranges", value |
String concatenada de endereços IP da matriz properties.configuration.VirtualNetworkRanges quando operationName é "SetGatewayConfiguration". |
properties.configuration.VirtualNetworkSubnets |
principal.resource.attribute.labels[].key:"virtual network subnets", value |
String concatenada de endereços IP da matriz properties.configuration.VirtualNetworkSubnets quando operationName é "SetGatewayConfiguration". |
properties.error_info |
additional.fields[].key:"error_info", value.string_value |
Mapeado diretamente do campo properties.error_info . |
properties.host |
principal.hostname , principal.asset.hostname |
Mapeado diretamente do campo properties.host se properties.originalHost estiver vazio. |
properties.httpMethod |
network.http.method |
Mapeado diretamente do campo properties.httpMethod . |
properties.httpStatus |
network.http.response_code |
Mapeado diretamente do campo properties.httpStatus e convertido em um número inteiro. |
properties.httpVersion |
network.application_protocol |
Definido como "HTTP" se o campo properties.httpVersion contiver "HTTP". |
properties.instance |
principal.hostname , principal.asset.hostname |
Usado como o valor de principal.hostname se properties.configuration.Name estiver vazio. |
properties.message |
metadata.description |
Mapeado diretamente do campo properties.message . |
properties.operationName |
additional.fields[].key:"operationName", value.string_value |
Mapeado diretamente do campo properties.operationName . |
properties.operationStatus |
security_result.category_details |
Mapeado diretamente do campo properties.operationStatus . Se o valor for "Success" ou "InProgress", security_result.action será definido como "ALLOW". |
properties.originalHost |
principal.hostname , principal.asset.hostname |
Mapeado diretamente do campo properties.originalHost . |
properties.originalRequestUriWithArgs |
additional.fields[].key:"originalRequestUriWithArgs", value.string_value |
Mapeado diretamente do campo properties.originalRequestUriWithArgs . |
properties.receivedBytes |
network.received_bytes |
Mapeado diretamente do campo properties.receivedBytes e convertido em um número inteiro sem sinal. |
properties.requestQuery |
additional.fields[].key:"requestQuery", value.string_value |
Mapeado diretamente do campo properties.requestQuery . |
properties.requestUri |
target.url |
Mapeado diretamente do campo properties.requestUri . |
properties.sentBytes |
network.sent_bytes |
Mapeado diretamente do campo properties.sentBytes e convertido em um número inteiro sem sinal. |
properties.serverResponseLatency |
additional.fields[].key:"Server Response Latency", value.string_value |
Mapeado diretamente do campo properties.serverResponseLatency . |
properties.serverRouted |
target.ip , target.asset.ip , target.port |
O IP e a porta são extraídos do campo properties.serverRouted usando uma expressão regular. |
properties.sslCipher |
network.tls.cipher |
Mapeado diretamente do campo properties.sslCipher . |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
Mapeado diretamente do campo properties.sslClientCertificateIssuerName . |
properties.sslProtocol |
network.tls.version |
Mapeado diretamente do campo properties.sslProtocol . |
properties.timeTaken |
additional.fields[].key:"timeTaken", value.string_value |
Mapeado diretamente do campo properties.timeTaken . |
properties.transactionId |
network.session_id |
Mapeado diretamente do campo properties.transactionId . |
properties.userAgent |
network.http.user_agent , network.http.parsed_user_agent |
Mapeado diretamente do campo properties.userAgent . Além disso, o campo é convertido em um user agent analisado e mapeado para network.http.parsed_user_agent . |
properties.WAFEvaluationTime |
additional.fields[].key:"WAFEvaluationTime", value.string_value |
Mapeado diretamente do campo properties.WAFEvaluationTime . |
properties.WAFMode |
additional.fields[].key:"WAFMode", value.string_value |
Mapeado diretamente do campo properties.WAFMode . |
resourceId |
target.resource.id |
Mapeado diretamente do campo resourceId . |
resourceid |
target.resource.product_object_id |
Mapeado diretamente do campo resourceid . |
ruleName |
security_result.rule_name |
Mapeado diretamente do campo ruleName . |
time / timeStamp |
metadata.event_timestamp , timestamp |
Analisado como um carimbo de data/hora usando o formato RFC 3339 ou ISO8601. Recomendamos usar timeStamp , mas time será usado se timeStamp não estiver presente. |
(Lógica do analisador) | metadata.event_type |
Definido como "NETWORK_CONNECTION" se o principal e o destino estiverem presentes, "STATUS_UPDATE" se apenas o principal estiver presente e "GENERIC_EVENT" caso contrário. |
(Lógica do analisador) | metadata.product_name |
Defina como "Gateway do Azure". |
(Lógica do analisador) | metadata.vendor_name |
Defina como "Microsoft". |
(Lógica do analisador) | has_principal |
Uma flag booleana definida como "true" se alguma informação principal (nome do host, IP ou porta) for extraída e "false" caso contrário. |
(Lógica do analisador) | has_target |
Uma flag booleana definida como "true" se alguma informação de destino (nome do host, IP, porta, ID do recurso ou URL) for extraída e "false" caso contrário. |
(Lógica do analisador) | disambiguation_key |
Adicionado quando vários eventos são extraídos de uma única entrada de registro. |