Girar a Instância Gerenciada SQL do certificado habilitada pelo Azure Arc (conectado indiretamente)
Este artigo descreve como girar o certificado TLS (Transport Layer Security) fornecido pelo usuário para a Instância Gerenciada do SQL habilitada pelo Azure Arc no modo conectado indiretamente usando a CLI ou kubectl
comandos do Azure.
Exemplos neste artigo usam OpenSSL. OpenSSL é um kit de ferramentas de linha de comando de código aberto para criptografia de uso geral e comunicação segura.
Pré-requisito
- Instalar o utilitário openssl
- uma Instância Gerenciada SQL habilitada pelo 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 nomes alternativos de entidade (SANs) 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 subjectAltName
campo, o campo SAN permite especificar nomes de host adicionais (sites, endereços IP, nomes comuns e etc.) a serem protegidos por um único certificado SSL, como uma SAN multidomínio ou um certificado SSL multidomínio de validação estendida.
Para gerar um certificado por conta própria, você precisa criar uma solicitação de assinatura de certificado (CSR). Verifique se a configuração do certificado tem um nome comum com as SANs necessárias e tem um emissor de CA. Por exemplo:
openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr
Execute o seguinte comando para verificar as SANs necessárias:
openssl x509 -in /<cert path>/<filename>.pem -text
O exemplo a seguir 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-----
Saída de exemplo:
X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc
Criar especificação yaml secreta do Kubernetes para seu certificado de serviço
Codifique um arquivo usando o seguinte comando com base64 em qualquer distribuição 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 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 use o seguinte comando:
$findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt
Adicione o certificado codificado 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 >
Rotacionando o certificado por meio da CLI do Azure
Use o seguinte comando fornecendo o segredo do Kubernetes que você criou 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ública e privada do certificado formatado 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 secreto de certificado de serviço Kubernetes para --service-cert-secret
o parâmetro. Neste caso, é tomado como um nome secreto atualizado. O comando verifica se o segredo existe. Caso contrário, o comando cria um nome secreto e, em seguida, gira 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 kubectl
o comando
Depois de criar o segredo do Kubernetes, você pode vinculá-lo à seção de definição security
yaml da Instância Gerenciada SQL, localizada serviceCertificateSecret
da seguinte maneira:
security:
adminLoginSecret: <your-admin-login-secret>
serviceCertificateSecret: <your-cert-secret>
O arquivo a seguir .yaml
é um exemplo para girar o certificado de serviço na instância SQL chamada mysqlmi
, atualize 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>