Azure IoT Operations では、TLS を使用して、すべてのコンポーネント間の通信が暗号化されます。 この記事では、内部および外部通信用の証明書を管理する方法と、運用環境の展開で内部通信用に独自の証明機関 (CA) 発行者を持ち込む方法について説明します。
[前提条件]
- 外部通信の証明書を管理するには、セキュリティで保護された設定でデプロイされた Azure IoT Operations インスタンスが必要です。 テスト設定を使用して Azure IoT Operations をデプロイした場合は、最初に セキュリティで保護された設定を有効にする必要があります。
内部通信用の証明書を管理する
Azure IoT Operations 内のすべての通信は、TLS を使用して暗号化されます。 開始するのに役立つように、Azure IoT Operations は、TLS サーバー証明書用の既定のルート CA と発行者と共にデプロイされます。 既定のセットアップは、開発とテストの目的で使用できます。 運用環境の展開では、独自の CA 発行者 とエンタープライズ PKI ソリューションを使用することをお勧めします。
TLS サーバー証明書用の既定の自己署名発行者とルート CA 証明書
作業を開始するのに役立つように、Azure IoT Operations は、TLS サーバー証明書用の既定の自己署名発行者とルート CA 証明書と共にデプロイされます。 この発行者を開発とテストに使うことができます。 Azure IoT Operations では、cert-manager を使用して TLS 証明書を管理し、trust-manager を使用して信頼バンドルをコンポーネントに配布します。
CA 証明書は自己署名証明書であるため、Azure IoT Operations の外部のどのクライアントからも信頼されていません。 CA 証明書のサブジェクトは
CN=Azure IoT Operations Quickstart Root CA - Not for Production
です。 CA 証明書は、cert-manager によって自動的にローテーションされます。ルート CA 証明書は、
azure-iot-operations-aio-ca-certificate
名前空間の下にあるcert-manager
という名前の Kubernetes シークレットに格納されます。ルート CA 証明書のパブリック部分は、
azure-iot-operations-aio-ca-trust-bundle
名前空間の下にあるazure-iot-operations
という名前の ConfigMap に格納されます。 ConfigMap から CA 証明書を取得し、kubectl と openssl を使用して調べることができます。 CA 証明書が cert-manager によってローテーションされる場合、ConfigMap は trust-manager によって最新の状態に維持されます。kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o "jsonpath={.data['ca\.crt']}" | openssl x509 -text -noout
Certificate: Data: Version: 3 (0x2) Serial Number: <SERIAL-NUMBER> Signature Algorithm: sha256WithRSAEncryption Issuer: O=Microsoft, CN=Azure IoT Operations Quickstart Root CA - Not for Production Validity Not Before: Sep 18 20:42:19 2024 GMT Not After : Sep 18 20:42:19 2025 GMT Subject: O=Microsoft, CN=Azure IoT Operations Quickstart Root CA - Not for Production Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: <MODULUS> Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Basic Constraints: critical CA:TRUE X509v3 Subject Key Identifier: <SUBJECT-KEY-IDENTIFIER> Signature Algorithm: sha256WithRSAEncryption [Signature]
既定では、
azure-iot-operations namespace
にazure-iot-operations-aio-certificate-issuer
と呼ばれる発行者が既に構成されています。 これは IoT Operations のすべての TLS サーバー証明書のための共通の発行者として使用されます。 MQTT ブローカーでは、自己署名発行者によって署名された同じ CA 証明書から作成された発行者を使用して、ポート 18883 の既定の TLS リスナーに対して TLS サーバー証明書を発行します。 次のコマンドを使用して、発行者を検査できます。kubectl get clusterissuer azure-iot-operations-aio-certificate-issuer -o yaml
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: creationTimestamp: "2024-09-18T20:42:17Z" generation: 1 name: azure-iot-operations-aio-certificate-issuer resourceVersion: "36665" uid: 592700a6-95e0-4788-99e4-ea93934bd330 spec: ca: secretName: azure-iot-operations-aio-ca-certificate status: conditions: - lastTransitionTime: "2024-09-18T20:42:22Z" message: Signing CA verified observedGeneration: 1 reason: KeyPairVerified status: "True" type: Ready
独自の発行者を使用する
運用環境のデプロイでは、証明書を管理するためにエンタープライズ PKI を使用して Azure IoT Operations を設定し、既定の自己署名発行者を使用して内部通信用の TLS 証明書を発行するのではなく、エンタープライズ PKI で動作する独自の CA 発行者を使用することをお勧めします。
内部通信用に独自の発行者で Azure IoT Operations を設定するには、 クラスターにインスタンスをデプロイする前に次の手順を使用します。
クラスターの準備の手順に従ってクラスターを設定します。
cert-managerをインストールします。 cert-manager は TLS 証明書を管理します。
trust-managerをインストールします。 trust-manager のインストール中に、
trust namespace
を cert-manager に設定します。 例えば次が挙げられます。helm upgrade trust-manager jetstack/trust-manager --install --namespace cert-manager --set app.trust.namespace=cert-manager --wait
trust-manager は、信頼バンドルをコンポーネントに配布するために使用されます。
Azure IoT Operations 名前空間を作成します。
kubectl create namespace azure-iot-operations
cert-manager と連携する発行者をデプロイします。 サポートされているすべての発行者の一覧については、cert-manager の発行者を参照してください。
発行者は、
ClusterIssuer
またはIssuer
の種類にすることができます。Issuer
を使用する場合は、発行者リソースを Azure IoT Operations 名前空間に作成する必要があります。Azure IoT Operations 名前空間で信頼バンドルを設定します。
信頼バンドルを設定するには、Azure IoT Operations 名前空間に ConfigMap を作成します。 CA 証明書の公開キー部分を、選択したキー名で構成マップに配置します。
CA 証明書の公開キー部分を取得します。 公開キーを取得する手順は、選択する発行者によって異なります。
ConfigMap を作成します。 例えば次が挙げられます。
kubectl create configmap -n azure-iot-operations <YOUR_CONFIGMAP_NAME> --from-file=<CA_CERTIFICATE_FILENAME_PEM_OR_DER>
Azure IoT Operations のデプロイの手順に従って、"いくつかの変更を加えて" デプロイします。
クラスターの準備中に
--user-trust
パラメーターを追加します。 例えば次が挙げられます。az iot ops init --subscription <SUBSCRIPTION_ID> --cluster <CLUSTER_NAME> -g <RESOURCE_GROUP> --user-trust
Azure IoT Operations のデプロイ中に、必要な情報と共に
--trust-settings
パラメーターを追加します。 例えば次が挙げられます。
az iot ops create --subscription <SUBSCRIPTION_ID> -g <RESOURCE_GROUP> --cluster <CLUSTER_NAME> --custom-___location <CUSTOM_LOCATION> -n <INSTANCE_NAME> --sr-resource-id <SCHEMAREGISTRY_RESOURCE_ID> --trust-settings configMapName=<CONFIGMAP_NAME> configMapKey=<CONFIGMAP_KEY_WITH_PUBLICKEY_VALUE> issuerKind=<CLUSTERISSUER_OR_ISSUER> issuerName=<ISSUER_NAME>
外部通信用の証明書を管理する
外部通信の証明書管理エクスペリエンスでは、クラウド上のマネージド コンテナー ソリューションとして Azure Key Vault が使用されます。 証明書はシークレットとしてキー コンテナーに追加され、 Azure Key Vault シークレット ストア拡張機能を介して Kubernetes シークレットとしてエッジに同期されます。
たとえば、OPC UA 用コネクタは、証明書管理エクスペリエンスを使用して、外部 OPC UA サーバーに対する OPC UA クライアント アプリケーション認証を構成します。 Azure IoT Operations は、OPC UA 用コネクタ用の 2 つの異なる証明書ストアを管理します。1 つは 信頼リスト 用、1 つは 発行者リスト用です。 OPC UA 用コネクタが証明書を使用して OPC UA サーバーとの相互信頼を確立する方法の詳細については、OPC UA 用コネクタの OPC UA 証明書インフラストラクチャを参照してください。
セキュリティで保護された設定で Azure IoT Operations をデプロイすると、Azure Key Vault への証明書の追加を開始し、それらを Kubernetes クラスターに同期して、OPC UA 接続の信頼リストと発行者リスト ストアで使用できます。
証明書のアップロード: 証明書をアップロードし、シークレットとして Azure Key Vault に追加し、シークレット ストア拡張機能を使用してクラスターに自動的に同期します。
ヒント
- アップロードした証明書の詳細を表示して、Azure Key Vault に追加してクラスターに同期する前に、正しい証明書があることを確認します。
- 後でシークレットを表すシークレットを認識できるように、わかりやすい名前を使用します。
注
証明書をアップロードするだけでは、シークレットは Azure Key Vault に追加され、クラスターに同期されません。変更を適用するには、[ 適用 ] を選択する必要があります。
Azure Key Vault からの追加: クラスターに同期する Azure Key Vault から既存のシークレットを追加します。
注
クラスターに同期する証明書を保持するシークレットを選択してください。 正しい証明書ではないシークレットを選択すると、接続が失敗します。
リスト ビューを使用すると、同期された証明書を管理できます。 同期されたすべての証明書と、同期先の証明書ストアを表示できます。
- 信頼リストと発行者リスト ストアの詳細については、「OPC UA 用コネクタの OPC UA 証明書インフラストラクチャを構成する」を参照してください。
同期された証明書も削除できます。 同期された証明書を削除すると、同期された証明書のみが Kubernetes クラスターから削除され、含まれているシークレット参照は Azure Key Vault から削除されません。 証明書シークレットは、キー コンテナーから手動で削除する必要があります。