Compartilhar via


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

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

  1. 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 
    
  2. 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>