Como Usar o Vault para Gerenciar Certificados no APISIX
June 9, 2023
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.
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.
Como Armazenar Certificados SSL do APISIX no Vault
Preparação do Ambiente
- Instale o Docker
- Instale o cURL
- Um serviço APISIX em execução, ou siga o tutorial de Introdução para implantar um contêiner Docker do APISIX
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: