Partilhar via


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

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

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