Como Usar o Secret Manager com o API Gateway

Shirui Zhao

January 13, 2023

Technology

O que é um Segredo?

Em um ambiente de TI, um segredo é uma credencial privilegiada não humana, geralmente usada por sistemas e aplicativos para autenticação ou como entrada para algoritmos de criptografia. Por exemplo, senhas necessárias para conectar um programa a um banco de dados, chaves/certificados para comunicação criptografada, todos pertencem a segredos.

Tipos comuns de segredos incluem:

  • Chaves de criptografia
  • Credenciais de acesso a serviços em nuvem
  • Chaves de API (Application Programming Interface)
  • Tokens de acesso
  • Chaves SSH (Secure Shell)

Gerenciador de Segredos

O Gerenciador de Segredos armazena, recupera, rotaciona e audita segredos ao longo de seu ciclo de vida. HashiCorp Vault é um dos serviços de Gerenciador de Segredos mais comumente usados, e seu princípio de funcionamento é o seguinte (imagem do site oficial da HashiCorp):

Gerenciador de Segredos

Além do HashiCorp Vault, provedores de nuvem como AWS, Google e Azure também oferecem serviços de Gerenciador de Segredos.

Usar um Gerenciador de Segredos para construir aplicativos não apenas aumenta a segurança, mas também fornece as seguintes funcionalidades:

  • Permite que os segredos sejam facilmente atualizados em várias máquinas sem afetar o aplicativo.
  • Os desenvolvedores não precisam se preocupar muito com o armazenamento de segredos e podem se concentrar mais na lógica de negócios em si.
  • A rotação e revogação de segredos podem ser feitas sem reimplantar ou interromper aplicativos ativos.
  • O Gerenciador de Segredos fornece logs de auditoria flexíveis e detalhados que podem rastrear o histórico de todos os acessos de usuários e atender mais facilmente aos requisitos de auditoria e conformidade.

Usar Gerenciador de Segredos no API Gateway

Como a entrada do tráfego de negócios, o API Gateway geralmente contém uma grande quantidade de informações secretas, como chaves de API e tokens para autenticação. Portanto, é vital integrar um Gerenciador de Segredos ao API Gateway.

Cenários de Uso de Segredos no API Gateway

Key Auth é um método simples de autenticação no API Gateway. Os usuários precisam pré-definir uma chave, e quando o cliente faz solicitações à API, a chave pré-definida é escrita no cabeçalho da solicitação correspondente ou acessada como um parâmetro de solicitação para passar na autenticação. No entanto, vazamentos de chaves são comuns, e as chaves são frequentemente armazenadas em arquivos de configuração ou salvas como variáveis no código. Se as chaves não forem armazenadas corretamente, elas podem até aparecer em repositórios de código públicos como o GitHub, representando uma ameaça significativa à segurança. Os administradores costumam atualizar essas chaves regularmente para evitar danos graves causados por vazamentos de chaves. No entanto, para algumas chaves estáticas, atualizar individualmente o arquivo de configuração em cada máquina também pode representar uma ameaça significativa à estabilidade do serviço.

Integrar Gerenciador de Segredos ao API Gateway

Ao integrar o Gerenciador de Segredos ao API Gateway, a chave pré-definida para autenticação Key Auth pode ser armazenada no serviço de Gerenciador de Segredos, resolvendo efetivamente uma série de problemas causados por vazamentos de chaves. O API Gateway é apenas um usuário da chave, e o valor real da chave é armazenado no serviço externo de Gerenciador de Segredos. Além disso, o API Gateway mantém apenas uma referência à chave, então, mesmo que o API Gateway seja invadido, a chave real não pode ser obtida do código ou do arquivo de configuração. Além disso, se você precisar atualizar o valor da chave, basta atualizá-lo no Gerenciador de Segredos sem modificar o código ou a configuração do API Gateway, o que também evita efetivamente a reinicialização do API Gateway.

api gateway Gerenciador de Segredos

Usaremos o Apache APISIX como exemplo abaixo para mostrar como usar o Gerenciador de Segredos para armazenar a chave pré-definida para Key Auth no API Gateway.

Exemplo de Uso do Apache APISIX no Gerenciador de Segredos na Prática

O Apache APISIX é um API Gateway dinâmico, em tempo real e de alto desempenho que fornece centenas de funcionalidades, como balanceamento de carga, upstream dinâmico, lançamento canário, roteamento granular, limitação de taxa, degradação de serviço, disjuntor, autenticação e observabilidade.

Na versão 3.1.0, o Apache APISIX introduziu o APISIX Secret para integrar diferentes serviços de Gerenciador de Segredos. Sua sequência de trabalho é a seguinte:

apisix Gerenciador de Segredos

Abaixo, usamos o Vault como o serviço de Gerenciador de Segredos. Usaremos a autenticação Key Auth para ilustrar como usar um Gerenciador de Segredos para salvar chaves no Apache APISIX.

Criar Chaves no Vault

Antes de criar a chave, você precisa iniciar o serviço do Vault. Como esta seção compartilha as melhores práticas para usar o Vault no ecossistema do Apache APISIX, a configuração do Vault em si não é descrita em detalhes e pode ser encontrada aqui.

Para criar a chave correspondente no Vault, você pode usar o seguinte comando:

vault secrets enable -version=1 -path=apisix kv

vault kv put apisix/jack auth-key=secret-key

Após executar o comando acima, você encontrará uma chave chamada auth-key no caminho apisix/jack, com o valor secret-key.

Configuração no APISIX

Primeiro, adicione o recurso de segredo através da Admin API e configure o endereço e outras informações de conexão para o Vault:

  1. O ID do recurso de segredo do APISIX é "gateway", consulte https://apisix.apache.org/docs/apisix/terminology/secret/#usage-1
  2. O campo prefix é o caminho da chave no Vault, e o campo token é o token do Vault.
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/gateway \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "uri": "https://127.0.0.1:8200",
  "prefix": "apisix",
  "token": "hvs.chjDFWvZRcihoq2vpSsVenmR"
}'

Em seguida, use o plugin key-auth para criar um consumidor e realizar a autenticação Key Auth para a rota ou serviço correspondente. O campo key refere-se ao recurso de segredo do APISIX:

curl http://127.0.0.1:9180/apisix/admin/consumers \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "username": "jack",
  "plugins": {
    "key-auth": {
      "key": "$secret://vault/gateway/jack/auth-key"
    }
  }
}'

Através dos dois passos acima, quando a solicitação do usuário atinge um plugin key-auth, o componente Secret chamará o Gerenciador de Segredos configurado pelo usuário através da interface fornecida para obter o valor real da chave no Vault. Se o valor da chave não for encontrado, o plugin registrará o erro e falhará na validação Key Auth.

Em seguida, crie uma Rota para realizar a autenticação Key Auth:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "id": "getting-started-ip",
  "uri": "/ip",
  "plugins": {
    "key-auth": {}
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

Finalmente, envie uma solicitação sem chave para o API Gateway para verificar o resultado:

curl -i "http://127.0.0.1:9080/ip"

O resultado é o seguinte:

HTTP/1.1 401 Unauthorized
...

{"message":"Missing API key found in request"}

E então, envie uma solicitação com a chave para o API Gateway para verificar o resultado:

curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'

O resultado é semelhante ao seguinte:

HTTP/1.1 200 OK
...

{
  "origin": "127.0.0.1, 59.172.90.243"
}

Além disso, o Apache APISIX expandiu as variáveis de ambiente em um serviço simples de Gerenciador de Segredos, e o token do APISIX para conectar ao Vault também pode ser armazenado em variáveis de ambiente. Portanto, antes de iniciar o APISIX, você pode definir as variáveis de ambiente com o seguinte comando:

export VAULT_TOKEN="root"

Referencie as variáveis de ambiente ao adicionar o recurso Secret:

curl http://127.0.0.1:9180/apisix/admin/secrets/vault/1
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
  "uri": "https://127.0.0.1:8200",
  "prefix": "apisix",
  "token": "$ENV://VAULT_TOKEN"
}'

Através dos passos acima, você pode armazenar a chave necessária para a autenticação Key Auth no Vault, em vez de exibi-la em texto claro ao configurar o plugin.

Conclusão

No API Gateway, há uma grande quantidade de informações secretas. Usar um Gerenciador de Segredos para gerenciar segredos pode garantir que não haja informações secretas em texto claro no API Gateway, melhorando efetivamente a segurança e a estabilidade do API Gateway. Como o API Gateway de código aberto mais ativo do mundo, o Apache APISIX também oferece suporte significativo a gerenciadores de segredos. Este artigo também usa a autenticação Key Auth para ilustrar como usar um Gerenciador de Segredos para gerenciar informações de chave no APISIX.

Para mais informações sobre API gateway, visite nossos blogs ou entre em contato conosco.

Tags: