Partager via


Sécuriser la communication Azure IoT MQ (préversion) à l’aide de BrokerListener

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.

Pour personnaliser l’accès réseau et la sécurité, utilisez la ressource BrokerListener. Un écouteur correspond à un point de terminaison réseau qui expose le répartiteur au réseau. Vous pouvez avoir une ou plusieurs ressources BrokerListener pour chaque ressource Broker, et donc plusieurs ports avec des contrôles d’accès différents.

Chaque écouteur peut avoir ses propres règles d’authentification et d’autorisation qui définissent qui peut se connecter à l’écouteur et quelles actions ils peuvent effectuer sur le répartiteur. Vous pouvez utiliser les ressources BrokerAuthentication et BrokerAuthorization pour spécifier les stratégies de contrôle d’accès pour chaque écouteur. Cette flexibilité vous permet d’affiner les autorisations et les rôles de vos clients MQTT, en fonction de leurs besoins et de leurs cas d’usage.

La ressource BrokerListener comporte les champs suivants :

Nom du champ Requis Description
brokerRef Oui Nom de la ressource Broker à laquelle appartient cet écouteur. Ce champ est obligatoire et doit correspondre à une ressource Broker existante dans le même espace de noms.
port Oui Numéro de port sur lequel cet écouteur écoute. Ce champ est obligatoire et doit être un numéro de port TCP valide.
serviceType Non Type du service Kubernetes créé pour cet écouteur. Ce sous-champ est facultatif et est défini par défaut sur clusterIp. Doit être loadBalancer, clusterIp ou nodePort.
serviceName Non Nom du service Kubernetes créé pour cet écouteur. Kubernetes crée des enregistrements DNS pour ce serviceName que les clients doivent utiliser pour se connecter à Azure IoT MQ (préversion). Ce sous-champ est facultatif et est défini par défaut sur aio-mq-dmqtt-frontend. Important : si vous avez plusieurs écouteurs avec le même serviceType et serviceName, les écouteurs partagent le même service Kubernetes. Pour plus d’informations, consultez Nom du service et type de service.
authenticationEnabled Non Indicateur booléen qui indique si cet écouteur requiert l’authentification des clients. S’il est défini sur true, cet écouteur utilise toutes les ressources BrokerAuthentication associées pour vérifier et authentifier les clients. S’il est défini sur false, cet écouteur permet à n’importe quel client de se connecter sans authentification. Ce champ est facultatif et est défini par défaut sur false. Pour en savoir plus sur l’authentification, consultez Configurer l’authentification Azure IoT MQ (préversion).
authorizationEnabled Non Indicateur booléen qui indique si cet écouteur requiert une autorisation de la part des clients. S’il est défini sur true, cet écouteur utilise toutes les ressources BrokerAuthorization associées pour vérifier et autoriser les clients. S’il est défini sur false, cet écouteur permet à n’importe quel client de se connecter sans autorisation. Ce champ est facultatif et est défini par défaut sur false. Pour en savoir plus sur l’autorisation, consultez Configurer l’autorisation Azure IoT MQ (préversion).
tls Non Paramètres TLS de l’écouteur. Le champ est facultatif et peut être omis pour désactiver TLS pour l’écouteur. Pour configurer TLS, définissez-le comme l’un des types suivants :
* S’il est défini sur automatic, cet écouteur utilise le gestionnaire de certificats pour obtenir et renouveler un certificat pour l’écouteur. Pour utiliser ce type, spécifiez un champ issuerRef pour référencer l’émetteur du gestionnaire de certificats.
* S’il est défini sur manual, l’écouteur utilise un certificat fourni manuellement pour l’écouteur. Pour utiliser ce type, spécifiez un champ secretName qui référence un secret Kubernetes contenant le certificat et la clé privée.
* S’il est défini sur keyVault, l’écouteur utilise un certificat provenant d’Azure Key Vault. Pour utiliser ce type, spécifiez un champ keyVault qui référence l’instance et le secret Azure Key Vault.
protocol Non Le protocole utilisé par cet écouteur. Ce champ est facultatif et est défini par défaut sur mqtt. Doit être mqtt ou websockets.

BrokerListener par défaut

Lorsque vous déployez Opérations Azure IoT (préversion), le déploiement crée également une ressource BrokerListener nommée listener dans l’espace de noms azure-iot-operations. Cet écouteur est lié à la ressource Broker par défaut nommée broker également créée pendant le déploiement. L’écouteur par défaut expose le répartiteur sur le port 8883 avec TLS et l’authentification SAT activée. Le certificat TLS est automatiquement managé par le gestionnaire de certificats. L’autorisation est désactivée par défaut.

Pour inspecter l’écouteur, exécutez :

kubectl get brokerlistener listener -n azure-iot-operations -o yaml

La sortie doit ressembler à ceci, avec la majorité des métadonnées supprimées par souci de concision :

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: listener
  namespace: azure-iot-operations
spec:
  brokerRef: broker
  authenticationEnabled: true
  authorizationEnabled: false
  port: 8883
  serviceName: aio-mq-dmqtt-frontend
  serviceType: clusterIp
  tls:
    automatic:
      issuerRef:
        group: cert-manager.io
        kind: Issuer
        name: mq-dmqtt-frontend

Pour en savoir plus sur la ressource BrokerAuthentication par défaut liée à cet écouteur, consultez Ressource BrokerAuthentication par défaut.

Créer des BrokerListeners

Cet exemple montre comment créer deux ressources BrokerListener pour une ressource Broker nommée my-broker. Chaque ressource BrokerListener définit un port et un paramètre TLS pour un écouteur qui accepte les connexions MQTT des clients.

  • La première ressource BrokerListener, nommée my-test-listener, définit un écouteur sur le port 1883 sans TLS et avec l’authentification désactivée. Les clients peuvent se connecter au répartiteur sans chiffrement ni authentification.
  • La deuxième ressource BrokerListener, nommée my-secure-listener, définit un écouteur sur le port 8883 avec TLS et l’authentification activée. Seuls les clients authentifiés peuvent se connecter au répartiteur avec le chiffrement TLS. Le champ tls est défini sur automatic, ce qui signifie que l’écouteur utilise le gestionnaire de certificats pour obtenir et renouveler son certificat de serveur.

Pour créer ces ressources BrokerListener, appliquez ce manifeste YAML à votre cluster Kubernetes :

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: my-test-listener
  namespace: azure-iot-operations
spec:
  authenticationEnabled: false
  authorizationEnabled: false
  brokerRef: broker
  port: 1883
---
apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: my-secure-listener
  namespace: azure-iot-operations
spec:
  authenticationEnabled: true
  authorizationEnabled: false
  brokerRef: broker
  port: 8883
  tls:
    automatic:
      issuerRef:
        name: e2e-cert-issuer
        kind: Issuer
        group: cert-manager.io

Nom du service et type de service

Si vous avez plusieurs ressources BrokerListener avec le même serviceType et serviceName, elles partagent le même service Kubernetes. Cela signifie que le service expose tous les ports de tous les écouteurs. Par exemple, si vous avez deux écouteurs avec le même serviceType et serviceName, un sur le port 1883 et l’autre sur le port 8883, le service expose les deux ports. Les clients peuvent se connecter au répartiteur sur l’un ou l’autre des ports.

Il existe deux règles importantes à suivre lorsque vous partagez le nom du service :

  1. Les écouteurs avec le même serviceType doivent avoir le même serviceName.

  2. Les écouteurs avec différents serviceType doivent avoir différents serviceName.

Notamment, le service de l’écouteur par défaut sur le port 8883 est clusterIp et nommé aio-mq-dmqtt-frontend. Le tableau suivant résume ce qui se produit lorsque vous créez un écouteur sur un autre port :

Nouvel écouteur serviceType Nouvel écouteur serviceName Result
clusterIp aio-mq-dmqtt-frontend Le nouvel écouteur est correctement créé et le service expose les deux ports.
clusterIp my-service La création du nouvel écouteur échoue, car le type de service est en conflit avec l’écouteur par défaut.
loadBalancer ou nodePort aio-mq-dmqtt-frontend La création du nouvel écouteur échoue, car le nom du service est en conflit avec l’écouteur par défaut.
loadBalancer ou nodePort my-service Le nouvel écouteur est correctement créé et un nouveau service est créé.