Hashicorp Vault & Apache APISIX: Fortaleça a Segurança da Sua API

Chao Zhang

Chao Zhang

November 15, 2022

Products

Atualmente, as APIs (Interfaces de Programação de Aplicações) tornaram-se a forma mais comum de conectar diferentes serviços de software. Por exemplo, você pode obter a previsão do tempo de hoje através de algumas APIs de clima ou retuitar uma mensagem engraçada através da API do Twitter. A interconexão de APIs torna a Internet rica e colorida, mas também revela o lado obscuro - as ameaças às APIs.

Dados mostram que as APIs agora representam 90% da superfície de ataque de aplicações web, o que significa que as APIs são agora um dos principais vetores de ataque. Então, como podemos mitigar os riscos das APIs?

As pessoas podem escolher o padrão de API Gateway em arquiteturas de software modernas para se defender contra ataques de API. Um API Gateway é o ponto de entrada do serviço de software, fornecendo funcionalidades como balanceamento de carga, descoberta de serviços e autenticação de API. Apache APISIX é um dos melhores API Gateways, que ajuda os usuários a fortalecer sua segurança de API através de recursos como autenticação, autorização, ACL (Lista de Controle de Acesso) e lista de permissão/bloqueio de IP. Por exemplo, a autenticação JWT é uma forma popular de proteger APIs. Ela solicita que os consumidores de API comprovem quem são por meio de um JSON Web Token. Nesse caso, solicitações de API sem credencial ou com a credencial errada serão rejeitadas pelo Apache APISIX.

O Apache APISIX também é responsável pela assinatura do JSON Web Token (que precisa de um segredo para assinar). Do ponto de vista do Apache APISIX, armazenar os segredos dos usuários torna-se uma questão crítica, pois a autenticação não funcionará se os segredos forem vazados. Por padrão, o Apache APISIX salva os segredos no etcd, o centro de configuração para configurações do Apache APISIX, como rota e upstream.

Infelizmente, o etcd não foi projetado para proteger dados sensíveis. Uma vez que uma pessoa imoral tenha acesso ao cluster etcd, todos os dados dentro dele serão expostos. Isso não é um grande problema para um objeto de rota do APISIX, mas seria fatal para segredos ou chaves privadas de certificados X509. Para proteger melhor os dados sensíveis, o Apache APISIX integrou o Hashicorp Vault desde a versão 2.12.0. Então, o que é o Hashicorp Vault?

O que é o Hashicorp Vault?

O Hashicorp Vault é uma infraestrutura de armazenamento para salvar com segurança os segredos dos usuários (por exemplo, credenciais de banco de dados, senhas, chaves de API). Ele suporta a integração com muitos sistemas externos, como o Amazon Key Management Service e o Google Cloud Key Management. Tecnicamente, o Hashicorp Vault é um sistema distribuído com o protocolo de consenso Raft. Seus dados serão salvos com múltiplos backups, e você não precisa se preocupar com o ponto único de falha dos dados.

assets.png

Mas por que o Hashicorp Vault é especial? Quando você inicia o servidor do Hashicorp Vault, ele está em um estado selado. Você não pode acessar nenhum dado a menos que desele o servidor. Para deselear um servidor do Hashicorp Vault, você precisa usar compartilhamentos de chave (gerados quando você inicializa o servidor do Hashicorp Vault com o algoritmo Shamir Secret Sharing) para executar as operações de desele repetidamente. O número de vezes depende do número de compartilhamentos de chave ((X/2)+1 se o número de compartilhamentos de chave for X). Além disso, você pode reselear o servidor do Hashicorp Vault em tempo de execução se perceber qualquer sinal suspeito de que ele está sofrendo algum ataque.

Como o Apache APISIX usa o Hashicorp Vault?

Atualmente, o Apache APISIX integra o Hashicorp Vault em seu plugin jwt-auth. O plugin jwt-auth é usado para fazer a autenticação JWT.

APISIX-Vault-Communication.png

A lógica básica de interação entre o Hashicorp Vault e o Apache APISIX é:

  1. Uma solicitação de API chega
  2. O plugin JWT Auth é executado
  3. O Apache APISIX tenta buscar o segredo do Hashicorp Vault
  4. O Hashicorp Vault retorna o segredo, e o Apache APISIX o armazena em cache
  5. O Apache APISIX usa o segredo para validar o JSON Web Token
  6. A autenticação é aprovada, e a solicitação de API é encaminhada para o serviço de backend
  7. A resposta da API é enviada de volta

Você pode configurar o plugin jwt-auth em um objeto de consumidor do Apache APISIX com a opção vault para informar ao Apache APISIX que armazene/busque o segredo no/do Hashicorp Vault. O consumidor do Apache APISIX é uma abstração do consumidor de API. As credenciais de API podem ser configuradas no nível do consumidor.

curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "username": "jack",
  "plugins": {
    "jwt-auth": {
      "key": "your-api-key",
      "vault": {}
    }
  }
}'

As configurações do Hashicorp Vault podem ser definidas no config.yaml do Apache APISIX.

vault:
  host: 'http://0.0.0.0:8200'
  timeout: 10
  token: 's.KUWFVhIXgoRuQbbp3j1eMVGa'
  prefix: 'kv/apisix'

É preciso ter cuidado aqui que o token deve ter permissão de leitura para o caminho kv/apisix/consumer, que é o local onde a API Admin do Apache APISIX salva os segredos.

path "kv/apisix/consumer/*" {
    capabilities = ["read"]
}

Quando as solicitações de API desse consumidor chegarem, o Apache APISIX tentará buscar o segredo do servidor do Hashicorp Vault configurado (e armazenará o resultado em cache na memória) e usará esse segredo para validar o JSON Web Token.

Futuro das Integrações entre o Apache APISIX e o Hashicorp Vault

Existem vários tipos de dados sensíveis no Apache APISIX, mas apenas o segredo do JSON Web Token pode ser salvo no Hashicorp Vault atualmente. No entanto, no futuro, todas as credenciais de API, como uma chave de API e uma senha de usuário, poderão ser salvas no Hashicorp Vault. Além disso, a chave privada do certificado e as chaves da API Admin também poderão ser salvas lá. Todos esses dados serão separados das configurações. Dessa forma, sua segurança de API é fortalecida não apenas porque você usa autenticação de API, mas também porque as credenciais de API são protegidas adequadamente.

Tags: