Condividi tramite


Proteggere la comunicazione in anteprima di Azure IoT MQ con BrokerListener

Importante

Anteprima delle operazioni di Azure IoT: abilitata da Azure Arc è attualmente disponibile in ANTEPRIMA. Non è consigliabile usare questo software di anteprima negli ambienti di produzione.

Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.

Per personalizzare l'accesso alla rete e la sicurezza, usare la risorsa BrokerListener . Un listener corrisponde a un endpoint di rete che espone il broker alla rete. È possibile avere una o più risorse BrokerListener per ogni risorsa broker e quindi più porte con controllo di accesso diverso ognuna.

Ogni listener può avere regole di autenticazione e autorizzazione proprie che definiscono chi può connettersi al listener e quali azioni possono eseguire sul broker. È possibile usare le risorse BrokerAuthentication e BrokerAuthorization per specificare i criteri di controllo di accesso per ogni listener. Questa flessibilità consente di ottimizzare le autorizzazioni e i ruoli dei client MQTT, in base alle esigenze e ai casi d'uso.

La risorsa BrokerListener include questi campi:

Nome campo Obbligatorio Descrizione
brokerRef Nome della risorsa broker a cui appartiene il listener. Questo campo è obbligatorio e deve corrispondere a una risorsa broker esistente nello stesso spazio dei nomi.
port Numero di porta su cui il listener è in ascolto. Questo campo è obbligatorio e deve essere un numero di porta TCP valido.
serviceType No Tipo del servizio Kubernetes creato per questo listener. Questo sottocampo è facoltativo e il valore predefinito è clusterIp. Deve essere loadBalancer, clusterIpo nodePort.
serviceName No Nome del servizio Kubernetes creato per questo listener. Kubernetes crea record DNS per questo serviceName che i client devono usare per connettersi all'anteprima MQ di Azure IoT. Questo sottocampo è facoltativo e il valore predefinito è aio-mq-dmqtt-frontend. Importante: se sono presenti più listener con lo stesso serviceType e serviceName, i listener condividono lo stesso servizio Kubernetes. Per altre informazioni, vedere Nome del servizio e tipo di servizio.
authenticationEnabled No Flag booleano che indica se questo listener richiede l'autenticazione dai client. Se impostato su true, questo listener usa tutte le risorse BrokerAuthentication associate a tale listener per verificare ed autenticare i client. Se impostato su false, questo listener consente a qualsiasi client di connettersi senza autenticazione. Questo campo è facoltativo e il valore predefinito è false. Per altre informazioni sull'autenticazione, vedere Configurare l'autenticazione mq di Azure IoT Preview.
authorizationEnabled No Flag booleano che indica se questo listener richiede l'autorizzazione dai client. Se impostato su true, questo listener usa tutte le risorse brokerAuthorization associate per verificare e autorizzare i client. Se impostato su false, questo listener consente a qualsiasi client di connettersi senza autorizzazione. Questo campo è facoltativo e il valore predefinito è false. Per altre informazioni sull'autorizzazione, vedere Configurare l'autorizzazione mq di Azure IoT Preview.
tls No Impostazioni TLS per il listener. Il campo è facoltativo e può essere omesso per disabilitare TLS per il listener. Per configurare TLS, impostarlo uno di questi tipi:
* Se impostato su automatic, questo listener usa cert-manager per ottenere e rinnovare un certificato per il listener. Per usare questo tipo, specificare un issuerRef campo per fare riferimento all'emittente cert-manager.
* Se impostato su manual, il listener usa un certificato fornito manualmente per il listener. Per usare questo tipo, specificare un secretName campo che fa riferimento a un segreto Kubernetes contenente il certificato e la chiave privata.
* Se impostato su keyVault, il listener usa un certificato di Azure Key Vault. Per usare questo tipo, specificare un keyVault campo che faccia riferimento all'istanza e al segreto di Azure Key Vault.
protocol No Protocollo utilizzato dal listener. Questo campo è facoltativo e il valore predefinito è mqtt. Deve essere mqtt o websockets.

BrokerListener predefinito

Quando si distribuisce Azure IoT Operations Preview, la distribuzione crea anche una risorsa BrokerListener denominata listener nello spazio dei azure-iot-operations nomi . Questo listener è collegato alla risorsa Broker predefinita denominata broker creata anche durante la distribuzione. Il listener predefinito espone il broker sulla porta 8883 con l'autenticazione TLS e SAT abilitata. Il certificato TLS viene gestito automaticamente da cert-manager. L'autorizzazione è disabilitata per impostazione predefinita.

Per esaminare il listener, eseguire:

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

L'output dovrebbe essere simile al seguente, con la maggior parte dei metadati rimossi per brevità:

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

Per altre informazioni sulla risorsa BrokerAuthentication predefinita collegata a questo listener, vedere Default BrokerAuthentication resource (Risorsa BrokerAuthentication predefinita).

Creare nuovi BrokerListeners

Questo esempio mostra come creare due nuove risorse BrokerListener per una risorsa broker denominata my-broker. Ogni risorsa BrokerListener definisce una porta e un'impostazione TLS per un listener che accetta connessioni MQTT dai client.

  • La prima risorsa BrokerListener , denominata my-test-listener, definisce un listener sulla porta 1883 senza TLS e l'autenticazione disattivata. I client possono connettersi al broker senza crittografia o autenticazione.
  • La seconda risorsa BrokerListener , denominata my-secure-listener, definisce un listener sulla porta 8883 con TLS e l'autenticazione abilitata. Solo i client autenticati possono connettersi al broker con la crittografia TLS. Il tls campo è impostato su automatic, il che significa che il listener usa cert-manager per ottenere e rinnovare il certificato server.

Per creare queste risorse BrokerListener , applicare questo manifesto YAML al 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

Nome del servizio e tipo di servizio

Se sono presenti più risorse BrokerListener con lo stesso serviceType e serviceName, le risorse condividono lo stesso servizio Kubernetes. Ciò significa che il servizio espone tutte le porte di tutti i listener. Ad esempio, se si dispone di due listener con lo stesso serviceType e serviceName, uno sulla porta 1883 e l'altro sulla porta 8883, il servizio espone entrambe le porte. I client possono connettersi al broker su una delle due porte.

Esistono due regole importanti da seguire quando si condivide il nome del servizio:

  1. I listener con lo stesso serviceType devono condividere lo stesso serviceNameoggetto .

  2. I listener con diversi serviceType devono avere un valore diverso serviceName.

In particolare, il servizio per il listener predefinito sulla porta 8883 è clusterIp e denominato aio-mq-dmqtt-frontend. La tabella seguente riepiloga cosa accade quando si crea un nuovo listener su una porta diversa:

Nuovo listener serviceType Nuovo listener serviceName Risultato
clusterIp aio-mq-dmqtt-frontend Il nuovo listener crea correttamente e il servizio espone entrambe le porte.
clusterIp my-service Il nuovo listener non riesce a creare perché il tipo di servizio è in conflitto con il listener predefinito.
loadBalancer oppure nodePort aio-mq-dmqtt-frontend Il nuovo listener non riesce a creare perché il nome del servizio è in conflitto con il listener predefinito.
loadBalancer oppure nodePort my-service Il nuovo listener crea correttamente e viene creato un nuovo servizio.