Versões antigas do protocolo Transport Layer Security (TLS), como TLS 1.0 e TLS 1.1, apresentam vulnerabilidades conhecidas que expõem o tráfego HTTPS a ataques man-in-the-middle e violações de dados. Configure o gateway de entrada do Alibaba Cloud Service Mesh (ASM) para impor o uso de TLS 1.2 ou superior definindo o campo minProtocolVersion no recurso Gateway.
Informações de base
As primeiras versões do TLS, incluindo a 1.0, apresentam problemas de segurança conhecidos que podem resultar em vazamento de dados durante a transmissão. Para aumentar a segurança do site, substitua o TLS 1.0 e o TLS 1.1 pelo TLS 1.2 ou posterior. Desative também os conjuntos de cifras fracas no TLS 1.2.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM nas edições Enterprise ou Ultimate, versão v1.14 ou posterior. Para mais informações, consulte Crie uma instância do ASM e Atualize uma instância do ASM.
Um cluster adicionado à instância do ASM. Para mais detalhes, consulte Adicionar um cluster a uma instância do ASM.
Um gateway de entrada implantado. Consulte Crie um gateway de entrada.
Uma aplicação implantada na instância do ASM. Consulte Implantar uma aplicação em uma instância do ASM.
Etapa 1: Preparar um certificado TLS e uma chave privada
Crie um certificado TLS e uma chave privada para o gateway de entrada e armazene-os em um secret do Kubernetes ou em um certificado do ASM. O exemplo abaixo usa o domínio aliyun.com. Se você já tiver o certificado e a chave privada para esse domínio, renomeie-os para aliyun.com.crt e aliyun.com.key e pule para a subetapa 3.
-
Gere um certificado raiz e uma chave privada:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=myexample Inc./CN=aliyun.com' \ -keyout aliyun.root.key -out aliyun.root.crt -
Gere um certificado de servidor e uma chave privada para
aliyun.com:openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes \ -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization" openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key \ -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt -
Armazene o certificado e a chave privada. O método varia conforme a versão do ASM:
Versões do ASM anteriores à v1.17
Conecte-se ao cluster que hospeda o pod do gateway de entrada com kubectl e crie um secret TLS no namespace
istio-system:kubectl create -n istio-system secret tls myexample-credential \ --key=aliyun.com.key --cert=aliyun.com.crtImportanteO nome do secret não deve começar com
istioouprometheuse não pode conter um campotoken.ASM v1.17 ou posterior
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em no nome da sua instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Certificate Management.
-
Na página Certificate Management, clique em Create. No painel Certificate Information, configure os parâmetros abaixo e clique em OK.
Parâmetro
Valor
Name
myexample-credentialPublic Key Certificate
Cole o conteúdo do arquivo
aliyun.com.crtgerado na subetapa 2Private Key
Cole o conteúdo do arquivo
aliyun.com.keygerado na subetapa 2
Etapa 2: Crie um gateway Istio com imposição de versão TLS
Acesse o console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em no nome da sua instância do ASM. No painel de navegação à esquerda, escolha ASM Gateways > Gateway. Clique em Create from YAML.
-
Selecione um namespace e cole o YAML a seguir. A configuração
minProtocolVersion: TLSV1_2rejeita todas as conexões que usam TLS 1.0 ou TLS 1.1:apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: mysdsgateway spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: credentialName: myexample-credential minProtocolVersion: TLSV1_2 mode: SIMPLE
Etapa 3: Crie um VirtualService
Na página de detalhes da instância do ASM, escolha Traffic Management Center > VirtualService no painel de navegação à esquerda. Clique em Create from YAML.
-
Selecione um namespace e cole o seguinte YAML:
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo-tlsversion-sample spec: gateways: - mysdsgateway-tlsversion-sample hosts: - '*' http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080
Etapa 4: Verifique a configuração de TLS
Use a ferramenta testssl.sh para validar quais versões de TLS o gateway de entrada aceita. O testssl.sh é uma ferramenta open source de linha de comando que verifica o suporte a protocolos TLS/SSL, conjuntos de cifras e vulnerabilidades conhecidas em qualquer endpoint de servidor.
Execute o testssl.sh no gateway de entrada:
docker run --rm -ti registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh https://<ingress-gateway-ip>/productpage
Substitua <ingress-gateway-ip> pelo endereço IP do seu gateway de entrada.
Verifique TLS 1.2 e posteriores (recomendado)
Com o parâmetro minProtocolVersion definido como TLSV1_2 (conforme configurado na Etapa 2), a saída esperada exibe:
|
Protocolo |
Status |
|
SSLv2 |
Não oferecido |
|
SSLv3 |
Não oferecido |
|
TLS 1.0 |
Não oferecido |
|
TLS 1.1 |
Não oferecido |
|
TLS 1.2 |
Oferecido |
|
TLS 1.3 |
Oferecido |
Somente clientes com suporte a TLS 1.2 ou TLS 1.3 conseguem se conectar. Clientes mais antigos (como IE 8 e Java 7) são rejeitados.
(Opcional) Restringir apenas ao TLS 1.2
Para permitir exclusivamente conexões TLS 1.2 e rejeitar TLS 1.3, defina tanto minProtocolVersion quanto maxProtocolVersion como TLSV1_2:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: mysdsgateway
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: myexample-credential
maxProtocolVersion: TLSV1_2
minProtocolVersion: TLSV1_2
mode: SIMPLE
Execute o testssl.sh novamente para validação. Resultados esperados:
|
Protocolo |
Status |
|
SSLv2 |
Não oferecido |
|
SSLv3 |
Não oferecido |
|
TLS 1.0 |
Não oferecido |
|
TLS 1.1 |
Não oferecido |
|
TLS 1.2 |
Oferecido |
|
TLS 1.3 |
Não oferecido (rebaixado para um protocolo mais fraco) |
Apenas clientes compatíveis com TLS 1.2 conseguirão se conectar. Todos os clientes que suportam somente TLS 1.3 farão fallback para TLS 1.2.
(Opcional) Restringir apenas ao TLS 1.3
Para impor exclusivamente o TLS 1.3, configure minProtocolVersion e maxProtocolVersion com o valor TLSV1_3:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: mysdsgateway
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: myexample-credential
maxProtocolVersion: TLSV1_3
minProtocolVersion: TLSV1_3
mode: SIMPLE
O modo exclusivo de TLS 1.3 reduz significativamente a compatibilidade com clientes. Diversos navegadores antigos, Java 8, OpenSSL 1.0.x e LibreSSL 2.x não conseguirão se conectar. Teste a compatibilidade dos clientes antes de impor o TLS 1.3 em ambiente de produção.
Execute o testssl.sh novamente para confirmar. Veja os resultados esperados:
|
Protocolo |
Status |
|
SSLv2 |
Não oferecido |
|
SSLv3 |
Não oferecido |
|
TLS 1.0 |
Não oferecido |
|
TLS 1.1 |
Não oferecido |
|
TLS 1.2 |
Não oferecido |
|
TLS 1.3 |
Oferecido |
Somente clientes com suporte a TLS 1.3 poderão se conectar. Qualquer cliente restrito a TLS 1.2 será rejeitado.