Partager via


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

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

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