Apache APISIX aprimora a segurança de API com o Plugin CSRF

API7.ai

February 23, 2022

Products

O ponto principal de lançar um ataque CSRF (cross-site request forgery) é fazer com que o servidor alvo não consiga distinguir se a origem de muitas solicitações é um usuário real ou um atacante. O fluxo geral do ataque é que, primeiro, o atacante atrairá o usuário para navegar até uma página da web fornecida pelo atacante. Essa página contém uma solicitação que é enviada automaticamente ao servidor alvo. A página então carrega normalmente e a solicitação é enviada automaticamente ao servidor. Para o servidor, a solicitação parece exatamente a mesma que a solicitação normalmente enviada pelo usuário, sem perceber que foi iniciada pelo atacante sem o conhecimento do usuário. Como a solicitação carrega algumas credenciais do usuário, o atacante pode obter acesso às informações do usuário ao analisar essas credenciais, criando assim um risco de segurança.

Este artigo apresenta o csrf, o plugin de segurança CSRF para o Apache APISIX, e detalha como proteger suas informações de API no Apache APISIX com a ajuda do plugin csrf.

Introdução ao Plugin

O plugin csrf é implementado com base no esquema Double Submit Cookie. Conforme definido em RFC 7231#section-4.2.1, consideramos os métodos GET, HEAD e OPTIONS como métodos seguros. De acordo com essa convenção, o plugin csrf permitirá que esses três métodos passem diretamente, mas verificará os outros métodos e interceptará qualquer solicitação insegura.

Para se defender contra ataques CSRF, precisamos criar um token ou identificador que não possa ser forjado e garantir que ele não seja enviado com a solicitação do atacante. O usuário precisa carregar o token no qual o plugin csrf depende no cabeçalho da solicitação, e o token é calculado usando uma chave para assinatura. Isso garante que o token não possa ser forjado por outros, protegendo assim a API.

Plugin

Quando o plugin csrf é habilitado em uma rota, todas as respostas de solicitação para essa rota conterão um Cookie carregando um csrf token.

O usuário precisa carregar esse Cookie em uma solicitação insegura para essa rota e adicionar um campo adicional no cabeçalho da solicitação para carregar o conteúdo do cookie. O campo é o valor name na configuração do plugin, para que a solicitação passe nas verificações do plugin CSRF.

O usuário fornece uma chave aleatória na configuração do plugin, que é usada pelo plugin para criptografar as informações do token com um hash sha256 e gerar um token CSRF, garantindo assim que o token não possa ser forjado.

Como Usar o Plugin

Habilitar o Plugin CSRF em uma Rota

Crie uma rota no APISIX usando a API Admin e habilite o plugin csrf.

curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "uri": "/hello",
  "plugins": {
    "csrf": {
      "key": "edd1c9f034335f136f87ad84b625c8f1"
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "127.0.0.1:9001": 1
    }
  }
}'

Existem três parâmetros de configuração para o plugin.

  • key: Campo obrigatório, o valor da chave secreta aleatória. O usuário precisa fornecer uma chave aleatória.
  • expires: Opcional, o tempo de expiração da chave secreta aleatória, o valor padrão é 7200 segundos. Como o token CSRF é enviado ao cliente usando um Cookie, essa configuração é colocada na configuração do Cookie para controlar o tempo de expiração do Cookie. Além disso, o plugin também calculará o tempo para determinar se o token expirou.
  • name: Opcional, o nome do token CSRF, o valor padrão é apisix-csrf-token.

Enviar uma Solicitação

A rota é acessada primeiro usando uma solicitação POST.

curl -i http://127.0.0.1:9080/hello -X POST

O Apache APISIX interceptará a solicitação e retornará um erro 401. No cabeçalho retornado, você encontrará um Cookie definido, que deve ser o valor padrão apisix-csrf-token=.... dentro do Cookie se o campo name do plugin não estiver configurado. Este é o token CSRF gerado pelo plugin CSRF. Na solicitação, você precisa garantir que a solicitação carregue esse Cookie e que o token seja escrito no cabeçalho da solicitação.

HTTP/1.1 401 Unauthorized
Set-Cookie: apisix-csrf-token= ${apisix-csrf-token};path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT
{"error_msg":"no csrf token in headers"}

Exemplo de uso de JavaScript no lado do cliente: leitura de Cookies usando js-cookie e envio de solicitações usando axios.

const token = Cookie.get('apisix-csrf-token');

const instance = axios.create({
  headers: {'apisix-csrf-token': token}
});

Se o token no Cookie não corresponder ao token no cabeçalho da solicitação, a solicitação será interceptada pelo plugin csrf, como mostrado no exemplo a seguir.

curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: ${apisix-csrf-token}' -b 'apisix-csrf-token= ${apisix-csrf-token}'
HTTP/1.1 401 Unauthorized
Set-Cookie: apisix-csrf-token= ${apisix-csrf-token};path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT
{"error_msg":"csrf token mismatch"}

Finalmente, use curl para verificar o acesso regular.

curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: ${apisix-csrf-token}' -b 'apisix-csrf-token= ${apisix-csrf-token}'
HTTP/1.1 200 OK

Internamente, o plugin precisa verificar se o token no Cookie corresponde ao token carregado no cabeçalho da solicitação e recalcular a assinatura para verificar se o token é válido.

Desabilitar o Plugin

Remova as informações de configuração relevantes para o plugin csrf e, em seguida, envie uma solicitação para atualizar a rota e desativar o plugin.

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "uri": "/hello",
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "127.0.0.1:1980": 1
    }
  }
}'

Resumo

Este artigo descreve em detalhes como o plugin csrf funciona e como usá-lo. Esperamos que este artigo possa fornecer uma compreensão mais clara sobre o uso do plugin para interceptar ataques CSRF no Apache APISIX e facilitar sua aplicação em cenários práticos.

O Apache APISIX também está atualmente trabalhando em plugins adicionais para suportar a integração de serviços adicionais, então, se você estiver interessado, sinta-se à vontade para iniciar uma discussão no GitHub Discussion, ou via lista de e-mails para se comunicar.

Tags: