Fabric Spark 安全性

建立受控執行環境、控管資料輸出,並強制執行最低權限,同時啟用安全秘密存取。

受控專用端點(MPE)

案例:您是資料工程師,在 Fabric Spark 中操作敏感資料。 您的安全團隊需要在網路隔離環境中執行所有程式碼,以增強安全性。
  • 啟用受控虛擬網路 (VNet)。 若要啟用受控 VNet,請參閱 公用文件。 Fabric 為每個 Fabric 工作區建立並管理受管虛擬網路(VNet)。 它們為 Fabric Spark 工作負載提供網路隔離,意即 Fabric 會在每個工作空間中部署專用網路中的運算叢集,將其從共享虛擬網路中移除。

  • 在生產環境中,使用受管理的 VNet 來安全執行 Spark 筆記本。

  • 當您建立受控私人端點 (MPE) 時,預設會在工作區層級建立它。

  • 當您在租用戶層級啟用 Private Link (PL) 時,系統會為租用戶中的所有工作區啟用受控 VNet。 啟用 PL 設定後,系統會在你執行第一個 Spark 工作(筆記本或 Spark 工作定義)時,為工作空間建立一個受管理的虛擬網路。 系統也會在執行湖屋操作(如載入到表格或資料表維護操作(優化或真空)時建立虛擬網路。

備註

當您啟用受控 VNet 時,入門集區會變成無法使用,因為它們會在共用網路中執行。

工作區外部存取保護

案例:您擔心有人可能會不小心使用 Spark 筆記本將生產資料寫入未經授權的目的地,而您想要控制這一點。

啟用工作區輸出存取保護 (WS OAP)。 這可確保來自 Spark 的輸出因特網連線只會透過受控私人端點移至核准的目的地。 

  • 封鎖公共函式庫:這也會封鎖公共函式庫的安裝(來自 PyPi、Maven 等)。 因此,您需要將程式庫封裝為 JAR 或 Wheel 檔案,然後將自訂程式庫上傳至環境或資源,並在筆記本內使用 % pip install 進行安裝。 需要注意的一點是,如果將其新增至資源,並使用內嵌 %pip 安裝進行安裝,則環境發佈時間會更短。 這對於快速開發和測試很有用。 若要在各種筆記本中重複使用套件,建議將其發佈至環境。 另一種方法是連接到您的私人存儲庫。 如需詳細資訊,請參閱Workspace 資料工程工作負載出口存取保護的文件。
案例:您應該在開發環境中啟用 WS OAP 嗎?

請考慮不要在開發或較低工作區中開啟 WS OAP,因為它會影響開發程序。 當筆記本或 Spark 工作定義(SJD)在公共函式庫中測試完畢後,再用自訂函式庫測試同一份筆記本。 在適當的程式碼檢閱之後,部署至較高的環境,然後開啟 WS OAP。 如果您想保護開發環境,您可以啟用 WS OAP,但這可能會阻礙開發過程。 當您啟用 WS OAP 時,入門集區不可用。

從筆記本存取 Azure 金鑰保存庫 (AKV)

案例:您是資料工程師,想要使用 Spark Notebooks 中的安全認證連線到多個資料來源。

將認證安全地儲存在 Azure 金鑰保存庫 (AKV) 中。 請勿保留單一金鑰保存庫來儲存所有秘密。 相反地,如果可能的話,請根據專案/網域使用多個金鑰保存庫。

從筆記本存取 Azure 金鑰保存庫 (AKV)

  • 網: 我們建議使用防火牆規則保護您的 AKV,以僅允許從已知網路存取。 不過,您可以在防火牆規則中允許 Fabric Spark 的 IP 位址。 若要從 Fabric Spark 筆記本安全地連線到受保護的 AKV,建議您建立 AKV 的受控私人端點。 一個 AKV 最多只能支援 64 個私人端點 (Azure 訂用帳戶和服務限制、配額和條件約束)。 

  • 認證: 系統會在提交作業或筆記本的使用者環境中執行 Fabric Spark 筆記本和 SJD。 若要存取 AKV,提交者應具有足夠的存取權限來擷取秘密資訊(「金鑰保存庫秘密管理員」)。 請參閱 AKV 最佳做法: 授與應用程式使用 Azure RBAC 存取 Azure 金鑰保存庫的許可權。

    • 您可以使用 notebookutils (先前稱為 mssparkutils) ,使用執行 Notebook/SJD 之使用者的認證來存取 AKV:

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

  • 在生產環境中,我們不建議在生產環境中提供使用者對 AKV 的存取權。 請改用服務帳戶來存取金鑰保存庫 (KV)。 使用服務帳戶來提交筆記本/工作。 

  • 在某些情況下,提交任務的服務帳戶有權從 AKV 讀取密碼。 

  • 在某些情況下,此服務帳戶通常是 DevOps 帳戶,可能無法從 AKV 讀取密碼。 在這種情況下,憑證建構器有助於使用不同的服務主體名稱(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 金鑰保存庫) 來儲存和擷取您的秘密。