Azure IoT Operations のセキュリティで保護された設定には、OPC UA サーバーやデータ フロー エンドポイントなどのクラウド接続用のシークレット管理およびユーザー割り当てマネージド ID のセットアップが含まれます。
この記事では、初期デプロイ中に有効にしなかった場合にセキュリティで保護された設定を有効にする手順について説明します。
Prerequisites
- テスト設定でデプロイされた Azure IoT Operations インスタンス。
開発用コンピューターにインストールされているAzure CLI。 利用可能な Azure CLI 拡張機能で、azure-iot-ops 拡張機能を使用するために必要な最小バージョンを確認してください。
az --versionを使用してバージョンを確認し、必要に応じてaz upgradeを使用して更新します。 詳細については、「 Azure CLI のインストール」を参照してください。Azure CLIのAzure IoT Operations拡張機能。 次のコマンドを使用して、拡張機能を追加するか、それを最新バージョンに更新します。
az extension add --upgrade --name azure-iot-ops
Azure CLI 用の connectedk8s 拡張機能の最新バージョン。 次のコマンドを使用して、拡張機能を追加するか、それを最新バージョンに更新します。
az extension add --upgrade --name connectedk8s
この記事のAzure CLI例は環境変数を使っており、各値を一度設定してからコマンドをコピー&ペーストできます as-is。 クイックスタートのAzure IoT Operations Codespaces環境を使っている場合、これらの変数はすでに設定済みなので、このステップを省略できます。 そうでなければ、コマンドを実行する前にシェル内で以下の環境変数を設定してください。
以下のスクリプトは、最も一般的に使われる環境変数を設定します。
| 環境変数 | Description |
|---|---|
SUBSCRIPTION_ID |
Azure IoT Operationsインスタンスを含むサブスクリプションのIDです。 |
RESOURCE_GROUP |
あなたのAzure IoT Operationsインスタンスを含むリソースグループの名前です。 |
AIO_INSTANCE_NAME |
あなたのAzure IoT Operationsインスタンスの名前です。 インスタンスを挙げるには、 az iot ops list -o tableを実行してください。 |
CLUSTER_NAME |
あなたのインスタンスをホストしているAzure Arc対応のKubernetesクラスターの名前です。 |
LOCATION |
例えばeastusなど、新しい資源を活用するためのAzure地域。 |
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>
この記事で使っている変数を設定するだけで十分です。 この記事では、選択したリソース名に追加の環境変数を使う場合があります。 記事では、導入された場所の位置をどう設定するか説明しています。
セキュリティで保護された設定をクラスターで有効にする
Azure IoT Operations インスタンスのシークレット同期を有効にするには、 OIDC 発行者 と ワークロード ID のフェデレーション 機能をクラスターで有効にする必要があります。 この構成は、Azure Key Vault シークレット ストア拡張機能がAzure Key Vaultからシークレットを同期し、それらを Kubernetes シークレットとしてエッジに格納するために必要です。
Azure Kubernetes Service (AKS)クラスタでは、クラスター作成時や既存クラスタ上でOIDC発行者およびワークロード識別機能を有効化できます。 詳細については、「AKSクラスターにおけるMicrosoft Entra ワークロード ID の展開および構成」をご覧ください。 AKS Edge Essentials上のクラスターの場合、自動スクリプトによってこれらの機能が既定で有効になります。 Azure Local 上の AKS クラスターの場合、必要な機能を備えたクラスターがないときは、「Azure Arc クラスターで有効になっている AKS にワークロード ID をデプロイして構成する」の手順に従って新しく作成します。
Kubernetes 上の k3s クラスターの場合は、既存のクラスターを更新できます。 これらの機能を有効にして構成するには、次の手順に従います。
OIDC 発行者とワークロード ID を有効にするようにクラスターを更新します。
az connectedk8s update -n $CLUSTER_NAME -g $RESOURCE_GROUP --enable-oidc-issuer --enable-workload-identityクラスターの作成時に OIDC 発行者とワークロード ID の機能を有効にした場合、前のコマンドをもう一度実行する必要はありません。 次のコマンドを使用して、クラスターの OIDC 発行者とワークロード ID の機能の状態を確認します。
az connectedk8s show -g $RESOURCE_GROUP -n $CLUSTER_NAME --query "{ClusterName:name, OIDCIssuerEnabled:oidcIssuerProfile.enabled, WorkloadIdentityEnabled:securityProfile.workloadIdentity.enabled}"クラスターの発行者の URL を取得します。
az connectedk8s show -g $RESOURCE_GROUP -n $CLUSTER_NAME --query oidcIssuerProfile.issuerUrl --output tsv次の手順で使用するために、このコマンドからの出力を書き留めます。
Kubernetes クラスターをデプロイしたマシンに k3s 構成ファイルを作成します。
sudo nano /etc/rancher/k3s/config.yamlconfig.yamlファイルに次の内容を追加し、<SERVICE_ACCOUNT_ISSUER>プレースホルダーを、前にメモしたクラスター発行者の URL に置き換えます。kube-apiserver-arg: - service-account-issuer=<SERVICE_ACCOUNT_ISSUER> - service-account-max-token-expiration=24hファイルを保存し、nano エディターを終了します。
k3s サービスを再起動します。
sudo systemctl restart k3s
シークレット管理を設定する
Azure IoT Operations のシークレット管理では、シークレット ストア拡張機能を使用して Azure Key Vault からシークレットを同期し、それらを Kubernetes シークレットとしてエッジに格納します。 シークレット ストア拡張機能には、シークレットが格納されているAzure Key Vaultにアクセスできるユーザー割り当てマネージド ID が必要です。 詳細については、「Azure リソースのマネージド ID とは」を参照してください。
シークレット管理を設定するには:
シークレットを保存するAzure Key Vaultを作成し、ユーザーアカウントにシークレット管理権限を与え、
Key Vault Secrets Officerロールを割り当ててください。 キーボールトが権限モデルとしてAzureの役割ベースのアクセス制御を使用していることを確認してください。 Azureポータルでこの設定を確認するには、キーボールトを選択し、「設定>アクセス設定」を選択してください。キー コンテナーへのアクセスに使用するシークレット ストア拡張機能のユーザー割り当てマネージド ID を作成します。
az iot ops secretsync enable コマンドを使用して、シークレット同期用に Azure IoT Operations インスタンスを設定します。 このコマンド:
- ユーザー割り当てマネージド ID を使用してフェデレーテッド ID 資格を作成します。
- Azure Key Vault にアクセスするために、ユーザー割り当てマネージド ID にロールの割り当てを追加します。
- Azure IoT Operations インスタンスに関連付けられている最小シークレット プロバイダー クラスを追加します。
# Variable block AIO_INSTANCE_NAME="<AIO_INSTANCE_NAME>" RESOURCE_GROUP="<RESOURCE_GROUP>" USER_ASSIGNED_MI_NAME="<USER_ASSIGNED_MI_NAME>" KEYVAULT_NAME="<KEYVAULT_NAME>" #Get the resource ID of the user-assigned managed identity USER_ASSIGNED_MI_RESOURCE_ID=$(az identity show --name $USER_ASSIGNED_MI_NAME --resource-group $RESOURCE_GROUP --query id --output tsv) #Get the resource ID of the key vault KEYVAULT_RESOURCE_ID=$(az keyvault show --name $KEYVAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv) #Enable secret synchronization az iot ops secretsync enable --instance $AIO_INSTANCE_NAME \ --resource-group $RESOURCE_GROUP \ --mi-user-assigned $USER_ASSIGNED_MI_RESOURCE_ID \ --kv-resource-id $KEYVAULT_RESOURCE_ID
シークレットの同期のセットアップが完了したら、「Azure IoT Operations デプロイ用のシークレットを管理する」を参照して、Azure IoT Operations でシークレットを使用する方法を学習できます。
クラウド接続用にユーザー割り当てマネージド ID を設定する
データ フロー エンドポイントなどの一部のAzure IoT Operations コンポーネントでは、クラウド接続にユーザー割り当てマネージド ID が使用されます。 シークレット管理の設定に使用したものとは別の ID を使用することをお勧めします。
クラウド接続に使用されるユーザー割り当てマネージド ID を作成します。
Note
マネージド ID を使用するクラウド リソースにはいずれにも、ID アクセス許可を付与する必要があります。
az iot ops identity assign コマンドを使用して、Azure IoT Operations インスタンスに ID を割り当てます。 また、このコマンドは、指定された接続クラスターの OIDC 発行者とAzure IoT Operations サービス アカウントを使用して、フェデレーション ID 資格情報を作成します。
Important
このコマンドの既定のバージョンでは、データ フローの ID が割り当てられます。 データ フロー グラフを使用する場合は、
--usageパラメーターを値wasm-graphに含めます。# Variable block AIO_INSTANCE_NAME="<AIO_INSTANCE_NAME>" RESOURCE_GROUP="<RESOURCE_GROUP>" USER_ASSIGNED_MI_NAME="<USER_ASSIGNED_MI_NAME FOR CLOUD CONNECTIONS>" #Get the resource ID of the user-assigned managed identity USER_ASSIGNED_MI_RESOURCE_ID=$(az identity show --name $USER_ASSIGNED_MI_NAME --resource-group $RESOURCE_GROUP --query id --output tsv) #Assign the identity to the Azure IoT Operations instance az iot ops identity assign --name $AIO_INSTANCE_NAME \ --resource-group $RESOURCE_GROUP \ --mi-user-assigned $USER_ASSIGNED_MI_RESOURCE_IDスキーマ レジストリ ポッドを再起動して、新しい ID を適用します。
kubectl rollout restart statefulset adr-schema-registry -n azure-iot-operations
これで、このマネージド ID をデータ フロー エンドポイントでクラウド接続に使用できるようになりました。
Azure インスタンス メタデータ サービスへのポッド アクセスをブロックする
AKS でセキュリティで保護された設定でAzure IoT Operationsをデプロイする場合、Microsoftでは、Azure インスタンス メタデータ サービス エンドポイントへのポッド アクセスをブロックすることをお勧めします。 この機能を有効にする方法については、「Block ポッドから Azure Instance Metadata Service (IMDS) エンドポイントへのアクセスをブロックするを参照してください。