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
- Installare l'utilità openssl
- un'Istanza gestita di SQL abilitata da Azure Arc in modalità di connessione indiretta
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
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
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>