Condividi tramite


Ruotare il certificato di Istanza gestita di SQL abilitata da Azure Arc (connessione indiretta)

Questo articolo descrive come ruotare il certificato Transport Layer Security (TLS) fornito dall'utente per Istanza gestita di SQL abilitata da Azure Arc in modalità con connessione indiretta usando l'interfaccia della riga di comando di Azure o i comandi kubectl.

Gli esempi in questo articolo usano OpenSSL. OpenSSL è un toolkit da riga di comando open source per la crittografia generica e la comunicazione sicura.

Prerequisito

Generare una richiesta di certificato utilizzando openssl

Se l'istanza gestita usa un certificato autofirmato, aggiungere tutti i nomi alternativi del soggetto (SAN) necessari. SAN è un'estensione di X.509 che consente di associare diversi valori a un certificato di sicurezza usando un campo subjectAltName; il campo SAN consente di specificare nomi host aggiuntivi (siti, indirizzi IP, nomi comuni e così via) per la protezione con un singolo certificato SSL, ad esempio un certificato SAN multidominio o un certificato SSL multidominio con convalida estesa.

Per generare il certificato autonomamente, è necessario creare una richiesta di firma del certificato (CSR). Verificare che la configurazione per il certificato abbia un nome comune con i SAN di sicurezza richiesti e che abbia un'autorità di certificazione. Ad esempio:

openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr

Eseguire il comando seguente per verificare i SAN necessari:

openssl x509 -in /<cert path>/<filename>.pem -text

L'esempio seguente mostra questo comando:

openssl x509 -in ./mssql-certificate.pem -text

Il comando restituisce il seguente output:

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-----

Output di esempio:

X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc

Creare la specifica yaml del segreto Kubernetes per il certificato del servizio

  1. Codificare un file usando il comando seguente con Base64 in qualsiasi distribuzione Linux; i dati vengono codificati e decodificati per semplificare la trasmissione e l'archiviazione dei dati.

    base64 /<path>/<file> > cert.txt 
    

    Per gli utenti di Windows, usare l'utilità certutil per eseguire la codifica e la decodifica con Base64 come per il comando seguente:

    $certutil -encode -f input.txt b64-encoded.txt
    

    Rimuovere manualmente l'intestazione nel file di output oppure usare il comando seguente:

    $findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt 
    
  2. Aggiungere il certificato con codifica Base64 e la chiave privata al file di specifica yaml per creare un segreto Kubernetes:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secretName>
    type: Opaque
    data:
      certificate.pem: < base64 encoded certificate >
      privatekey.pem: < base64 encoded private key >
    

Rotazione del certificato tramite l'interfaccia della riga di comando di Azure

Usare il comando seguente specificando il segreto Kubernetes creato in precedenza per ruotare il certificato:

az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>

Ad esempio:

az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret

Usare il comando seguente per ruotare il certificato con le chiavi pubbliche e private del certificato con formattazione PEM. Il comando genera un nome di certificato del servizio predefinito.

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>

Ad esempio:

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

È anche possibile specificare un nome segreto del certificato del servizio Kubernetes per il parametro --service-cert-secret. In questo caso, viene considerato come un nome segreto aggiornato. Il comando controlla se il segreto esiste. In caso contrario, il comando crea un nome segreto, quindi ruota il segreto nell'istanza gestita.

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>

Ad esempio:

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

Ruotare il certificato con il comando kubectl

Dopo aver creato il segreto Kubernetes, è possibile associarlo alla sezione security della definizione yaml di Istanza gestita di SQL in cui è posizionato serviceCertificateSecret come indicato di seguito:

  security:
    adminLoginSecret: <your-admin-login-secret>
    serviceCertificateSecret: <your-cert-secret>

Il file .yaml seguente è un esempio di rotazione de certificato del servizio nell'istanza di SQL denominata mysqlmi; aggiornare la specifica con un segreto Kubernetes denominato 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

Per applicare questa impostazione, è possibile usare il comando kubectl seguente:

   kubectl apply -f <my-sql-mi-yaml-file>