Cloudflare – como fazer controle de acesso a API

Se possui um site publicado, provê algum serviço e não quer que qualquer um possa acessar uma determinada API pode usar o Cloudflare para liberar somente os clientes ( consumidores da API ) autorizados. A grande questão é conseguir atender a todas as necessidades com o limite de regras que podem ser criadas, principalmente no plano gratuito que permite apenas cinco.

Para esse caso, a função de anti-bot deve estar desativada. Caso estiver ativa, a estrutura das regras é bem diferente.

Exemplo 1

Vamos ao exemplo de regra para o caso mais simples, pressupondo que:

  • O site é “https://www.tonev.pro.br”;
  • As chamadas de API que se deseja restringir são acessível através da URI “/api2/uploads/*”;
  • Existe apenas um cliente que vai consumir a API

Portanto a regra deve ser como no exemplo abaixo:

Criação de regra via o visual builder

Elementos usados:

  • Condição 1:
    • Campo: “URI Full”
    • Operador: “equals”
    • Valor: a URI completa da API – “https://novoapi.tonev.pro.br/api2/uploads/*”
  • Condição de avaliação: E
  • Condição 2:
    • Campo: “User Agent”
    • Operador: “does not equal”
    • Valor: “ua_acesso_liberado_123”
  • Ação: Block
  • Sequencia: Primeira

O resultado: sempre que for feita uma requisição para qualquer coisa abaixo de “https://novoapi.tonev.pro.br/api2/uploads/” e o cabeçalho “User Agent” da solicitação HTTP não for “ua_acesso_liberado_123” retorne página de bloqueio.

 

Exemplo 2

O segundo exemplo de regra é para uma lista de clientes. Para isso iremos pressupor que:

  • O site é “https://www.tonev.pro.br”;
  • As chamadas de API que se deseja restringir são acessível através da URI “/api/uploads/*”;
  • Existe apenas dois clientes que vai consumir a API

Como é um pouco mais complicado é necessário definir a regra manualmente, pois nesses casos o edito visual não consegue montar a lógica da sequencia de avaliação corretamente.

Portanto a regra deve ser como no exemplo abaixo:

Criação de regra via o expression builder - simples

(
(http.request.full_uri eq "https://www.tonev.pro.br/api/uploads/*")
and
(
(http.user_agent ne "ua_acesso_liberado_123")
or
(http.user_agent ne "ua_acesso_liberado_456")
)
)

Elementos usados:

  • Condição 1:
    • Campo: “URI Full”
    • Operador: “equals”
    • Valor: a URI completa da API – “https://www.tonev.pro.br/api/uploads/*”
  • Condição de avaliação: E
  • Condição 2 – composta:
    • Condição 1:
      • Campo: “User Agent”
      • Operador: “does not equal”
      • Valor: “ua_acesso_liberado_123”
    • Condição de avaliação: OU
    • Condição 2:
      • Campo: “User Agent”
      • Operador: “does not equal”
      • Valor: “ua_acesso_liberado_456”
  • Ação: Block
  • Sequencia: Primeira

O resultado: ( sempre que for feita uma requisição para qualquer coisa abaixo de “https://www.tonev.pro.br/api/uploads/” ) E ( o cabeçalho “User Agent” da solicitação HTTP não for “ua_acesso_liberado_123” OU “ua_acesso_liberado_123” ) retorne página de bloqueio.

 

Exemplo 3

O último exemplo de regra é para uma lista de URIs e clientes. Para isso iremos pressupor que:

  • Os sites são “https://www.tonev.pro.br” e “https://novoapi.tonev.pro.br”;
  • As chamadas de API que se deseja restringir são acessível através das URIs “/api/uploads/*” e “/api2/uploads/*”, respectivamente;
  • A URI “https://www.tonev.pro.br/api/uploads/*” será acessível somente para os agentes “ua_acesso_liberado_123” e “ua_acesso_liberado_456”
  • A URI “https://novoapi.tonev.pro.br/api2/uploads/*” será acessível somente para o agente “ua_acesso_liberado_789”.

Como é um caso mais complexo é necessário definir a regra manualmente, pois nesses casos o edito visual não consegue montar a lógica da sequencia de avaliação corretamente.

Portanto a regra deve ser como no exemplo abaixo:

Criação de regra via o expression builder - composto

(
(http.request.full_uri eq “https://www.tonev.pro.br/api/uploads/*”)
and
(
(http.user_agent ne “ua_acesso_liberado_123”)
or
(http.user_agent ne “ua_acesso_liberado_456”)
)
)

or

(
(http.request.full_uri eq “https://novoapi.tonev.pro.br/api2/uploads/*”)
and
(
(http.user_agent ne “ua_acesso_liberado_789”)
)
  • Condição 1 – composta:
    • Condição 1:
      • Campo: “URI Full”
      • Operador: “equals”
      • Valor: a URI completa da API – “https://www.tonev.pro.br/api/uploads/*”
    • Condição de avaliação: E
    • Condição 2 – composta:
      • Condição 1:
        • Campo: “User Agent”
        • Operador: “does not equal”
        • Valor: “ua_acesso_liberado_123”
      • Condição de avaliação: OU
      • Condição 2:
        • Campo: “User Agent”
        • Operador: “does not equal”
        • Valor: “ua_acesso_liberado_456”
  • Condição de avaliação: OU
  • Condição 2 – composta:
    • Condição 1:
      • Campo: “URI Full”
      • Operador: “equals”
      • Valor: a URI completa da API – “https://novoapi.tonev.pro.br/api2/uploads/*”
    • Condição de avaliação: E
    • Condição 2:
      • Campo: “User Agent”
      • Operador: “does not equal”
      • Valor: “ua_acesso_liberado_789”
  • Ação: Block
  • Sequencia: Primeira

O resultado: ( ( sempre que for feita uma requisição para qualquer coisa abaixo de “https://www.tonev.pro.br/api/uploads/” ) E ( o cabeçalho “User Agent” da solicitação HTTP não for “ua_acesso_liberado_123” OU “ua_acesso_liberado_123” ) ) OU (  sempre que for feita uma requisição para qualquer coisa abaixo de “https://novoapi.tonev.pro.br/api2/uploads/” ) E ( o cabeçalho “User Agent” da solicitação HTTP não for “ua_acesso_liberado_789” ) retorne página de bloqueio.

Os valores do “User Agent” devem ser grandes e aleatórios o suficiente para garantir a segurança do acesso, lembrando que, como uma senha, pode ocorrer quebra do acesso por força bruta se o atacante souber o formato e tamanho da string usada.

Para edição manual das regras recomendo usar o Notepad++ que está disponível em https://notepad-plus-plus.org/downloads/.

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *