Partager via


Configurer TLS avec la gestion automatique des certificats pour sécuriser la communication MQTT dans Azure IoT MQ (préversion)

Important

Opérations Azure IoT (préversion) – activé parc Azure Arc est actuellement en PRÉVERSION. Vous ne devez pas utiliser ce logiciel en préversion dans des environnements de production.

Pour connaître les conditions juridiques qui s’appliquent aux fonctionnalités Azure en version bêta, en préversion ou plus généralement non encore en disponibilité générale, consultez l’Avenant aux conditions d’utilisation des préversions de Microsoft Azure.

Vous pouvez configurer TLS pour sécuriser la communication MQTT entre le répartiteur MQTT et le client à l’aide d’une ressource BrokerListener. Vous pouvez configurer TLS avec la gestion manuelle ou automatique des certificats.

Vérifier l’installation du gestionnaire de certificats

Avec la gestion automatique des certificats, vous utilisez le gestionnaire de certificats pour gérer le certificat de serveur TLS. Par défaut, le gestionnaire de certificats est déjà installé en même temps que les Opérations Azure IoT (préversion) dans l’espace de noms azure-iot-operations. Vérifiez l’installation avant de continuer.

  1. Utilisez kubectl pour rechercher les pods correspondant aux étiquettes d’application du gestionnaire de certificats.

    $ kubectl get pods --namespace azure-iot-operations -l 'app in (cert-manager,cainjector,webhook)'
    NAME                                           READY   STATUS    RESTARTS       AGE
    aio-cert-manager-64f9548744-5fwdd              1/1     Running   4 (145m ago)   4d20h
    aio-cert-manager-cainjector-6c7c546578-p6vgv   1/1     Running   4 (145m ago)   4d20h
    aio-cert-manager-webhook-7f676965dd-8xs28      1/1     Running   4 (145m ago)   4d20h
    
  2. Si vous voyez les pods affichés comme prêts et en cours d’exécution, le gestionnaire de certificats est installé et prêt à être utilisé.

Conseil

Pour vérifier davantage l’installation, consultez la documentation du gestionnaire de certificats vérifier l’installation. N’oubliez pas d’utiliser l’espace de noms azure-iot-operations.

Créer un émetteur pour le certificat de serveur TLS

La ressource émetteur du gestionnaire de certificats définit la façon dont les certificats sont émis automatiquement. Cert-manager prend en charge plusieurs types d’émetteurs en mode natif. Il prend également en charge un type d’émetteur externe pour étendre les fonctionnalités au-delà des émetteurs pris en charge en mode natif. Azure IoT MQ (préversion) peut être utilisé avec n’importe quel type d’émetteur de gestionnaire de certificats.

Important

Pendant le déploiement initial, Opérations Azure IoT est installé avec un émetteur par défaut pour les certificats de serveur TLS. Vous pouvez utiliser cet émetteur pour le développement et le test. Pour plus d’informations, consultez autorité de certification racine et émetteur par défaut avec Opérations Azure IoT. Les étapes ci-dessous ne sont requises que si vous souhaitez utiliser un autre émetteur.

L’approche de création de l’émetteur est différente en fonction de votre scénario. Les sections suivantes répertorient des exemples pour vous aider à commencer.

L’émetteur de l’autorité de certification est utile pour le développement et le test. Il doit être configuré avec un certificat et une clé privée stockés dans un secret Kubernetes.

Configurer le certificat racine en tant que secret Kubernetes

Si vous disposez d’un certificat d’autorité de certification existant, créez un secret Kubernetes avec le certificat d’autorité de certification et les fichiers PEM de clé privée. Exécutez la commande suivante et vous avez configuré le certificat racine en tant que secret Kubernetes et pouvez ignorer la section suivante.

kubectl create secret tls test-ca --cert tls.crt --key tls.key -n azure-iot-operations

Si vous n’avez pas de certificat d’autorité de certification, le gestionnaire de certificats peut générer un certificat d’autorité de certification racine pour vous. L'utilisation du gestionnaire de certificats pour générer un certificat d'autorité de certification racine est connue sous le nom de démarrage d'un émetteur d'autorité de certification à l'aide d'un certificat auto-signé.

  1. Commencez par créer ca.yaml :

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: selfsigned-ca-issuer
      namespace: azure-iot-operations
    spec:
      selfSigned: {}
    ---
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: selfsigned-ca-cert
      namespace: azure-iot-operations
    spec:
      isCA: true
      commonName: test-ca
      secretName: test-ca
      issuerRef:
        # Must match Issuer name above
        name: selfsigned-ca-issuer
        # Must match Issuer kind above
        kind: Issuer
        group: cert-manager.io
      # Override default private key config to use an EC key
      privateKey:
        rotationPolicy: Always
        algorithm: ECDSA
        size: 256
    
  2. Créez le certificat d’autorité de certification auto-signé avec la commande suivante :

    kubectl apply -f ca.yaml
    

Le gestionnaire de certificats crée un certificat d’autorité de certification à l’aide de ses valeurs par défaut. Les propriétés de ce certificat peuvent être modifiées en modifiant la spécification du certificat. Consultez la documentation du gestionnaire de certificats pour obtenir la liste des options valides.

Distribuer le certificat racine

L’exemple précédent stocke le certificat d’autorité de certification dans un secret Kubernetes appelé test-ca. Le certificat au format PEM peut être récupéré à partir du secret et stocké dans un fichier ca.crt avec la commande suivante :

kubectl get secret test-ca -n azure-iot-operations -o json | jq -r '.data["tls.crt"]' | base64 -d > ca.crt

Ce certificat doit être distribué et approuvé par tous les clients. Par exemple, utilisez un indicateur --cafile pour un client mosquitto.

Vous pouvez utiliser Azure Key Vault pour gérer les secrets pour IoT MQ au lieu des secrets Kubernetes. Pour plus d’informations, consultez Gérer les secrets à l’aide d’Azure Key Vault ou de secrets Kubernetes.

Créer un émetteur basé sur un certificat d’autorité de certification

Le gestionnaire de certificats a besoin d’un émetteur basé sur le certificat d’autorité de certification généré ou importé à l’étape précédente. Créez le fichier suivant en tant que issuer-ca.yaml :

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: my-issuer
  namespace: azure-iot-operations
spec:
  ca:
    # Must match secretName of generated or imported CA cert
    secretName: test-ca

Créez l’émetteur avec la commande suivante :

kubectl apply -f issuer-ca.yaml

La commande précédente crée un émetteur pour émettre les certificats de serveur TLS. Notez le nom et le type de l’émetteur. Dans l’exemple, nom my-issuer et type Issuer. Ces valeurs sont définies dans la ressource BrokerListener ultérieurement.

Activer TLS pour un port

Modifiez le paramètre tls dans une ressource BrokerListener pour spécifier un port TLS et un émetteur pour les serveurs frontaux. Voici un exemple de ressource BrokerListener qui active TLS sur le port 8884 avec la gestion automatique des certificats.

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: my-new-tls-listener
  namespace: azure-iot-operations
spec:
  brokerRef: broker
  authenticationEnabled: false # If set to true, a BrokerAuthentication resource must be configured
  authorizationEnabled: false
  serviceType: loadBalancer # Optional; defaults to 'clusterIP'
  serviceName: my-new-tls-listener # Avoid conflicts with default service name 'aio-mq-dmqtt-frontend'
  port: 8884 # Avoid conflicts with default port 8883
  tls:
    automatic:
      issuerRef:
        name: my-issuer
        kind: Issuer

Une fois la ressource BrokerListener configurée, IoT MQ crée automatiquement un service avec le port spécifié et TLS activé.

Facultatif : Configurer les paramètres de certificat de serveur

Les seuls paramètres requis sont issuerRef.name et issuerRef.kind. Toutes les propriétés des certificats de serveur TLS générés sont choisies automatiquement. Toutefois, IoT MQ permet de personnaliser certaines propriétés en les spécifiant dans la ressource BrokerListener, sous tls.automatic.issuerRef. Voici un exemple de toutes les propriétés prises en charge :

# cert-manager issuer for TLS server certificate. Required.
issuerRef:
  # Name of issuer. Required.
  name: my-issuer
  # 'Issuer' or 'ClusterIssuer'. Required.
  kind: Issuer
  # Issuer group. Optional; defaults to 'cert-manager.io'.
  # External issuers may use other groups.
  group: cert-manager.io
# Namespace of certificate. Optional; omit to use default namespace.
namespace: az
# Where to store the generated TLS server certificate. Any existing
# data at the provided secret will be overwritten.
# Optional; defaults to 'my-issuer-{port}'.
secret: my-issuer-8884
# Parameters for the server certificate's private key.
# Optional; defaults to rotationPolicy: Always, algorithm: ECDSA, size: 256.
privateKey:
  rotationPolicy: Always
  algorithm: ECDSA
  size: 256
# Total lifetime of the TLS server certificate. Optional; defaults to '720h' (30 days).
duration: 720h
# When to begin renewing the certificate. Optional; defaults to '240h' (10 days).
renewBefore: 240h
# Any additional SANs to add to the server certificate. Omit if not required.
san:
  dns:
  - iotmq.example.com
  ip:
  - 192.168.1.1

Vérifier le déploiement

Utilisez kubectl pour vérifier que le service associé à la ressource BrokerListener est en cours d’exécution. Dans l’exemple ci-dessus, le nom du service est my-new-tls-listener et l’espace de noms est azure-iot-operations. La commande suivante vérifie l’état du service :

$ kubectl get service my-new-tls-listener -n azure-iot-operations
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-new-tls-listener    LoadBalancer   10.43.241.171   XXX.XX.X.X    8884:32457/TCP   33s

Se connecter au répartiteur avec TLS

Une fois le certificat de serveur configuré, TLS est activé. Pour tester avec mosquitto :

mosquitto_pub -h $HOST -p 8884 -V mqttv5 -i "test" -t "test" -m "test" --cafile ca.crt

L’argument --cafile active TLS sur le client mosquitto et spécifie que le client doit approuver tous les certificats de serveur émis par le fichier donné. Vous devez spécifier un fichier qui contient l’émetteur du certificat de serveur TLS configuré.

Remplacez $HOST par l’hôte approprié :

  • Si vous vous connectez à partir du même cluster, remplacez par le nom du service donné (my-new-tls-listener par exemple) ou le service CLUSTER-IP.
  • Si vous vous connectez à partir de l’extérieur du cluster, le service EXTERNAL-IP.

N’oubliez pas de spécifier les méthodes d’authentification si nécessaire. Par exemple, nom d’utilisateur et mot de passe.

Autorité de certification racine et émetteur par défaut avec Opérations Azure IoT (préversion)

Pour vous aider à commencer, Opérations Azure IoT est déployé avec une autorité de certification racine « démarrage rapide » par défaut et un émetteur pour les certificats de serveur TLS. Vous pouvez utiliser cet émetteur pour le développement et le test.

  • Le certificat d’autorité de certification est auto-signé et non approuvé par des clients en dehors d’Opérations Azure IoT. L’objet du certificat d’autorité de certification est CN = Azure IoT Operations Quickstart Root CA - Not for Production et expire dans 30 jours après l’installation.

  • Le certificat d’autorité de certification racine est stocké dans un secret Kubernetes appelé aio-ca-key-pair-test-only.

  • La partie publique du certificat d’autorité de certification racine est stockée dans un ConfigMap appelé aio-ca-trust-bundle-test-only. Vous pouvez récupérer le certificat d’autorité de certification à partir de ConfigMap et l’inspecter avec kubectl et openssl.

    $ kubectl get configmap aio-ca-trust-bundle-test-only -n azure-iot-operations -o json | jq -r '.data["ca.crt"]' | openssl x509 -text -noout
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number:
                74:d8:b6:fe:63:5a:7d:24:bd:c2:c0:25:c2:d2:c7:94:66:af:36:89
            Signature Algorithm: ecdsa-with-SHA256
            Issuer: CN = Azure IoT Operations Quickstart Root CA - Not for Production
            Validity
                Not Before: Nov  2 00:34:31 2023 GMT
                Not After : Dec  2 00:34:31 2023 GMT
            Subject: CN = Azure IoT Operations Quickstart Root CA - Not for Production
            Subject Public Key Info:
                Public Key Algorithm: id-ecPublicKey
                    Public-Key: (256 bit)
                    pub:
                        04:51:43:93:2c:dd:6b:7e:10:18:a2:0f:ca:2e:7b:
                        bb:ba:5c:78:81:7b:06:99:b5:a8:11:4f:bb:aa:0d:
                        e0:06:4f:55:be:f9:5f:9e:fa:14:75:bb:c9:01:61:
                        0f:20:95:cd:9b:69:7c:70:98:f8:fa:a0:4c:90:da:
                        5b:1a:d7:e7:6b
                    ASN1 OID: prime256v1
                    NIST CURVE: P-256
            X509v3 extensions:
                X509v3 Basic Constraints: critical
                    CA:TRUE
                X509v3 Key Usage: 
                    Certificate Sign
                X509v3 Subject Key Identifier: 
                    B6:DD:8A:42:77:05:38:7A:51:B4:8D:8E:3F:2A:D1:79:32:E9:43:B9
        Signature Algorithm: ecdsa-with-SHA256
            30:44:02:20:21:cd:61:d7:21:86:fd:f8:c3:6d:33:36:53:e3:
            a6:06:3c:a6:80:14:13:55:16:f1:19:a8:85:4b:e9:5d:61:eb:
            02:20:3e:85:8a:16:d1:0f:0b:0d:5e:cd:2d:bc:39:4b:5e:57:
            38:0b:ae:12:98:a9:8f:12:ea:95:45:71:bd:7c:de:9d
    
  • Par défaut, il existe déjà un émetteur d’autorité de certification configuré dans l’espace de noms azure-iot-operations appelé aio-ca-issuer. Il est utilisé comme émetteur d’autorité de certification commun pour tous les certificats de serveur TLS pour les opérations IoT. IoT MQ utilise un émetteur créé à partir du même certificat d’autorité de certification pour émettre des certificats de serveur TLS pour l’écouteur TLS par défaut sur le port 8883. Vous pouvez inspecter l’émetteur avec la commande suivante :

    $ kubectl get issuer aio-ca-issuer -n azure-iot-operations -o yaml
    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      annotations:
        meta.helm.sh/release-name: azure-iot-operations
        meta.helm.sh/release-namespace: azure-iot-operations
      creationTimestamp: "2023-11-01T23:10:24Z"
      generation: 1
      labels:
        app.kubernetes.io/managed-by: Helm
      name: aio-ca-issuer
      namespace: azure-iot-operations
      resourceVersion: "2036"
      uid: c55974c0-e0c3-4d35-8c07-d5a0d3f79162
    spec:
      ca:
        secretName: aio-ca-key-pair-test-only
    status:
      conditions:
      - lastTransitionTime: "2023-11-01T23:10:59Z"
        message: Signing CA verified
        observedGeneration: 1
        reason: KeyPairVerified
        status: "True"
        type: Ready
    

Pour la production, vous devez configurer un émetteur d’autorité de certification avec un certificat d’une autorité de certification approuvée, comme décrit dans les sections précédentes.