Konfigurowanie protokołu TLS z automatycznym zarządzaniem certyfikatami w celu zabezpieczenia komunikacji MQTT w wersji zapoznawczej usługi Azure IoT MQ

Ważne

Usługa Azure IoT Operations Preview — włączona przez usługę Azure Arc jest obecnie dostępna w wersji zapoznawczej. Nie należy używać tego oprogramowania w wersji zapoznawczej w środowiskach produkcyjnych.

Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.

Protokół TLS można skonfigurować tak, aby zabezpieczyć komunikację MQTT między brokerem MQTT i klientem przy użyciu zasobu BrokerListener. Protokół TLS można skonfigurować za pomocą ręcznego lub automatycznego zarządzania certyfikatami.

Weryfikowanie instalacji menedżera certyfikatów

Automatyczne zarządzanie certyfikatami umożliwia zarządzanie certyfikatem serwera TLS za pomocą menedżera certyfikatów. Domyślnie program cert-manager jest instalowany wraz z wersją zapoznawcza operacji usługi Azure IoT w azure-iot-operations przestrzeni nazw. Przed kontynuowaniem sprawdź instalację.

  1. Służy kubectl do sprawdzania zasobników pasujących do etykiet aplikacji cert-manager.

    $ 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. Jeśli zobaczysz zasobniki wyświetlane jako gotowe i uruchomione, narzędzie cert-manager jest zainstalowane i gotowe do użycia.

Napiwek

Aby jeszcze bardziej zweryfikować instalację, zapoznaj się z dokumentacją narzędzia cert-manager, aby zweryfikować instalację. Pamiętaj, aby użyć azure-iot-operations przestrzeni nazw.

Tworzenie wystawcy dla certyfikatu serwera TLS

Zasób wystawcy certyfikatu definiuje sposób automatycznego wystawiania certyfikatów. Menedżer certyfikatów obsługuje natywnie kilka typów wystawców. Obsługuje również zewnętrzny typ wystawcy na potrzeby rozszerzania funkcji poza natywnie obsługiwanymi wystawcami. Wersja zapoznawcza usługi Azure IoT MQ może być używana z dowolnym typem wystawcy cert-manager.

Ważne

Podczas początkowego wdrażania operacje usługi Azure IoT są instalowane z domyślnym wystawcą dla certyfikatów serwera TLS. Tego wystawcy można użyć do programowania i testowania. Aby uzyskać więcej informacji, zobacz Domyślny główny urząd certyfikacji i wystawca przy użyciu operacji usługi Azure IoT. Poniższe kroki są wymagane tylko wtedy, gdy chcesz użyć innego wystawcy.

Podejście do tworzenia wystawcy różni się w zależności od scenariusza. W poniższych sekcjach wymieniono przykłady ułatwiające rozpoczęcie pracy.

Wystawca urzędu certyfikacji jest przydatny do programowania i testowania. Należy go skonfigurować przy użyciu certyfikatu i klucza prywatnego przechowywanego w kluczu tajnym kubernetes.

Konfigurowanie certyfikatu głównego jako wpisu tajnego kubernetes

Jeśli masz istniejący certyfikat urzędu certyfikacji, utwórz wpis tajny Kubernetes z certyfikatem urzędu certyfikacji i plikami PEM klucza prywatnego. Uruchom następujące polecenie i skonfigurowaliśmy certyfikat główny jako wpis tajny kubernetes i możesz pominąć następną sekcję.

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

Jeśli nie masz certyfikatu urzędu certyfikacji, menedżer certyfikatów może wygenerować certyfikat głównego urzędu certyfikacji. Generowanie certyfikatu głównego urzędu certyfikacji przy użyciu menedżera certyfikatu jest nazywane uruchamianiem wystawcy urzędu certyfikacji z certyfikatem z podpisem własnym.

  1. Zacznij od utworzenia elementu 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. Utwórz certyfikat urzędu certyfikacji z podpisem własnym za pomocą następującego polecenia:

    kubectl apply -f ca.yaml
    

Menedżer certyfikatów tworzy certyfikat urzędu certyfikacji przy użyciu jego wartości domyślnych. Właściwości tego certyfikatu można zmienić, modyfikując specyfikację certyfikatu. Aby uzyskać listę prawidłowych opcji, zobacz dokumentację menedżera certyfikatów.

Dystrybuowanie certyfikatu głównego

Poprzedni przykład przechowuje certyfikat urzędu certyfikacji w kluczu tajnym Kubernetes o nazwie test-ca. Certyfikat w formacie PEM można pobrać z wpisu tajnego i przechowywać w pliku ca.crt za pomocą następującego polecenia:

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

Ten certyfikat musi być dystrybuowany i zaufany przez wszystkich klientów. Na przykład użyj --cafile flagi dla klienta mosquitto.

Za pomocą usługi Azure Key Vault można zarządzać wpisami tajnymi dla Wpisów tajnych IoT MQ zamiast wpisów tajnych platformy Kubernetes. Aby dowiedzieć się więcej, zobacz Zarządzanie wpisami tajnymi przy użyciu usługi Azure Key Vault lub wpisów tajnych platformy Kubernetes.

Tworzenie wystawcy na podstawie certyfikatu urzędu certyfikacji

Menedżer certyfikatów wymaga wystawcy na podstawie certyfikatu urzędu certyfikacji wygenerowanego lub zaimportowanego we wcześniejszym kroku. Utwórz następujący plik jako 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

Utwórz wystawcę za pomocą następującego polecenia:

kubectl apply -f issuer-ca.yaml

Poprzednie polecenie tworzy wystawcę do wystawiania certyfikatów serwera TLS. Zanotuj nazwę i rodzaj wystawcy. W przykładzie nadaj nazwę my-issuer i rodzaj Issuer. Te wartości są ustawiane w zasobie BrokerListener później.

Włączanie protokołu TLS dla portu

Zmodyfikuj tls ustawienie w zasobie BrokerListener, aby określić port TLS i wystawcę dla frontonów. Poniżej przedstawiono przykład zasobu BrokerListener, który umożliwia protokół TLS na porcie 8884 z automatycznym zarządzaniem certyfikatami.

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

Po skonfigurowaniu zasobu BrokerListener usługa IoT MQ automatycznie tworzy nową usługę z włączonym określonym portem i protokołem TLS.

Opcjonalne: Konfigurowanie parametrów certyfikatu serwera

Jedynymi wymaganymi parametrami są issuerRef.name i issuerRef.kind. Wszystkie właściwości wygenerowanych certyfikatów serwera TLS są wybierane automatycznie. Jednak usługa IoT MQ umożliwia dostosowanie niektórych właściwości przez określenie ich w zasobie BrokerListener w obszarze tls.automatic.issuerRef. Poniżej przedstawiono przykład wszystkich obsługiwanych właściwości:

# 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

Weryfikowanie wdrożenia

Użyj narzędzia kubectl, aby sprawdzić, czy usługa skojarzona z zasobem BrokerListener jest uruchomiona. W powyższym przykładzie nazwa usługi to my-new-tls-listener , a przestrzeń nazw to azure-iot-operations. Następujące polecenie sprawdza stan usługi:

$ 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

Połączenie do brokera przy użyciu protokołu TLS

Po skonfigurowaniu certyfikatu serwera protokół TLS jest włączony. Aby przetestować z mosquitto:

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

--cafile Argument włącza protokół TLS na kliencie mosquitto i określa, że klient powinien ufać wszystkim certyfikatom serwera wystawionym przez dany plik. Należy określić plik zawierający wystawcę skonfigurowanego certyfikatu serwera TLS.

Zastąp $HOST element odpowiednim hostem:

  • Jeśli nawiązujesz połączenie z poziomu tego samego klastra, zastąp ciąg nazwą usługi podaną (my-new-tls-listener na przykład) lub usługą CLUSTER-IP.
  • W przypadku nawiązywania połączenia spoza klastra usługa EXTERNAL-IP.

Pamiętaj, aby w razie potrzeby określić metody uwierzytelniania. Na przykład nazwa użytkownika i hasło.

Domyślny główny urząd certyfikacji i wystawca w usłudze Azure IoT Operations Preview

Aby ułatwić rozpoczęcie pracy, operacje usługi Azure IoT są wdrażane przy użyciu domyślnego głównego urzędu certyfikacji "Szybki start" i wystawcy dla certyfikatów serwera TLS. Tego wystawcy można użyć do programowania i testowania.

  • Certyfikat urzędu certyfikacji jest z podpisem własnym i nie jest zaufany przez żadnych klientów spoza operacji usługi Azure IoT. Podmiot certyfikatu urzędu certyfikacji jest CN = Azure IoT Operations Quickstart Root CA - Not for Production i wygasa w ciągu 30 dni od momentu instalacji.

  • Certyfikat głównego urzędu certyfikacji jest przechowywany w kluczu tajnym kubernetes o nazwie aio-ca-key-pair-test-only.

  • Publiczna część certyfikatu głównego urzędu certyfikacji jest przechowywana w ConfigMap o nazwie aio-ca-trust-bundle-test-only. Możesz pobrać certyfikat urzędu certyfikacji z obiektu ConfigMap i sprawdzić go za pomocą narzędzia kubectl i 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
    
  • Domyślnie w azure-iot-operations przestrzeni nazw jest już skonfigurowany wystawca urzędu certyfikacji o nazwie aio-ca-issuer. Jest on używany jako wspólny wystawca urzędu certyfikacji dla wszystkich certyfikatów serwera TLS dla operacji IoT. Usługa IoT MQ używa wystawcy utworzonego na podstawie tego samego certyfikatu urzędu certyfikacji do wystawiania certyfikatów serwera TLS dla domyślnego odbiornika TLS na porcie 8883. Wystawcę można sprawdzić za pomocą następującego polecenia:

    $ 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
    

W środowisku produkcyjnym należy skonfigurować wystawcę urzędu certyfikacji z certyfikatem z zaufanego urzędu certyfikacji, zgodnie z opisem w poprzednich sekcjach.