Como Usar o Vault para Gerenciar Certificados no APISIX

Junduo Dong

Junduo Dong

June 9, 2023

Technology

O gateway de API é um componente básico fundamental no gerenciamento do ciclo de vida da API. Ele é a entrada de todo o tráfego e é responsável por rotear as solicitações de API dos clientes downstream para o serviço upstream correto para processamento. Portanto, o gateway de API funciona para a comunicação de rede entre os serviços upstream e os clientes downstream.

Como um novo gateway de API nativo da nuvem, o Apache APISIX fornece o mecanismo de comunicação TLS/mTLS entre os clientes downstream e o APISIX, e entre o APISIX e os serviços upstream, para garantir a segurança da rede entre eles. O APISIX salva o certificado SSL como um objeto de certificado SSL e realiza o carregamento dinâmico do certificado SSL por meio da extensão SNI (Server Name Indication) que suporta o protocolo TLS.

Para armazenar com segurança os certificados SSL no APISIX, o APISIX alcançou a integração com o HashiCorp Vault, realizando assim o gerenciamento unificado dos certificados SSL aproveitando o armazenamento seguro de segredos do Vault. Este artigo toma como exemplo a configuração da comunicação HTTPS entre o cliente downstream e o APISIX para introduzir como o APISIX integra o Vault para implementar o gerenciamento de certificados SSL.

Integrar APISIX com Vault

O que é um Certificado SSL

SSL/TLS é um protocolo criptográfico que protege a segurança da comunicação de rede ao estabelecer uma conexão de rede criptografada entre as duas partes que se comunicam. O protocolo SSL/TLS garante que os dados sejam enviados para o cliente e servidor corretos ao autenticar usuários e servidores. Além disso, o protocolo SSL/TLS pode criptografar os dados de comunicação, garantindo assim que os dados não possam ser roubados, adulterados ou forjados durante a transmissão.

Um certificado SSL é um certificado digital que autentica a identidade de um site e permite uma conexão criptografada usando o protocolo SSL/TLS. Um certificado SSL é geralmente emitido por uma autoridade de certificação digital (CA) confiável, que inclui principalmente as seguintes informações:

  • Nome de domínio
  • Autoridade de certificação
  • Assinatura digital assinada pela autoridade de certificação
  • Subdomínios associados
  • Data de emissão do certificado
  • Data de expiração do certificado
  • A chave pública (enquanto a chave privada é uma chave secreta)

O que é o HashiCorp Vault

O HashiCorp Vault (doravante referido como Vault) é uma ferramenta de gerenciamento de segredos de nível empresarial que pode armazenar e gerenciar dados sensíveis como tokens, senhas e certificados. O Vault pode ser integrado com tecnologias em todo o sistema de TI, fornecer automação de segurança baseada em identidade e serviços de criptografia, controlar centralmente o acesso a dados e sistemas sensíveis, e ajudar as organizações a reduzir o risco de vazamento e exposição de dados, melhorando assim a segurança da nuvem e das aplicações.

HashiCorp Vault

Como Armazenar Certificados SSL do APISIX no Vault

Preparação do Ambiente

Implantar e Configurar o Serviço Vault

Nesta seção, usaremos o Docker para implantar um serviço de contêiner Vault. Você pode pular esta seção se já tiver uma instância de serviço Vault disponível em seu ambiente.

Crie e implante um contêiner Vault no modo Dev, nomeado apisix-quickstart-vault. Especifique o Token do Vault como apisix-quickstart-vault-token e mapeie a porta 8200 para o host:

docker run -d --cap-add=IPC_LOCK \
  -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \
  -e 'VAULT_ADDR=http://0.0.0.0:8200' \
  -e 'VAULT_DEV_ROOT_TOKEN_ID=apisix-quickstart-vault-token' \
  -e 'VAULT_TOKEN=apisix-quickstart-vault-token' \
  --network=apisix-quickstart-net \
  --name apisix-quickstart-vault \
  -p 8200:8200 vault:1.13.0

Selecione kv como o caminho de armazenamento do certificado SSL do APISIX:

docker exec apisix-quickstart-vault vault secrets enable -path=kv -version=1 kv

Configurar o APISIX

O APISIX precisa ler os certificados SSL do Vault, então o Vault deve conceder permissão de leitura ao APISIX no caminho especificado.

Crie uma política do Vault chamada apisix-policy.hcl, concedendo ao APISIX acesso de leitura ao caminho kv/apisix/:

docker exec apisix-quickstart-vault /bin/sh -c "echo '
path \"kv/apisix/*\" {
    capabilities = [\"read\"]
}
' > /etc/apisix-policy.hcl"

Aplique o arquivo de política criado apisix-policy.hcl ao Vault:

docker exec apisix-quickstart-vault vault policy write apisix-policy /etc/apisix-policy.hcl

Crie um objeto de segredo do APISIX com o id quickstart-secret-id para salvar as informações de conexão do Vault e o caminho de armazenamento do certificado:

curl -i "http://127.0.0.1:9180/apisix/admin/secrets/vault/quickstart-secret-id" -X PUT -d '
{
    "uri": "http://apisix-quickstart-vault:8200",
    "prefix": "kv/apisix",
    "token" : "apisix-quickstart-vault-token"
}'

Armazenar Certificados SSL no Vault

Crie um certificado CA autoassinado ca.crt e uma chave ca.key:

openssl genrsa -out ca.key 2048 && \
  openssl req -new -sha256 -key ca.key -out ca.csr -subj "/CN=ROOTCA" && \
  openssl x509 -req -days 36500 -sha256 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt

O certificado SSL server.crt e a chave server.key são emitidos pela CA, e seu nome comum (CN) é test.com:

openssl genrsa -out server.key 2048 && \
  openssl req -new -sha256 -key server.key -out server.csr -subj "/CN=test.com" && \
  openssl x509 -req -days 36500 -sha256 -extensions v3_req \
  -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial \
  -in server.csr -out server.crt

Copie o certificado SSL e a chave emitidos para o contêiner Vault:

docker cp server.key apisix-quickstart-vault:/root/
docker cp server.crt apisix-quickstart-vault:/root/

Use o comando vault kv put para armazenar o certificado SSL e a chave como um segredo, a chave é ssl, e o caminho de armazenamento é kv/apisix:

docker exec apisix-quickstart-vault vault kv put kv/apisix/ssl test.com.crt=@/root/server.crt test.com.key=@/root/server.key

Através do comando acima, armazenamos um segredo chamado ssl no Vault, que contém 2 pares de chave-valor: certificado e chave privada.

Como Usar o Certificado SSL do APISIX Armazenado no Vault

O APISIX suporta criptografia de rede TLS/mTLS entre clientes downstream e o APISIX, e entre o APISIX e serviços upstream, onde os certificados SSL armazenados no Vault podem ser usados. Tomaremos como exemplo a configuração da comunicação HTTPS entre o cliente e o APISIX para demonstrar como usar o certificado SSL armazenado no Vault no APISIX.

Configurar a Comunicação HTTPS Entre o Cliente e o APISIX

Crie um objeto de certificado SSL para armazenar o certificado SSL:

curl -i "http://127.0.0.1:9180/apisix/admin/ssls" -X PUT -d '
{
  "id": "quickstart-tls-client-ssl",
  "sni": "test.com",
  "cert": "$secret://vault/quickstart-secret-id/ssl/test.com.crt",
  "key": "$secret://vault/quickstart-secret-id/ssl/test.com.key"
}'

O sni deste objeto é test.com, que é consistente com o CN que emitiu o certificado. O cert e o key correspondem ao certificado e à chave privada emitidos, que são obtidos automaticamente do Vault através do localizador de recurso de segredo estabelecido, e as regras do localizador de recurso são:

$secret://$manager/$id/$secret_name/$key
  • manager: serviço de gerenciamento de chaves Vault
  • id: ID do recurso de segredo do APISIX
  • secret_name: o nome do segredo no Vault
  • key: a chave do par chave-valor no segredo chamado secret_name

Verificar a Comunicação HTTPS Entre o Cliente e o APISIX

Crie uma rota para encaminhar todas as solicitações enviadas para /ip para o upstream httpbin.org:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "id": "quickstart-client-ip",
  "uri": "/ip",
  "upstream": {
    "nodes": {
      "httpbin.org:80":1
    },
    "type": "roundrobin"
  }
}'

Use o cURL para enviar uma solicitação para https://test.com:9443/ip, test.com resolve para 127.0.0.1:

curl -ikv --resolve "test.com:9443:127.0.0.1" "https://test.com:9443/ip"

Se a configuração for bem-sucedida, o processo de handshake TLS entre o cliente e o APISIX retornado pelo cURL será o mesmo que os seguintes resultados:

* Added test.com:9443:127.0.0.1 to DNS cache
* Hostname test.com was found in DNS cache
*   Trying 127.0.0.1:9443...
* Connected to test.com (127.0.0.1) port 9443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=test.com
*  start date: Apr 21 07:47:54 2023 GMT
*  expire date: Mar 28 07:47:54 2123 GMT
*  issuer: CN=ROOTCA
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x556274d632e0)
> GET /ip HTTP/2
> Host: test.com:9443
> user-agent: curl/7.74.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
< HTTP/2 200
HTTP/2 200
...

Resumo

Introduzimos como o APISIX integra o Vault para implementar o gerenciamento de certificados SSL, e mostramos os passos de configuração e integração em detalhes, tomando como exemplo a comunicação HTTPS entre clientes downstream e o APISIX.

Para conceitos relacionados e cenários de uso de certificados SSL no APISIX, consulte os seguintes artigos:

Tags: