Konfigurowanie protokołu TLS przy użyciu ręcznego zarządzania 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.

Aby ręcznie skonfigurować usługę Azure IoT MQ (wersja zapoznawcza) do używania określonego certyfikatu TLS, określ go w zasobie BrokerListener z odwołaniem do wpisu tajnego kubernetes. Następnie wdróż go przy użyciu narzędzia kubectl. W tym artykule przedstawiono przykład konfigurowania protokołu TLS z certyfikatami z podpisem własnym na potrzeby testowania.

Tworzenie urzędu certyfikacji przy użyciu interfejsu wiersza polecenia kroku

Krok to menedżer certyfikatów, który umożliwia szybkie rozpoczęcie pracy podczas tworzenia własnego prywatnego urzędu certyfikacji i zarządzania nim.

  1. Zainstaluj krok interfejsu wiersza polecenia i utwórz certyfikat i klucz głównego urzędu certyfikacji.

    step certificate create --profile root-ca "Example Root CA" root_ca.crt root_ca.key
    
  2. Utwórz certyfikat pośredniego urzędu certyfikacji i klucz podpisany przez główny urząd certyfikacji.

    step certificate create --profile intermediate-ca "Example Intermediate CA" intermediate_ca.crt intermediate_ca.key \
    --ca root_ca.crt --ca-key root_ca.key
    

Tworzenie certyfikatu serwera

Użyj kroku interfejsu wiersza polecenia, aby utworzyć certyfikat serwera na podstawie certyfikatu podpisanego przez pośredni urząd certyfikacji.

step certificate create mqtts-endpoint mqtts-endpoint.crt mqtts-endpoint.key \
--profile leaf \
--not-after 8760h \
--san mqtts-endpoint \
--san localhost \
--ca intermediate_ca.crt --ca-key intermediate_ca.key \
--no-password --insecure

mqtts-endpoint W tym miejscu znajdują localhost się alternatywne nazwy podmiotów (SAN) dla frontonu brokera usługi Azure IoT MQ na platformie Kubernetes i klientach lokalnych. Aby nawiązać połączenie za pośrednictwem Internetu, dodaj element --san z zewnętrznym adresem IP. Flagi --no-password --insecure są używane do testowania w celu pomijania monitów o hasło i wyłączania ochrony haseł dla klucza prywatnego, ponieważ są one przechowywane w kluczu tajnym kubernetes. W środowisku produkcyjnym użyj hasła i zapisz klucz prywatny w bezpiecznej lokalizacji, takiej jak Azure Key Vault.

Wymagania dotyczące algorytmu klucza certyfikatu

Obsługiwane są zarówno klucze EC, jak i RSA, ale wszystkie certyfikaty w łańcuchu muszą używać tego samego algorytmu klucza. W przypadku importowania własnych certyfikatów urzędu certyfikacji upewnij się, że certyfikat serwera używa tego samego algorytmu klucza co urzędy certyfikacji.

Importowanie łańcucha certyfikatów serwera jako wpisu tajnego platformy Kubernetes

  1. Utwórz pełny łańcuch certyfikatów serwera, w którym kolejność certyfikatów ma znaczenie: certyfikat serwera jest pierwszym w pliku, pośrednim jest drugi.

    cat  mqtts-endpoint.crt intermediate_ca.crt  > server_chain.pem
    
  2. Utwórz wpis tajny kubernetes z łańcuchem certyfikatów serwera i kluczem serwera przy użyciu narzędzia kubectl.

    kubectl create secret tls server-cert-secret -n azure-iot-operations \
    --cert server_chain.crt \
    --key mqtts-endpoint.key
    

Włączanie protokołu TLS dla odbiornika

Zmodyfikuj tls ustawienie w zasobie BrokerListener, aby określić ręczną konfigurację protokołu TLS odwołującą się do wpisu tajnego kubernetes. Zanotuj nazwę wpisu tajnego używanego dla certyfikatu serwera TLS (server-cert-secret w przykładzie wcześniej).

apiVersion: mq.iotoperations.azure.com/v1beta1
kind: BrokerListener
metadata:
  name: manual-tls-listener
  namespace: azure-iot-operations
spec:
  brokerRef: broker
  authenticationEnabled: false # If true, BrokerAuthentication must be configured
  authorizationEnabled: false
  serviceType: loadBalancer # Optional, defaults to clusterIP
  serviceName: mqtts-endpoint # Match the SAN in the server certificate
  port: 8885 # Avoid port conflict with default listener at 8883
  tls:
    manual:
      secretName: server-cert-secret

Po utworzeniu zasobu BrokerListener operator automatycznie tworzy usługę Kubernetes i wdraża odbiornik. Stan usługi można sprawdzić, uruchamiając polecenie kubectl get svc.

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

Aby przetestować połączenie TLS z klientem mosquitto, opublikuj komunikat i przekaż certyfikat głównego urzędu certyfikacji w parametrze --cafile.

$ mosquitto_pub -d -h localhost -p 8885 -i "my-client" -t "test-topic" -m "Hello" --cafile root_ca.crt
Client my-client sending CONNECT
Client my-client received CONNACK (0)
Client my-client sending PUBLISH (d0, q0, r0, m1, 'test-topic', ... (5 bytes))
Client my-client sending DISCONNECT

Napiwek

Aby użyć hosta lokalnego, port musi być dostępny na maszynie hosta. Na przykład kubectl port-forward svc/mqtts-endpoint 8885:8885 -n azure-iot-operations. W przypadku niektórych dystrybucji kubernetes, takich jak K3d, można dodać przekierowany port za pomocą polecenia k3d cluster edit $CLUSTER_NAME --port-add 8885:8885@loadbalancer.

Uwaga

Aby nawiązać połączenie z brokerem, musisz dystrybuować katalog główny zaufania do klientów, nazywany również pakietem zaufania. W takim przypadku katalog główny zaufania to główny urząd certyfikacji z podpisem własnym utworzony krok interfejsu wiersza polecenia. Dystrybucja katalogu głównego zaufania jest wymagana, aby klient zweryfikował łańcuch certyfikatów serwera. Jeśli klienci MQTT są obciążeniami w klastrze Kubernetes, należy również utworzyć obiekt ConfigMap z głównym urzędem certyfikacji i zainstalować go w zasobniku.

Pamiętaj, aby określić nazwę użytkownika, hasło itp., jeśli jest włączone uwierzytelnianie MQ.

Użyj zewnętrznego adresu IP dla certyfikatu serwera

Aby nawiązać połączenie z protokołem TLS przez Internet, certyfikat serwera usługi Azure IoT MQ musi mieć zewnętrzną nazwę hosta jako sieć SAN. W środowisku produkcyjnym jest to zazwyczaj nazwa DNS lub dobrze znany adres IP. Jednak podczas tworzenia i testowania możesz nie wiedzieć, jaka nazwa hosta lub zewnętrzny adres IP jest przypisywany przed wdrożeniem. Aby rozwiązać ten problem, najpierw wdróż odbiornik bez certyfikatu serwera, a następnie utwórz certyfikat serwera i wpis tajny przy użyciu zewnętrznego adresu IP, a następnie zaimportuj wpis tajny do odbiornika.

Jeśli spróbujesz wdrożyć przykładowy odbiornik manual-tls-listener TLS, ale przywoływał wpis tajny server-cert-secret Kubernetes nie istnieje, skojarzona usługa zostanie utworzona, ale zasobniki nie zostaną uruchomione. Usługa jest tworzona, ponieważ operator musi zarezerwować zewnętrzny adres IP dla odbiornika.

$ kubectl get svc mqtts-endpoint -n azure-iot-operations
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
mqtts-endpoint         LoadBalancer   10.43.93.6      172.18.0.2    8885:30674/TCP      1m15s

Jednak to zachowanie jest oczekiwane i można pozostawić je tak podczas importowania certyfikatu serwera. Dzienniki menedżera kondycji wspominają, że usługa Azure IoT MQ czeka na certyfikat serwera.

$ kubectl logs -l app=health-manager -n azure-iot-operations
...
<6>2023-11-06T21:36:13.634Z [INFO] [1] - Server certificate server-cert-secret not found. Awaiting creation of secret.

Uwaga

Ogólnie rzecz biorąc, w systemie rozproszonym dzienniki zasobników nie są deterministyczne i powinny być używane ostrożnie. Właściwym sposobem, aby uzyskać takie informacje, jest użycie zdarzeń platformy Kubernetes i stanu zasobu niestandardowego, które znajduje się na liście prac. Rozważmy poprzedni krok jako tymczasowe obejście.

Mimo że zasobniki frontonu nie są gotowe, zewnętrzny adres IP jest już dostępny.

$ kubectl get svc mqtts-endpoint -n azure-iot-operations
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
mqtts-endpoint         LoadBalancer   10.43.93.6      172.18.0.2    8885:30674/TCP      1m15s

W tym miejscu wykonaj te same kroki co poprzednio, aby utworzyć certyfikat serwera z tym zewnętrznym adresem IP w --san programie i utworzyć wpis tajny Kubernetes w taki sam sposób. Po utworzeniu wpisu tajnego jest on automatycznie importowany do odbiornika.