Fabric Spark のセキュリティ

セキュリティで保護されたシークレット アクセスを有効にしながら、制御された実行環境を確立し、データエグレスを管理し、最小限の特権を適用します。

マネージド プライベート エンドポイント (MPE)

シナリオ: あなたは、Fabric Spark で機密データを扱うデータ エンジニアです。 セキュリティ チームには、セキュリティを強化するために、ネットワーク分離環境のすべてのコードを実行する必要があります。
  • マネージド仮想ネットワーク (VNet) を有効にします。 マネージド VNet を有効にするには、 パブリック ドキュメントを参照してください。 Microsoft Fabric は、各 Fabric ワークスペースの マネージド仮想ネットワーク (VNet) を作成および管理します。 これらは、Fabric Spark ワークロードのネットワーク分離を提供します。つまり、Microsoft Fabric はワークスペースごとに専用ネットワークにコンピューティング クラスターをデプロイし、共有仮想ネットワークからそれらを削除します。

  • 運用環境では、Spark Notebook の安全な実行にマネージド VNet を使用します。

  • マネージド プライベート エンドポイント (MPE) を作成すると、既定でワークスペース レベルで作成されます。

  • テナント レベルで Private Link (PL) を有効にすると、システムはテナント内のすべてのワークスペースに対してマネージド VNet を有効にします。 PL 設定を有効にすると、最初の Spark ジョブ (ノートブックまたは Spark ジョブ定義) を実行するときに、ワークスペースのマネージド仮想ネットワークが作成されます。 また、テーブルへの読み込み操作やテーブルメンテナンス操作 (最適化またはバキューム) などの Lakehouse 操作を実行すると、仮想ネットワークも作成されます。

マネージド VNet を有効にすると、共有ネットワークで実行されるため、スターター プールは使用できなくなります。

ワークスペースのアウトバウンドアクセス保護 (WS OAP)

シナリオ: 誰かが誤って Spark ノートブックを使用して未承認の宛先に運用データを書き出す可能性があり、これを制御することを懸念しています。

ワークスペース送信アクセス保護 (WS OAP) を有効にします。 これにより、Spark からの送信インターネット接続は、マネージド プライベート エンドポイント経由で承認された宛先にのみ送信されるようになります。 

  • パブリック ライブラリのブロック: パブリック ライブラリ (PyPi、Maven など) のインストールもブロックされます。 そのため、ライブラリを JAR または Wheel ファイルとしてパッケージ化し、カスタム ライブラリを環境またはリソースにアップロードし、notebooks 内に % pip インストールを使用してインストールする必要があります。 注意すべき点の 1 つは、リソースに追加し、インライン %pip インストールを使用してインストールする場合、環境の発行時間が短くなることです。 これは、迅速な開発とテストに役立ちます。 いろいろなノートブックでパッケージを再利用するには、環境に公開することをお勧めします。 もう 1 つの方法は、プライベート リポジトリに接続することです。 詳細については、データ エンジニアリング ワークロードのワークスペース送信アクセス保護に関するドキュメントを参照してください
シナリオ: 開発環境で WS OAP を有効にする必要がありますか?

開発プロセスに影響を与えるため、開発または下位のワークスペースで WS OAP をオンにしないことを検討してください。 ノートブックまたは Spark ジョブ定義 (SSD) がパブリック ライブラリでテストされたら、カスタム ライブラリで同じノートブックをテストします。 適切なコード レビューが完了したら、上位の環境にデプロイし、WS OAP を有効にします。 開発環境を保護する場合は、WS OAP を有効にできますが、開発プロセスが妨げられる可能性があります。 WS OAP を有効にすると、スターター プールは使用できません。

Notebook から Azure Key Vault (AKV) にアクセスする

シナリオ: あなたはデータ エンジニアであり、Spark Notebooks のセキュリティで保護された資格情報を使用して複数のデータ ソースに接続する必要があります。

資格情報を Azure Key Vault (AKV) に安全に格納します。 すべてのシークレットを格納するために 1 つのキー コンテナーを保持しないでください。 代わりに、可能であれば、プロジェクト/ドメインに基づいて複数のキー コンテナーを使用します。

Notebook から Azure Key Vault (AKV) にアクセスする

  • ネットワーク: 既知のネットワークからのアクセスのみを許可するように、ファイアウォール規則を使用して AKV を保護することをお勧めします。 ただし、ファイアウォール規則で Fabric Spark の IP アドレスを許可します。 Fabric Spark Notebooks から保護された AKV に安全に接続するには、AKV へのマネージド プライベート エンドポイントを作成することをお勧めします。 1 つの AKV では、最大 64 個のプライベート エンドポイント (Azure サブスクリプションとサービスの制限、クォータ、制約) のみをサポートできます。 

  • 認証: システムは、ジョブ/ノートブックを送信したユーザーのコンテキストで Fabric Spark Notebooks と SJD を実行します。 AKV にアクセスするには、送信元ユーザーがシークレットを取得するための十分なアクセス権 ("Key Vault Secrets Officer") を持っている必要があります。 AKV のベスト プラクティス: Azure RBAC を使用して Azure キー コンテナーにアクセスするためのアクセス許可をアプリケーションに付与する方法を参照してください。

    • Notebookutils (以前は mssparkutils と呼ばれる) を使用して、Notebook/SJD を実行しているユーザーの資格情報を使用して AKV にアクセスできます。

    notebookutils.credentials.getSecret('<AKV URL>', 'Secret Name')

  • 運用環境では、prod 環境で AKV へのユーザー アクセスを提供することはお勧めしません。 代わりに、サービス アカウントを使用して Key Vault (KV) にアクセスします。 サービス アカウントを使用してノートブック/ジョブを送信します。 

  • 場合によっては、ジョブを送信するサービス アカウントに、AKV からシークレットを読み取るアクセス権があります。 

  • 場合によっては、このサービス アカウントは通常、AKV からシークレットを読み取るためにアクセスできない可能性がある DevOps アカウントです。 このような場合、資格情報ビルダーは、別のサービス プリンシパル名 (SPN) を使用して AKV にアクセスするのに役立ちます。

サンプルの Scala コード スニペットを次に示します。

val clientSecretCredential: ClientSecretCredential = new ClientSecretCredentialBuilder()
  .clientId("<client id here>")
  .clientSecret("<client secret here>")
  .tenantId("<tenant id here>")
  .build()

val secretClient: SecretClient = new SecretClientBuilder()
  .vaultUrl("<vault url here>")
  .credential(clientSecretCredential)
  .buildClient()

val secretName = "<your value>"
val retrievedSecret = secretClient.getSecret(secretName)
println(s"Retrieved secret: ${retrievedSecret.getValue}")

コード内のプレーン テキストでシークレットやパスワードをハードコーディングしないでください。 シークレットの格納と取得には、常にセキュリティで保護されたコンテナー (Azure Key Vault など) を使用します。