Azure Stream AnalyticsとAzure IoT Hub、ならびにBlob Storage間の接続をセキュアにしたい

このエントリは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の接続イメージは以下のような感じ。

Azure Private Link を使用した 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を配置するイメージ。

Private Link とマネージド ID を使用した仮想ネットワークの IoT Hub サポート
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

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中