使用 Microsoft Entra ID 認證傳遞(舊版)存取 Azure Data Lake Storage
重要
此文件已淘汰,可能無法更新。
從 Databricks Runtime 15.0 開始,認證傳遞已被取代,未來將會移除 Databricks Runtime 版本。 Databricks 建議您升級至 Unity 目錄。 Unity 目錄藉由提供集中位置來管理和稽核帳戶中多個工作區的資料存取,藉此簡化資料的安全性和控管。 請參閱什麼是 Unity 目錄?。
若要提升安全性與治理狀態,請連絡 Azure Databricks 帳戶團隊,以停用 Azure Databricks 帳戶的認證傳遞。
注意
本文包含對白名單術語的引用,Azure Databricks 不使用此術語。 從軟體中移除該字詞時,我們也會將其從本文中移除。
您可以使用用於登入 Azure Databricks 的相同 Microsoft Entra ID 身分識別,自動對從 Azure Databricks 存取 Azure Data Lake Storage Gen1 (ADLS Gen1) 和從 Azure Databricks 叢集存取 ADLS Gen2 進行身分驗證。 為叢集啟用 Azure Data Lake Storage 認證傳遞後,在該叢集執行的命令可以讀取及寫入 Azure Data Lake Storage 的資料,而無需設定用於存取儲存裝置的服務主體認證。
Azure Data Lake Storage Gen1 和 Gen2 僅支援 Azure Data Lake Storage 認證通道。 Azure Blob 儲存體不支援認證通道。
此文章涵蓋:
- 啟用標準及高並行叢集的認證傳遞。
- 在 ADLS 帳戶設定認證傳遞並初始化儲存體資源。
- 啟用認證傳遞時,可直接存取 ADLS 資源。
- 啟用認證傳遞時,透過掛接點存取 ADLS 資源。
- 使用認證傳遞時支援的功能與限制。
包含筆記本來提供搭配 ADLS Gen1 及 ADLS Gen2 儲存體帳戶使用認證傳遞的範例。
需求
- 進階方案。 如需將標準方案升級至進階方案的詳細資訊,請參閱升級或降級 Azure Databricks 工作區。
- Azure Data Lake Store Gen1 或 Gen2 儲存體帳戶。 Azure Data Lake Storage Gen2 儲存體帳戶必須使用「階層式命名空間」來搭配 Azure Data Lake Storage 認證通道。 如需建立新 ADLS Gen2 帳戶以及如何啟用階層命名空間的指示,請參閱建立儲存體帳戶。
- 已正確設定使用者對 Azure Data Lake Storage 的權限。 使用者應該具有正確的角色,例如儲存體 Blob 資料參與者,才能讀取及寫入儲存在 Azure Data Lake Storage 的資料。 請參閱使用 Azure 入口網站來指派用於存取 Blob 和佇列資料的 Azure 角色。
- 了解工作區管理員在啟用傳遞的工作區的權限,並檢閱您現有的工作區管理員指派。 工作區管理員可以管理其工作區的作業,包括新增使用者及服務主體、建立叢集,以及將其他使用者委派為工作區管理員。 工作區管理工作,例如管理作業擁有權及檢視筆記本,可能會間接存取 Azure Data Lake Storage 註冊的資料。 工作區管理員是一個特權角色,您應該謹慎分配。
- 您無法使用設定了 ADLS 認證(例如服務主體認證)及認證傳遞的叢集。
重要
如果您位於尚未設定為允許流量 Microsoft Entra ID 的防火牆後方,則無法使用 Microsoft Entra ID 認證向 Azure Data Lake Storage 進行驗證。 根據預設,Azure 防火牆會封鎖 Active Directory 存取。 若要允許存取,請設定 AzureActiveDirectory 服務標籤。 您可以在 Azure IP 範圍和服務標籤 JSON 檔案中的 AzureActiveDirectory 標籤底下,找到網路虛擬裝置的對等資訊。 如需詳細資訊,請參閱 Azure 防火牆服務標籤。
記錄建議
您可以在 Azure 儲存體診斷記錄中記錄傳遞至 ADLS 儲存體的身分識別。 記錄身分識別允許 ADLS 要求與 Azure Databricks 叢集中的個別使用者關聯。 開啟儲存體帳戶的診斷記錄,即可開始接收這些記錄:
- Azure Data Lake Storage Gen1:遵循啟用 Data Lake Storage Gen1 帳戶診斷記錄的指示。
- Azure Data Lake Storage Gen2:使用 PowerShell 搭配
Set-AzStorageServiceLoggingProperty
命令進行設定。 指定為 2.0 版本,因為記錄項目格式 2.0 在請求中包含使用者主體名稱。
為高並行叢集啟用 Azure Data Lake Storage 認證傳遞
高並行叢集可以由多個使用者共用。 它們僅支援具有 Azure Data Lake Storage 認證傳遞的 Python 和 SQL。
重要
啟用高並行叢集的 Azure Data Lake Storage 認證傳遞會封鎖叢集上所有連接埠(不包括連接埠 44、53 和 80 )。
- 當您建立叢集時,請將 [叢集模式] 設定為 [高並行]。
- 在 [進階選項],選取 [啟用認證傳遞以進行使用者層級資料存取,並僅允許 Python 和 SQL 命令] 。
為標準叢集啟用 Azure Data Lake Storage 認證傳遞
具有認證傳遞的標準叢集僅限於單一使用者。 標準叢集支援 Python、SQL、Scala 和 R。在 Databricks Runtime 10.4 LTS 及更新版本,支援 sparklyr。
您必須在叢集建立時指派使用者,但具有 CAN MANAGE 權限的使用者可以隨時編輯叢集以取代原始使用者。
重要
指派給叢集的使用者必須至少有叢集的 CAN ATTACH TO 權限,才能在叢集執行命令。 工作區管理員及叢集建立者具有 CAN MANAGE 權限,但除非它們是指定的叢集使用者,否則無法在叢集執行命令。
- 當您建立叢集時,請將 [叢集模式]設定為 [標準]。
- 在 [進階選項],選取 [啟用使用者層級資料存取的認證傳遞],然後從 [單一使用者存取]下拉式清單選取使用者名稱。
建立容器
容器提供在 Azure 儲存體帳戶組織物件的方式。
使用認證傳遞直接存取 Azure Data Lake Storage
設定 Azure Data Lake Storage 認證傳遞並建立儲存體容器後,您可以使用 adl://
路徑直接存取 Azure Data Lake Storage Gen1 的資料,並使用 abfss://
路徑存取 Azure Data Lake Storage Gen2。
Azure Data Lake Storage Gen1
Python
spark.read.format("csv").load("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv").collect()
R
# SparkR
library(SparkR)
sparkR.session()
collect(read.df("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv", source = "csv"))
# sparklyr
library(sparklyr)
sc <- spark_connect(method = "databricks")
sc %>% spark_read_csv("adl://<storage-account-name>.azuredatalakestore.net/MyData.csv") %>% sdf_collect()
- 將
<storage-account-name>
替換為 ADLS Gen1 儲存帳戶名稱。
Azure Data Lake Storage Gen2
Python
spark.read.format("csv").load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv").collect()
R
# SparkR
library(SparkR)
sparkR.session()
collect(read.df("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv", source = "csv"))
# sparklyr
library(sparklyr)
sc <- spark_connect(method = "databricks")
sc %>% spark_read_csv("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/MyData.csv") %>% sdf_collect()
- 將
<container-name>
替換為 ADLS Gen2 儲存帳戶的容器名稱。 - 將
<storage-account-name>
替換為 ADLS Gen2 儲存帳戶名稱。
使用認證傳遞將 Azure Data Lake Storage 掛接至 DBFS
您可以將 Azure Data Lake Storage 帳戶或其中的資料夾掛接到什麼是 DBFS?。 掛接是 Data Lake Store 的指標,因此資料永遠不會在本機同步。
當您使用已啟用 Azure Data Lake Storage 認證傳遞的叢集來掛接資料時,任何對掛接點的讀取或寫入都會使用您的 Microsoft Entra ID 認證。 其他使用者可以看到此掛接點,但擁有讀寫權限的使用者僅限於:
- 具有基礎 Azure Data Lake Storage 儲存體帳戶的存取權
- 使用已啟用 Azure Data Lake Storage 認證傳遞的叢集
Azure Data Lake Storage Gen1
若要掛接 Azure Data Lake Storage Gen1 資源或其中的資料夾,請使用下列命令:
Python
configs = {
"fs.adl.oauth2.access.token.provider.type": "CustomAccessTokenProvider",
"fs.adl.oauth2.access.token.custom.provider": spark.conf.get("spark.databricks.passthrough.adls.tokenProviderClassName")
}
# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
source = "adl://<storage-account-name>.azuredatalakestore.net/<directory-name>",
mount_point = "/mnt/<mount-name>",
extra_configs = configs)
Scala
val configs = Map(
"fs.adl.oauth2.access.token.provider.type" -> "CustomAccessTokenProvider",
"fs.adl.oauth2.access.token.custom.provider" -> spark.conf.get("spark.databricks.passthrough.adls.tokenProviderClassName")
)
// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
source = "adl://<storage-account-name>.azuredatalakestore.net/<directory-name>",
mountPoint = "/mnt/<mount-name>",
extraConfigs = configs)
- 將
<storage-account-name>
替換為 ADLS Gen2 儲存帳戶名稱。 - 將
<mount-name>
替換為 DBFS 中預定掛接點的名稱。
Azure Data Lake Storage Gen2
若要掛接 Azure Data Lake Storage Gen2 檔案系統或其中的資料夾,請使用下列命令:
Python
configs = {
"fs.azure.account.auth.type": "CustomAccessToken",
"fs.azure.account.custom.token.provider.class": spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
}
# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
mount_point = "/mnt/<mount-name>",
extra_configs = configs)
Scala
val configs = Map(
"fs.azure.account.auth.type" -> "CustomAccessToken",
"fs.azure.account.custom.token.provider.class" -> spark.conf.get("spark.databricks.passthrough.adls.gen2.tokenProviderClassName")
)
// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/",
mountPoint = "/mnt/<mount-name>",
extraConfigs = configs)
- 將
<container-name>
替換為 ADLS Gen2 儲存帳戶的容器名稱。 - 將
<storage-account-name>
替換為 ADLS Gen2 儲存帳戶名稱。 - 將
<mount-name>
替換為 DBFS 中預定掛接點的名稱。
警告
請勿提供儲存體帳戶存取金鑰或服務主體認證來驗證掛接點。 這將向其他使用者提供使用這些認證存取檔案系統的權限。 Azure Data Lake Storage 認證傳遞的目的是要防止您使用這些認證,並確保對檔案系統的存取僅限於具有基礎 Azure Data Lake Storage 帳戶存取權的使用者。
安全性
您可以安全與其他使用者共用 Azure Data Lake Storage 認證傳遞叢集。 您將彼此隔離,且無法讀取或使用彼此的認證。
支援的功能
功能 | 最小 Databricks 執行階段版本 | 備註 |
---|---|---|
Python 和 SQL | 5.5 | |
Azure Data Lake Storage Gen1 | 5.5 | |
%run |
5.5 | |
DBFS | 5.5 | 只有在 DBFS 路徑解析為 Azure Data Lake Storage Gen1 或 Gen2 的位置時,才會傳遞認證。 針對解析為其他儲存體系統的 DBFS 路徑,請使用不同的方法來指定您的認證。 |
Azure Data Lake Storage Gen2 | 5.5 | |
磁碟快取 | 5.5 | |
PySpark ML API | 5.5 | 不支援下列 ML 類別: - org/apache/spark/ml/classification/RandomForestClassifier - org/apache/spark/ml/clustering/BisectingKMeans - org/apache/spark/ml/clustering/GaussianMixture - org/spark/ml/clustering/KMeans - org/spark/ml/clustering/LDA - org/spark/ml/evaluation/ClusteringEvaluator - org/spark/ml/feature/HashingTF - org/spark/ml/feature/OneHotEncoder - org/spark/ml/feature/StopWordsRemover - org/spark/ml/feature/VectorIndexer - org/spark/ml/feature/VectorSizeHint - org/spark/ml/regression/IsotonicRegression - org/spark/ml/regression/RandomForestRegressor - org/spark/ml/util/DatasetUtils |
廣播變數 | 5.5 | 在 PySpark,您可以建構的 Python UDF 大小有限制,因為大型 UDF 會以廣播變數的形式傳送。 |
筆記本範圍的程式庫 | 5.5 | |
Scala | 5.5 | |
SparkR | 6.0 | |
sparklyr | 10.1 | |
從其他筆記本執行 Databricks 筆記本 | 6.1 | |
PySpark ML API | 6.1 | 支援所有 PySpark ML 類別。 |
叢集計量 | 6.1 | |
Databricks Connect | 7.3 | 標準叢集支援傳遞。 |
限制
Azure Data Lake Storage 認證傳遞不支援下列功能:
%fs
(請改用對等的 dbutils.fs 命令)。- Databricks 作業。
- Databricks REST API 參考。
- Unity 目錄。
- 資料表存取控制。 Azure Data Lake Storage 認證傳遞所授與的權限可用來略過資料表 ACL 的細部權限,而資料表 ACL 的額外限制會限制您從認證傳遞獲得某些好處。 具體而言:
- 如果您有 Microsoft Entra ID 權限可存取特定資料表底下的資料檔,則不論透過資料表 ACL 放置的限制為何,您都會透過 RDD API 在該資料表擁有完整權限。
- 只有在使用 DataFrame API 時,才會受到資料表 ACL 權限的限制。 如果您嘗試使用 DataFrame API 直接讀取檔案,即使您可透過 RDD API 直接讀取這些檔案,您也會看到任何檔案沒有權限
SELECT
的警告。 - 即使您擁有讀取資料表的資料表 ACL 權限,也無法讀取由 Azure Data Lake Storage 以外的檔案系統支援的資料表。
- SparkContext(
sc
)和 SparkSession (spark
) 物件的下列方法: - DBFS 掛接(
/dbfs
)僅適用於 Databricks Runtime 7.3 LTS 和更新版本。 不支援透過此路徑設定認證傳遞的掛接點。 - Azure Data Factory。
- 高並行叢集上的 MLflow。
- 高並行叢集上的 azureml-sdk Python 套件。
- 您無法使用 Microsoft Entra ID 權杖存留期原則來延長 Microsoft Entra ID 傳遞權杖的存留期。 因此,如果您傳送命令到叢集所需的時間超過一小時,如果在 1 小時後才存取 Azure Data Lake Storage 資源,就會失敗。
- 使用 Hive 2.3 及更新版本時,您無法在已啟用認證傳遞的叢集新增分割區。 如需詳細資訊,請參閱有關疑難排解小節。
範例筆記本
下列筆記本示範 Azure Data Lake Storage Gen1 和 Gen2 的 Azure Data Lake Storage 認證傳遞。
Azure Data Lake Storage Gen1 傳遞筆記本
Azure Data Lake Storage Gen2 傳遞筆記本
疑難排解
py4j.security.Py4JSecurityException: … 未列入白名單
當您存取 Azure Databricks 尚未明確針對 Azure Data Lake Storage 認證傳遞叢集標示為安全的方法時,就會擲回此例外狀況。 在大部分情況下,這表示此方法可允許 Azure Data Lake Storage 認證傳遞叢集上的使用者存取其他使用者的認證。
org.apache.spark.api.python.PythonSecurityException: 路徑…… 使用不受信任的檔案系統
當您嘗試存取 Azure Data Lake Storage 認證通道叢集未知的檔案系統時,就會擲回此例外狀況。 使用不受信任的檔案系統可能會允許 Azure Data Lake Storage 認證傳遞叢集的使用者存取其他使用者的認證,因此我們不允許所有不確定是否正在安全使用的檔案系統。
若要在 Azure Data Lake Storage 認證通道叢集上設定一組受信任的檔案系統,請將該叢集上的 Spark conf 索引鍵 spark.databricks.pyspark.trustedFilesystems
設定為 org.apache.hadoop.fs.FileSystem
受信任實作的類別名稱逗號分隔清單。
當啟用認證傳遞時,新增分區失敗並顯示 AzureCredentialNotFoundException
使用 Hive 2.3-3.1 時,如果您嘗試在已啟用認證通道的叢集上新增分割區,就會發生下列例外狀況:
org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:com.databricks.backend.daemon.data.client.adl.AzureCredentialNotFoundException: Could not find ADLS Gen2 Token
若要解決此問題,請在未啟用認證傳遞的叢集新增分割區。