Logs
Consulte cada campo que um log de report do Bot Manager carrega, os valores de classificação que ele registra e onde cada log aparece.
O Bot Manager escreve um log de report. Cada linha é um objeto JSON que nomeia a requisição, a pontuação que a função calculou para ela, as regras que a requisição correspondeu e a ação que a função aplicou. O argumento internal_logs define para quais requisições a função escreve uma linha, e log_tag define a tag que identifica a instância de onde a linha veio. Para mais informações, consulte Argumentos.
As duas edições não escrevem o mesmo payload. O Bot Manager Lite escreve 14 campos, e o Bot Manager documenta 25. Uma linha lida de uma instância Lite não é uma linha da edição completa com campos faltando.
Esta página lista os campos que cada edição escreve, os valores que classified e bot_category assumem, o que o veredito de avaliação pendente significa, onde cada log aparece e por quanto tempo cada dataset é retido.
Campos
Toda linha de report abre com o mesmo prefixo e depois um único objeto JSON. O prefixo é [Bot-Protection][<log_tag>] Report:, onde o segundo colchete carrega o valor do argumento log_tag da instância. O host não está no prefixo. Ele é um campo dentro do objeto, então o prefixo identifica a instância que escreveu a linha e nada mais sobre a requisição.
Campos do Bot Manager Lite
Uma linha do Bot Manager Lite, de uma instância com a tag storefront-bots:
O Bot Manager Lite escreve estes 14 campos, e escreve os 14 em toda linha:
| Campo | Tipo | O que carrega |
|---|---|---|
action | string | A ação que a função aplicou. É allow sempre que a pontuação não alcança o threshold e a função não identifica ataque, e do contrário é o valor que o argumento action carrega |
asn | string | O ASN por onde a requisição veio |
bot_category | string | As categorias das regras que a requisição correspondeu, unidas por vírgula |
classified | string | O veredito a que a função chegou. Os quatro valores estão listados em Classificação |
fingerprint | string | O identificador que a Azion deriva para o cliente por trás da requisição, em quatro segmentos separados por sublinhado |
geoip_country | string | O código do país de onde a requisição veio |
geoip_region | string | O código da região de onde a requisição veio |
host | string | O host para o qual a requisição foi feita |
http_user_agent | string | O cabeçalho User-Agent que a requisição enviou, vazio quando a requisição não enviou nenhum |
matched_rules | array de números | Os IDs das regras que a requisição correspondeu |
remote_addr | string | O endereço IP que iniciou a requisição |
request_id | string | O identificador único da requisição |
request_uri | string | A URI da requisição |
score | number | A pontuação que a função calculou para a requisição |
O Bot Manager Lite não carrega um campo log_tag, porque o prefixo já nomeia a instância. Ele também não carrega array de cabeçalhos, campo de CAPTCHA nem campo de cookie. A pontuação é a soma dos incrementos das regras em matched_rules, que a tabela de regras publica uma a uma. Para mais informações, consulte Bot Manager Lite.
Campos do Bot Manager
O Bot Manager documenta 25 campos. Dez deles, e o tipo de mais dois, são a diferença entre as duas edições:
| Campo | Tipo | O que carrega |
|---|---|---|
action | string | A ação que a função aplicou. É allow sempre que a pontuação não alcança o threshold e a função não identifica ataque, e do contrário é o valor que o argumento action carrega |
asn | string | O ASN por onde a requisição veio |
azion_fingerprint | string | O fingerprint que a Azion identificou para a requisição |
bot_category | string | A categoria em que a requisição melhor se encaixa. Os valores estão listados em Classificação |
bot_characteristics | array de strings | Cada categoria de violação de regra estática e cada ataque que a requisição correspondeu |
bot_mode | string | O modo em que a função pontuou a requisição |
bytes_sent | number | O Content-Length da requisição |
challenge_solved | boolean | Se o cliente resolveu um desafio de CAPTCHA. Ele reporta um valor apenas onde uma função de CAPTCHA é executada ao lado do Bot Manager |
classified | string | O veredito a que a função chegou. Os quatro valores estão listados em Classificação |
disabled_matched_rules | array de números | Os IDs das regras estáticas desabilitadas que a requisição correspondeu. Uma regra desabilitada que corresponde não soma nada à pontuação |
engine_version | number | O engine que identificou o cliente. Está presente apenas onde as regras dinâmicas estão ligadas |
geoip_country | string | O código do país de onde a requisição veio |
geoip_region | string | O nome da região de onde a requisição veio |
host | string | O host para o qual a requisição foi feita |
http_user_agent | string | O cabeçalho User-Agent que a requisição enviou |
log_tag | string | A tag que identifica a instância de onde a linha veio, definida pelo argumento log_tag |
matched_rules | array de números | Os IDs das regras estáticas habilitadas que a requisição correspondeu |
persist_cookies | boolean | Se a função encontra o cliente guardando os cookies de proteção contra bots |
remote_addr | string | O endereço IP que iniciou a requisição |
request_headers | array de strings | Cada cabeçalho nomeado no argumento log_headers que não está na lista de proibidos, escrito como key value com o valor em base64 |
request_id | string | O identificador único da requisição |
request_method | string | O método da requisição |
request_uri | string | A URI da requisição |
score | number | A pontuação que a função calculou para a requisição |
sent_http_content_type | string | O cabeçalho Content-Type que a requisição enviou |
Mais uma chave, concat_headers, aparece em um objeto de report do Bot Manager sem definição publicada. O seu valor é uma lista de nomes de cabeçalho separados por vírgula.
request_headers é limitado. Cada chave e cada valor descontam de um total de 10.000 caracteres, e depois que esse total é alcançado nenhum outro cabeçalho é escrito no array. O valor de um cabeçalho é codificado em base64, então bnVsbA== no array é a codificação de null, que é o que um cabeçalho que a requisição não enviou decodifica. Para mais informações, consulte Limites de Firewall.
Dois campos apontam para a configuração, não para a requisição. Uma instância que não define log_tag recebe a tag do host para o qual a requisição foi feita, então duas instâncias que mantêm o padrão entregue são indistinguíveis no log. O fingerprint é o identificador que a Azion deriva para um cliente, o que o torna o campo que agrupa as requisições repetidas de um dispositivo. O Bot Manager consolida os dados de fingerprint entre requisições e a GraphQL API os devolve, então você pode agir sobre um dispositivo ou usuário identificado como bad bot em um threshold, em vez de sobre uma única requisição.
Classificação
Dois campos carregam o veredito, e eles são calculados de formas diferentes. classified compara a pontuação com o threshold em vigor. bot_category nomeia as categorias das regras que a requisição correspondeu, qualquer que seja o veredito.
classified é, portanto, relativo, e não uma propriedade da requisição por si só. A mesma pontuação, das mesmas regras, é classificada de dois jeitos sob dois thresholds:
score | matched_rules | threshold | classified | action |
|---|---|---|---|---|
| 28 | [1,10,18,19,20] | 30 | legitimate | allow |
| 28 | [1,10,18,19,20] | 1 | bad bot | deny |
| 28 | [26,10,18,19,20] | 30 | legitimate | allow |
Elevar um threshold reetiqueta o tráfego, além de impedir que a ação seja executada. Uma contagem de classificações só é comparável entre dois períodos quando o threshold foi o mesmo nos dois, então registre o threshold ao lado de qualquer número que você tirar dos gráficos de classificação.
bot_category é derivado das regras que a requisição correspondeu, e é uma lista unida por vírgula, não um valor único. Uma requisição que correspondeu a regras de duas categorias carrega as duas, como Bad Bot Signatures, Malicious Intent detected. Como as categorias seguem as regras e o veredito segue o threshold, uma linha classificada como legitimate ainda pode nomear categorias de bad bot: as categorias dizem quais regras dispararam, e classified diz se o total delas cruzou o threshold.
Os pares que os dois campos assumem, e como uma requisição chega a cada um, estão abaixo. Real-Time Metrics agrupa os seus gráficos pelos mesmos pares.
classified | bot_category | Como a requisição é identificada |
|---|---|---|
| Good Bot | Good Bot | Por user agents associados a redes sociais, agregadores de conteúdo, bots de monitoramento e mecanismos de busca |
| Bad Bot | Bad Bot Signatures | Por user agents conhecidos por comportamento malicioso, incluindo assinaturas maliciosas e cabeçalhos ausentes ou anômalos |
| Bad Bot | Scripted Bots | Por user agents que indicam automação, como headless ou dalvik, e por comprimento incomum do user agent |
| Bad Bot | Malicious Browser Behavior | Por cookies essenciais ausentes ou forjados, cabeçalhos HTTP obrigatórios ausentes e falhas de validação de cookie |
| Bad Bot | Malicious Intent Detected | Por cabeçalhos e métodos HTTP incomuns, como TRACE |
| Bad Bot | Reputation Intelligence | Pela verificação do endereço IP da requisição contra listas de reputação conhecidas |
| Bad Bot | Brute Force | Por alta frequência de tentativas de login, variação de endereço IP e padrões de erro |
| Bad Bot | Scraping | Por alta variabilidade de acesso a URLs e frequência de requisições |
| Bad Bot | Crawling | Por padrões de variação de URL e pela frequência de requisições de um crawler de conteúdo |
| Bad Bot | Credential Stuffing | Por frequência de tentativas de login, padrões de erro e tentativas em várias contas |
| Bad Bot | Credential Cracking | Por frequência de requisições e padrões de erro específicos |
| Bad Bot | Account Takeover | Por padrões de requisição anômalos e alta variação geográfica |
| Legitimate | Non-Bot Like | Nenhum comportamento suspeito e nenhum padrão de bot foi identificado |
| Under Evaluation | Under Evaluation | Não há dados suficientes para uma classificação completa |
O log escreve os quatro valores de classified em minúsculas, como bad bot, good bot, legitimate e under evaluation. Os gráficos construídos sobre eles escrevem os mesmos valores com iniciais maiúsculas, então um valor lido de um gráfico e um valor lido de uma linha diferem na caixa e em mais nada.
Cada valor tem uma condição. legitimate significa que a função não identificou um bot e tinha dados de fingerprint suficientes para descartar um ataque. good bot significa que a função não identificou ataque e correspondeu o user agent a um padrão de user agent bom. bad bot significa que a requisição alcançou o threshold de pontuação, ou que a função a identificou como um ataque. under evaluation significa que a função não identificou um bot e não tinha dados de fingerprint suficientes para descartar um ataque.
Para uma requisição classificada como good bot, a categoria é o tipo de bot bom que o seu user agent correspondeu: Aggregator Bot, Enterprise Bot, Monitoring Bot, Search Engine Bot ou Social Network Bot.
Under evaluation
under evaluation é o veredito que a função registra quando não identificou um bot e ainda não tem dados de fingerprint suficientes para descartar um ataque. Tanto classified quanto bot_category o carregam, e ele é um dos quatro valores entre os quais os gráficos de tráfego dividem as requisições.
Um fingerprint fica sob avaliação até o Bot Manager consolidar dados suficientes sobre ele, e é por isso que um fingerprint que a função está vendo pela primeira vez carrega o veredito. Para mais informações, consulte Score de bots.
O veredito é uma ausência de evidência, não um achado. Contar uma linha sob avaliação como tráfego legítimo superestima o seu tráfego limpo, e contá-la como tráfego de bot superestima o oposto. Leia os três vereditos decididos um contra o outro e leia este como a parcela de tráfego que a função ainda não situou.
Onde os logs aparecem
Quatro superfícies carregam dados do Bot Manager, e elas não carregam a mesma coisa. Real-Time Events e Data Stream carregam a linha de report em si, campo por campo. Real-Time Metrics e a GraphQL API de Real-Time Metrics carregam contagens agregadas a partir desses campos, então uma requisição isolada não é recuperável em nenhuma das duas.
No Real-Time Events, uma linha de report é um registro do dataset functionConsoleEvents, consultado em https://api.azion.com/v4/events/graphql:
A consulta responde 200 e devolve um registro por linha que a função escreveu. line guarda o prefixo e o objeto JSON juntos, level é LOG e lineSource é CONSOLE. functionId é o id da função instalada, e configurationId é o id do workload em que a requisição chegou, não o id do firewall em que a instância é executada. Como toda linha nomeia a sua instância no prefixo, o valor de log_tag é o que separa as linhas de uma instância das de outra. No Azion Console os mesmos registros são renderizados com uma coluna Time e uma coluna Log Body, e a interface não carrega nenhum campo próprio do Bot Manager: o objeto JSON chega inteiro, em vez de dividido em colunas que você possa ordenar. Para mais informações, consulte Real-Time Events.
Azion CLI não devolve essas linhas. Enquanto uma instância pontua tráfego real, azion logs cells --function-id <function-id> e azion logs http não imprimem nada, com ou sem filtro, ao passo que o dataset devolve toda linha que a função escreve. Um resultado vazio da CLI, portanto, não mostra uma função silenciosa.
O Data Stream encaminha a linha de report para um endpoint que você configura, lendo-a da data source Functions, o que exige assinatura de Functions. O encaminhamento é em tempo real, então um dashboard ou um alerta construído sobre esse endpoint vê uma linha no momento em que a função a escreve. Os campos que um endpoint recebe dependem do tipo dele. Para mais informações, consulte Endpoints.
O Real-Time Metrics carrega uma página Bot Manager com um dashboard Overview e um dashboard Breakdown. Os seus gráficos agregam a classificação que o log carrega: Top Bot Action, por exemplo, agrupa as requisições pela ação que a função aplicou. As métricas são geradas quase em tempo real, com um intervalo de agregação de até 60 segundos. Para mais informações, consulte Real-Time Metrics.
Dois datasets GraphQL carregam os mesmos dados agregados para consulta. botManagerMetrics agrupa pela classificação, pela ação, pelo modo, pelo resultado do CAPTCHA, pelo host e pela geografia de uma requisição. botManagerBreakdownMetrics agrupa pelas URLs que o tráfego de bots alcançou e pelos endereços IP de onde ele veio. Os campos de cada um estão listados na página Campos da GraphQL API de Real-Time Metrics, em botManagerMetrics e botManagerBreakdownMetrics.
Retenção
Os dois datasets GraphQL de Real-Time Metrics são retidos por períodos diferentes, porque guardam dados diferentes. botManagerMetrics é retido por 2 anos, que é também por quanto tempo os gráficos construídos sobre ele mantêm os seus dados. botManagerBreakdownMetrics é retido por 60 dias. Uma consulta que alcança mais de 60 dias para trás devolve, portanto, as contagens de classificação, e não as URLs e os endereços IP por trás delas.
O Data Stream muda a pergunta em vez de respondê-la. Ele encaminha uma cópia da linha de report para um endpoint que você controla, então por quanto tempo essa cópia sobrevive é uma propriedade do endpoint e do que você configurou nele para guardar, não do Bot Manager.