Como investigar requisições com a API GraphQL de Real-Time Events GraphQL API

Um monitoramento constante pode ajudá-lo a identificar comportamentos incomuns em suas aplicações e possíveis ataques. Para este guia, você usará um cenário de exemplo em que há requisições vindas do Brasil, um país do qual você não deseja permitir acesso, e você deseja filtrar as requisições do Chile, o país de onde vêm a maioria das requisições seguras.

Veja os passos descritos neste guia para investigar requisições e os próximos passos para resolver a situação se estiver sendo atacado.


Use o playground da API GraphQL para investigação

Seção intitulada Use o playground da API GraphQL para investigacao
  1. Certifique-se de estar logado na sua conta Azion, via Real-Time Manager ou via Console.
  2. Acesse o playground da API GraphQL do Real-Time Events.
  3. Crie uma query com o filtro e o intervalo de tempo que deseja usar.

Inicie sua investigação com uma query focada nos países que estão fazendo requisições.

  1. No playground da API GraphQL Real-Time Events, adicione a seguinte query:
query requestsInvestigationCountries {
httpEvents(
limit: 100,
filter: {
tsRange: {begin:"2024-03-20T10:10:10", end:"2024-03-27T10:10:10"}
geolocCountryNameNotIn: ["Chile"]
hostIn: ["myhost.net", "anotherhost.com"]
}
aggregate: {count: geolocCountryName}
groupBy: [host, geolocCountryName, requestUri, status]
orderBy: [count_DESC]
)
{
geolocCountryName
host
requestUri
status
count
}
}
  1. Execute a query no playground da API GraphQL.
    • Você receberá uma resposta semelhante a esta:
{
"data": {
"httpEvents": [
{
"geolocCountryName": "Brazil",
"host": "myhost.com",
"requestUri": "/directory/file.html",
"status": 200,
"count": 22041
},
{
"geolocCountryName": "United States",
"host": "host.com.br",
"requestUri": "/directory/file.html",
"status": 200,
"count": 9596
},
{
"geolocCountryName": "Brazil",
"host": "anotherhost.org",
"requestUri": "/directory/file.html",
"status": 200,
"count": 29582
},
{
"geolocCountryName": "United States",
"host": "host.org",
"requestUri": "/directory/file.html",
"status": 200,
"count": 9578
},
{
"geolocCountryName": "United States",
"host": "host.net",
"requestUri": "/directory/file.html",
"status": 403,
"count": 9564
}
]
}
}
  1. Analise a resposta da query e verifique se existem requisições vindas dos países que você não deseja permitir. Neste caso, do Brasil.

Se você estiver executando uma query de investigação geral, pode verificar se o mesmo país que normalmente não acessa sua aplicação fez uma quantidade anormal de requisições para o seu host em um curto período de tempo, como no mesmo minuto. Este é um indicador comum de que sua aplicação está sendo atacada.

Depois de identificar um país ao qual você não deseja permitir acesso à sua aplicação, você pode criar uma network list para bloquear o país.

  1. Acesse Console da Azion > Network Lists.
  2. Clique em + Network List.
  3. Dê um nome único e fácil de lembrar para sua network list.
  4. Em Type, escolha Countries.
  5. Em Countries, selecione os países que você deseja adicionar à lista. Neste caso, Brazil.

Para que sua network list funcione, você precisa ir para Edge Firewall > Rules Engine e criar uma regra associada à lista de rede que você acabou de criar.

Após o tempo de propagação da regra, seu domínio, associado ao edge firewall ao qual você adicionou na lista, bloqueará todas as requisições desse país. Neste caso, Brasil.

Após criar a regra no Rules Engine para Edge Firewall, você precisa continuar monitorando o tráfego de sua aplicação para garantir que a regra tenha sido aplicada e que o tráfego da aplicação esteja normalizado.

Em sua query, atualize o tsRange para corresponder ao período após você ter criado a regra. Lembre-se de dar tempo para propagar.

Agora, na resposta da query para o exemplo deste guia, as requisições vindas do Brasil devem ter um status indicando bloqueio, como 403.

query requestsInvestigationStatus {
httpEvents(
limit: 100,
filter: {
tsRange: {begin:"2024-03-20T10:10:10", end:"2024-03-27T10:10:10"}
geolocCountryNameNotIn: ["Chile"]
hostIn: ["myhost.net", "anotherhost.com"]
statusIn: "403"
}
aggregate: {count: geolocCountryName}
groupBy: [host, geolocCountryName, requestUri, status]
orderBy: [count_DESC]
)
{
geolocCountryName
host
requestUri
status
count
}
}

Passo 2. Investigue o header User-Agent

Seção intitulada Passo 2. Investigue o header User-Agent

A seguir, você investigará o header User-Agent sendo usado nas requisições dos países que você bloqueou, para criar outras regras e melhorar ainda mais sua segurança.

  1. No playground da API GraphQL Real-Time Events, execute a seguinte query:
query requestsInvestigationUserAgent {
httpEvents(
limit: 100,
filter: {
tsRange: {begin:"2024-03-20T10:10:10", end:"2024-03-27T10:10:10"}
statusIn: [403]
}
aggregate: {count: geolocCountryName}
groupBy: [geolocCountryName, status, httpUserAgent]
orderBy: [count_DESC]
)
{
geolocCountryName
status
httpUserAgent
count
}
}

Você receberá uma resposta semelhante a esta:

{
"data": {
"httpEvents": [
{
"geolocCountryName": "Brazil",
"status": 403,
"httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",
"count": 70587
},
{
"geolocCountryName": "United States",
"status": 403,
"httpUserAgent": "Java/11.0.19",
"count": 35736
},
{
"geolocCountryName": "Brazil",
"status": 403,
"httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36",
"count": 19322
},
{
"geolocCountryName": "Brazil",
"status": 403,
"httpUserAgent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/24.0 Chrome/117.0.0.0 Mobile Safari/537.36",
"count": 8638
},
{
"geolocCountryName": "United States",
"status": 403,
"httpUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36",
"count": 2878
}
]
}
}
  1. Analise a resposta da query e encontre o header User-Agent sendo usado pela requisição que você deseja bloquear.
  2. Crie uma regra no Rules Engine para Edge Firewall para bloqueá-lo.

Crie uma regra no Rules Engine para Edge Firewall

Seção intitulada Crie uma regra no Rules Engine para Edge Firewall

Os atacantes podem alterar o país de onde vêm suas requisições, então, ao bloquear o header User-Agent, você adicionará mais uma camada de proteção contra ataques conhecidos.

Neste exemplo, o User-Agent Ubuntu será usado.

  1. Acesse o Console > Edge Firewall.
  2. Selecione um edge firewall existente ou crie um novo.
  3. Selecione a aba Rules Engine no edge firewall selecionado.
  4. Dê um nome à sua regra.
  5. Em Criteria, adicione o critério if Header User Agent matches Ubuntu.
  6. Em Behaviors, selecione Deny (403 Forbidden).

Outras opções de configuração de segurança

Seção intitulada Outras opcoes de configuracao de seguranca

Se você não quiser bloquear todas as requisições de um país por meio de uma network list, existem outros recursos dos produtos de Secure da Azion que você pode usar.

Se você usar outras configurações, modifique os filtros da sua query na API GraphQL para corresponder às outras configurações. Por exemplo, usando o campo stacktrace ou adicionando outro status, como 429 para a regra de Set Rate Limit.


Aqui estão algumas outras opções de queries que você pode usar para investigar e monitorar ataques: