建立受控執行環境、控管資料輸出,並強制執行最低權限,同時啟用安全秘密存取。
受控專用端點(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 金鑰保存庫) 來儲存和擷取您的秘密。