Rotacionar certificado SQL Managed Instance habilitado pelo Azure Arc (indiretamente conectado)
Este artigo descreve como girar o certificado de protocolo TLS fornecido pelo usuário para Instâncias Gerenciadas de SQL habilitadas para Azure Arc no modo conectado indiretamente usando a CLI do Azure ou comandos kubectl
.
Os exemplos neste artigo usam OpenSSL. O OpenSSL é um kit de ferramentas de linha de comando de software livre para criptografia de uso geral e comunicação segura.
Pré-requisito
- Instalar o utilitário openssl
- uma Instância Gerenciada de SQL habilitada para Azure Arc no modo conectado indiretamente
Gerar solicitação de certificado usando openssl
Se a instância gerenciada usar um certificado autoassinado, adicione todos os SANs (Nomes Alternativos de Entidade) necessários. A SAN é uma extensão para X.509 que permite que vários valores sejam associados a um certificado de segurança usando um campo subjectAltName
. O campo SAN permite que você especifique nomes de host adicionais (sites, endereços IP, nomes comuns etc.) a serem protegidos por um certificado SSL, como uma SAN de vários domínios ou certificado SSL de vários domínios de validação estendida.
Para gerar um certificado por conta própria, você precisa criar uma CSR (solicitação de assinatura de certificado). Verifique se a configuração do certificado tem um nome comum com os SANs necessários e tem um emissor de AC. Por exemplo:
openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr
Execute o seguinte comando para verificar os SANs necessários:
openssl x509 -in /<cert path>/<filename>.pem -text
O seguinte exemplo demonstra esse comando:
openssl x509 -in ./mssql-certificate.pem -text
O comando retorna a seguinte saída:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 7686530591430793847 (0x6aac0ad91167da77)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = Cluster Certificate Authority
Validity
Not Before: Mmm dd hh:mm:ss yyyy GMT
Not After: Mmm dd hh:mm:ss yyyy GMT
Subject: CN = mi4-svc
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:ad:7e:16:3e:7d:b3:1e: ...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Extended Key Usage: critical
TLS Web Client Authentication, TLS Web Server Authentication
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:mi4-svc, DNS:mi4-svc.test.svc.cluster.local, DNS:mi4-svc.test.svc
Signature Algorithm: sha256WithRSAEncryption
7a:f8:a1:25:5c:1d:e2:b4: ...
-----BEGIN CERTIFICATE-----
MIIDNjCCAh6gAwIB ...==
-----END CERTIFICATE-----
Exemplo de saída:
X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc
Criar uma especificação yaml de segredo do Kubernetes para o certificado de serviço
Codifique um arquivo usando o comando a seguir com base64 em qualquer distribuição do Linux. Os dados são codificados e decodificados para facilitar o processo de transmissão e armazenamento de dados.
base64 /<path>/<file> > cert.txt
Para usuários do Windows, use o utilitário certutil para executar a codificação e a decodificação Base64 como o seguinte comando:
$certutil -encode -f input.txt b64-encoded.txt
Remova o cabeçalho no arquivo de saída manualmente ou usando o seguinte comando:
$findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt
Adicione o certificado codificado em base64 e a chave privada ao arquivo de especificação yaml para criar um segredo do Kubernetes:
apiVersion: v1 kind: Secret metadata: name: <secretName> type: Opaque data: certificate.pem: < base64 encoded certificate > privatekey.pem: < base64 encoded private key >
Girar o certificado por meio da CLI do Azure
Use o seguinte comando, fornecendo o segredo do Kubernetes criado anteriormente para girar o certificado:
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>
Por exemplo:
az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret
Use o comando a seguir para girar o certificado com as chaves públicas e privadas do certificado em formato PEM. O comando gera um nome de certificado de serviço padrão.
az sql mi-arc update -n <managed instance name> --k8s-namespace arc --use-k8s --cert-public-key-file <path-to-my-cert-public-key> --cert-private-key-file <path-to-my-cert-private-key> --k8s-namespace <your-k8s-namespace>
Por exemplo:
az sql mi-arc update -n mysqlmi --k8s-namespace arc --use-k8s --cert-public-key-file ./mi1-1-cert --cert-private-key-file ./mi1-1-pvt
Você também pode fornecer um nome de segredo do certificado do serviço Kubernetes para o parâmetro --service-cert-secret
. Nesse caso, ele é considerado como um nome de segredo atualizado. O comando verifica se o segredo existe. Se ele não existir, o comando criará um nome de segredo e girará o segredo na instância gerenciada.
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --cert-public-key-file <path-to-my-cert-public-key> --cert-private-key-file <path-to-my-cert-private-key> --service-cert-secret <path-to-mymi-cert-secret>
Por exemplo:
az sql mi-arc update -n mysqlmi --k8s-namespace arc --use-k8s --cert-public-key-file ./mi1-1-cert --cert-private-key-file ./mi1-1-pvt --service-cert-secret mi1-12-1-cert-secret
Girar o certificado com o comando kubectl
Depois de criar o segredo do Kubernetes, você poderá a associá-lo à seção security
da definição yaml de Instância Gerenciada de SQL na qual serviceCertificateSecret
está localizado, da seguinte forma:
security:
adminLoginSecret: <your-admin-login-secret>
serviceCertificateSecret: <your-cert-secret>
O seguinte arquivo .yaml
é um exemplo para girar o certificado de serviço na instância de SQL chamada mysqlmi
e atualizar a especificação com um segredo do Kubernetes chamado my-service-cert
:
apiVersion: sql.arcdata.microsoft.com/v1
kind: sqlmanagedinstance
metadata:
name: mysqlmi
namespace: my-arc-namespace
spec:
spec:
dev: false
licenseType: LicenseIncluded
replicas: 1
security:
adminLoginSecret: mysqlmi-admin-login-secret
# Update the serviceCertificateSecret with name of the K8s secret
serviceCertificateSecret: my-service-cert
services:
primary:
type: NodePort
storage:
data:
volumes:
- size: 5Gi
logs:
volumes:
- size: 5Gi
tier: GeneralPurpose
Você pode usar o seguinte comando kubectl para aplicar essa configuração:
kubectl apply -f <my-sql-mi-yaml-file>