Rotation du certificat SQL Managed Instance activé par Azure Arc (indirectement connecté)
Cet article explique comment faire pivoter le certificat Transport Layer Security (TLS) fourni par l’utilisateur pour SQL Managed Instance activé par Azure Arc en mode indirectement connecté à l’aide d’Azure CLI ou de commandes kubectl
.
Les exemples de cet article utilisent OpenSSL. OpenSSL est une boîte à outils de ligne de commande open source pour la cryptographie à usage général et la communication sécurisée.
Prérequis
- Installer l’utilitaire OpenSSL
- une instance SQL Managed Instance activée par Azure Arc en mode indirectement connecté
Générer une demande de certificat à l’aide de openssl
Si l’instance gérée utilise un certificat auto-signé, ajoutez tous les autres noms d’objet (SAN) nécessaires. SAN est une extension de X.509 qui permet d’associer différentes valeurs à un certificat de sécurité en utilisant un champ subjectAltName
; le champ SAN vous permet de spécifier des noms d’hôtes supplémentaires (sites, adresses IP, noms communs, etc.) à protéger par un certificat SSL unique, comme un SAN à plusieurs domaines ou un certificat SSL multidomaine de validation étendue.
Pour générer votre propre certificat, vous devez créer une demande de signature de certificat (CSR). Vérifiez que la configuration du certificat a un nom commun avec les réseaux SAN requis et qu’il a un émetteur d’autorité de certification. Par exemple :
openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr
Exécutez la commande suivante pour vérifier les SAN requis :
openssl x509 -in /<cert path>/<filename>.pem -text
L’exemple ci-dessous montre cette commande :
openssl x509 -in ./mssql-certificate.pem -text
Cette commande renvoie la sortie suivante :
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-----
Exemple de sortie :
X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc
Créer une spécification Kubernetes secret YAML pour votre certificat de service
Encoder un fichier à l’aide de la commande suivante avec base64 dans une distribution Linux, les données sont encodées et décodées pour faciliter la transmission et le stockage des données.
base64 /<path>/<file> > cert.txt
Pour les utilisateurs Windows, utilisez l’utilitaire certutil pour effectuer l’encodage et le décodage Base64 en tant que commande suivante :
$certutil -encode -f input.txt b64-encoded.txt
Supprimez manuellement l’en-tête dans le fichier de sortie ou utilisez la commande suivante :
$findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt
Ajoutez le certificat encodé en base64 et la clé privée au fichier de spécification YAML pour créer un secret Kubernetes :
apiVersion: v1 kind: Secret metadata: name: <secretName> type: Opaque data: certificate.pem: < base64 encoded certificate > privatekey.pem: < base64 encoded private key >
Rotation du certificat via Azure CLI
Utilisez la commande suivante en fournissant le secret Kubernetes que vous avez créée précédemment pour faire pivoter le certificat :
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>
Par exemple :
az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret
Utilisez la commande suivante pour faire pivoter le certificat avec les clés publiques et privées du certificat au format PEM. La commande génère un nom de certificat de service par défaut.
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>
Par exemple :
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
Vous pouvez également fournir un nom de secret de certificat de service Kubernetes pour le paramètre --service-cert-secret
. Dans ce cas, il est considéré comme un nom de secret mis à jour. La commande vérifie si le secret existe. Si ce n’est pas le cas, la commande crée un nom de secret, puis fait pivoter le secret dans l’instance gérée.
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>
Par exemple :
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
Faire pivoter le certificat avec la commande kubectl
Une fois que vous avez créé le secret Kubernetes, vous pouvez le lier à la section de définition yaml SQL Managed Instance security
où serviceCertificateSecret
s’y trouve comme suit :
security:
adminLoginSecret: <your-admin-login-secret>
serviceCertificateSecret: <your-cert-secret>
Le fichier .yaml
suivant est un exemple de rotation du certificat de service dans l’instance SQL nommée mysqlmi
, mettez à jour la spécification avec un secret Kubernetes nommé 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
Vous pouvez utiliser la commande kubectl suivante pour appliquer ce paramètre :
kubectl apply -f <my-sql-mi-yaml-file>