このエントリは2021/03/21現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容との乖離が発生する可能性があります。
先日、2個の問い合わせを受けた。まずはその1。
現在、Azure IoT Hub、Azure Stream Analytics、Blob Storage、Functionsなどを組み合わせたIoTソリューションを検討している。デバイスからの受信はIoT Edgeで集約し、IoT EdgeからIoT HubまではVPNもしくはExpressRouteで接続する。Azure Stream Analytics以外のサービスはアクセス元のSource IPでアクセス制御できるが、Azure Stream Analyticsでは同様のアクセス制御はできないのか?何らかの形で悪意ある攻撃者からのアクセスを拒否する仕組みはないか?
IoT EdgeからIoT Hubの接続イメージは以下のような感じ。

Ingress connectivity to IoT Hub using Azure Private Link
https://docs.microsoft.com/azure/iot-hub/virtual-network-support#ingress-connectivity-to-iot-hub-using-azure-private-link
IoT HubからBlob Storageまでの配置は、下図の”egress”と示されている黄緑の矢印の間にAzure Stream Analyticsを配置するイメージ。

IoT Hub support for virtual networks with Private Link and Managed Identity
https://docs.microsoft.com/azure/iot-hub/virtual-network-support#built-in-event-hub-compatible-endpoint
Azure Stream Analytics
Azure Stream Analytics は、複数のソースからの大量の高速ストリーミング データを同時に分析および処理するように設計された、リアルタイムの分析および複合イベント処理エンジンです。 パターンやリレーションシップは、デバイス、センサー、クリックストリーム、ソーシャル メディア フィード、アプリケーションなどのいくつかの入力ソースから抽出された情報内で識別できます。 これらのパターンを使用してアクションを起動し、アラートの作成、レポート作成ツールへの情報のフィード、または後で使用するための変換されたデータの保存などのワークフローを開始できます。 また、Stream Analytics は Azure IoT Edge ランタイムでも使用できます。これにより、IoT デバイス上のデータを処理できるようになります。
Azure Stream Analytics へようこそ
Welcome to Azure Stream Analytics
https://docs.microsoft.com/azure/stream-analytics/stream-analytics-introduction
Azure Stream Analytics (以下ASA)は、Event HubsやAzure Service Bus、Azure IoT Hubの組み込みAzure Event Hubs相当機能を入力、Blob StorageやFunctionsなどを出力にできる。マネージドサービスかつマルチテナントのAzure Stream Analytics jobsと、入出力にPrivate Linkが可能な、シングルテナントのAzure Stream Analytics Clusterがある。後者は占有環境になるので、お値段もいい感じである。
Azure Stream Analytics クラスターの概要 / Overview of Azure Stream Analytics Cluster
https://docs.microsoft.com/azure/stream-analytics/cluster-overview
ASAの接続方式
確かにIoT HubやBlob Storageでは、Firewall機能があってSource IPでアクセス制御する仕組みがあるが、ASAにはそのようなものはない(Source IPで絞ること自体が十分なアクセス制御といえるかどうかはここでは議論しない)。
ではなぜそのようなアクセス制限機構がないのか。それは、ASAの接続モデルは、jobs、clusterとも同じでPull方式、つまり、入力側はListenするのではなく、明示的に接続を確立し、メッセージをPullするためである。それゆえ、少なくとも不特定なクライアント(メッセージ送信元)からのアクセスはできない。また、仮に入力先がPublic endpointを公開していたとしても、Azureサービスが入力であればインターネット外に出ることはない。
出力の場合も同様で、PullではなくPushではあるが、ASAから明示的に接続を構成するため、出力先でアクセスを絞ることができれば、ASA以外からの接続を排除できる。
とはいえ・・・
インターネットに出ず、明示的にアクセスを制限しながらアクセスを許可する方法はないのかという追加の問い合わせがあるかも、ということで、何らかの仕組みがないか調べた。キーワードは ”Trusted Microsoft Services”(信頼された Microsoft サービス)。これは、リソースがVNetに接続されている場合、既定では当該リソースにアクセスできないが、「信頼されたMicrosoftサービス」というリソースのFirewall例外を有効化すると、IoT Hubからのリソースアクセスが可能になる。仮にVNetに接続していなくても、このルールは「選択されたネットワークからのアクセスを許可する」というカテゴリに入っているので、信頼されていないサービスからのアクセスは拒否できる。
IoT Hubにおける信頼されたサービスは以下の3種類。
- Azure Event Hubs
- Azure Service Bus
- Azure Blob StorageもしくはAzure Data Lake Storage gen 2
ルーティング エンドポイント / Routing endpoints
https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-messages-d2c#routing-endpoints
Event Hubsにとっての信頼されたサービスは以下の5種類。
- Azure Event Grid
- Azure Monitor
- Azure Stream Analytics
- Azure IoT Hub
- Azure API Management
信頼できる Microsoft サービス / Trusted Microsoft Services
https://docs.microsoft.com/azure/event-hubs/event-hubs-ip-filtering#trusted-microsoft-services
ASAにとっての信頼されたサービスは以下の2種類。
- Azure Event Hubs
- Azure Blob StorageもしくはAzure Data Lake Storage gen 2
“信頼されたサービスを許可する” 構成でのマネージド ID 認証 / Managed identity authentication with ‘Allow trusted services’ configuration
https://docs.microsoft.com/azure/stream-analytics/connect-job-to-vnet#managed-identity-authentication-with-allow-trusted-services-configuration
これらから、IoT Hub > Event Hubs > ASA > Blob Storage という組み合わせも可能である。ただ、ふつうに考えれば、利用リソースが増えることから、わざわざEvent Hubsを挟もうとは思わないはずだが、「信頼されていないサービスからのアクセスは拒否するのだ!」という思想が強いのであれば、もしかするとこちらを選択されることがあるかもしれない(ここではこの思想の是非は議論しない)。
なお、信頼されたサービスのFirewall例外を使う場合、Managed Identity(マネージドID)を使うことが必須である。全てユーザー割り当てではなく、システム割り当てのManaged Identityを使う必要がある。
Blob StorageをStream Analyticsの出力として構成
もう一つの問い合わせはこちら。
ASAの出力としてBlob Storageを考えているが、この両者間も接続をセキュアにしたい。Blob StorageはPrivate LinkでVNetと接続することを想定している。ASA自体はPrivate Linkに対応していないことから、この場合、ASAから直接Blob Storageに書き込めないのではないかと危惧している。何かよい方法はないか?
通常、VNetに接続されているPaaSサービスは、Publicからのアクセスができない。ところが、Blob Storageにとって、ASAは”Trusted Microsoft Services”、つまり「信頼されたサービス」なので、Managed Identityを組み合わせた接続であれば、Private Linkで接続されているBlob Storageに対しても書き込みが可能である。
Azure Blob Storage への出力に対してマネージド ID 認証 (プレビュー) を使用すると、Stream Analytics ジョブで、接続文字列を使用せずに、ストレージ アカウントに直接アクセスできます。 この機能により、セキュリティが向上し、さらに Azure 内の仮想ネットワーク (VNET) のストレージ アカウントにデータを書き込むことができます。
マネージド ID (プレビュー) を使用して、Azure Blob Storage に対して Azure Stream Analytics ジョブを認証する
Use Managed Identity (preview) to authenticate your Azure Stream Analytics job to Azure Blob Storage
https://docs.microsoft.com/azure/stream-analytics/blob-output-managed-identity
手順は上記URLに記載がある通りで、ポイントはManaged Identityを使うところと、ストレージアカウントのFirewallで「信頼された Microsoft サービスによるこのストレージ アカウントに対するアクセスを許可します」の例外を有効にするところ。上記のEvent Hubsの構成と同じ。なお、Blob Storageで信頼されたサービスは以下。
- Azure API Management
- Azure Cognitive Search
- Azure Cognitive Services
- Azure Container Registry Tasks
- Azure Data Factory
- Azure Data Share
- Azure DevTest Labs
- Azure IoT Hub
- Azure Logic Apps
- Azure Machine Learning Service
- Azure Media Services
- Azure Migrate
- Azure Purview
- Azure Remote Rendering
- Azure Site Recovery
- Azure SQL Database
- Azure Synapse Analytics
- Azure Stream Analytics
システム割り当てマネージド ID に基づく信頼されたアクセス / Trusted access based on system-assigned managed identity
https://docs.microsoft.com/azure/storage/common/storage-network-security?tabs=azure-portal#trusted-access-based-on-system-assigned-managed-identity