在 Azure Synapse Analytics 中控制無伺服器 SQL 集區的儲存體帳戶存取
無伺服器 SQL 集區查詢會直接從 Azure 儲存體讀取檔案。 存取 Azure 記憶體上檔案的權限會控制在兩個層級:
- 儲存層級 - 用戶應具有存取基礎記憶體檔案的許可權。 儲存體系統管理員應該允許Microsoft Entra 主體讀取/寫入檔案,或產生將用來存取記憶體的共用存取簽章 (SAS) 密鑰。
- SQL 服務等級 - 使用者應該已授與許可權,才能使用 外部數據表 或執行函
OPENROWSET
式來讀取數據。 深入瞭解 本節中的必要許可權。
本文說明您可以使用的認證類型,以及 SQL 和 Microsoft Entra 使用者如何制定認證查閱。
儲存體權限
Synapse Analytics 工作區中的無伺服器 SQL 集區可以讀取儲存在 Azure Data Lake Storage 中的檔案內容。 您必須設定記憶體的許可權,才能讓執行 SQL 查詢的使用者讀取檔案。 有三種方法可以啟用檔案的存取:
- 角色型訪問控制 (RBAC) 可讓您將角色指派給存放區所在租使用者中的某些Microsoft Entra 使用者。 讀取器必須是記憶體帳戶上記憶體 Blob 數據讀取器、記憶體 Blob 數據參與者或記憶體 Blob 資料擁有者角色的成員。 在 Azure 記憶體中寫入資料的用戶必須是記憶體 Blob 資料參與者或記憶體 Blob 資料擁有者角色的成員。 記憶體擁有者角色並不表示使用者也是記憶體數據擁有者。
- 存取控制 清單 (ACL) 可讓您定義 Azure 記憶體中檔案和目錄的精細讀取(R)、寫入(W) 和 Execute(X) 許可權。 ACL 可以指派給 Microsoft Entra 使用者。 如果讀者想要讀取 Azure 儲存體中路徑上的檔案,則他們必須對檔案路徑中的每個資料夾具有執行 (X) ACL,以及對檔案具有讀取 (R) ACL。 深入了解如何在儲存體層中設定 ACL 權限。
- 共用存取簽章 (SAS) 可讓讀取者使用限時令牌存取 Azure Data Lake 記憶體上的檔案。 讀取器甚至不需要以 Microsoft Entra 使用者身分進行驗證。 SAS 權杖包含授與讀者的權限,以及權杖有效的期間。 SAS 令牌是時間限制存取任何甚至不需要位於相同 Microsoft Entra 租使用者的使用者的絕佳選擇。 您可以在儲存體帳戶或特定目錄上定義 SAS 權杖。 深入了解使用共用存取簽章授與 Azure 儲存體資源的有限存取權。
或者,您可以允許匿名存取,讓您的檔案可公開使用。 如果您有非公用資料,則不應使用此方法。
支援的儲存體授權類型
登入無伺服器 SQL 集區的用戶必須獲授權,才能存取和查詢 Azure 儲存體 中的檔案,如果檔案無法公開使用。 您可以使用四種授權類型來存取非公用記憶體:使用者身分識別、共用存取簽章、服務主體和受控識別。
注意
Microsoft Entra 傳遞 是建立工作區時的預設行為。
使用者身分識別也稱為「Microsoft Entra 傳遞」,是一種授權類型,其中登入無伺服器 SQL 集區之 Microsoft Entra 使用者的身分識別可用來授權數據存取。 存取數據之前,Azure 儲存體 系統管理員必須將許可權授與Microsoft Entra 使用者。 如資料庫用戶數據表支援的授權類型中所述,SQL 使用者類型不支援它。
重要
用戶端應用程式可能會快取Microsoft Entra 驗證令牌。 例如,Power BI 會快取 Microsoft Entra 令牌,並在一小時內重複使用相同的令牌。 如果令牌在查詢執行中間到期,長時間執行的查詢可能會失敗。 如果您遇到查詢失敗的原因,Microsoft在查詢中間到期的 Entra 存取令牌,請考慮切換至 服務主體、 受控識別 或 共用存取簽章。
您必須是記憶體 Blob 資料擁有者、記憶體 Blob 數據參與者或記憶體 Blob 資料讀取者角色的成員,才能使用身分識別來存取數據。 或者,您可以指定更細緻的 ACL 規則來存取檔案和資料夾。 即使您是記憶體帳戶的擁有者,您仍然需要將自己新增至其中一個記憶體 Blob 數據角色。 若要深入瞭解 Azure Data Lake Store Gen2 中的訪問控制,請檢閱 Azure Data Lake Storage Gen2 中的訪問控制一文。
跨租使用者案例
如果 Azure 儲存體 與 Synapse 無伺服器 SQL 集區位於不同的租使用者中,建議使用透過服務主體進行授權。 您也可以使用 SAS 授權,但 不支援受控識別 。
授權類型 | 受防火牆保護的儲存體 | 非防火牆保護的記憶體 |
---|---|---|
SAS | 支援 | 支援 |
Service Principal | 不支援 | 支援 |
注意
如果 Azure 儲存體 受到 Azure 儲存體 防火牆的保護,則不支援服務主體。
資料庫使用者支援的授權類型
下表提供 Azure Synapse Analytics 無伺服器 SQL 端點中不同登入方法的可用 Azure 儲存體 授權類型:
授權類型 | SQL 使用者 | Microsoft Entra 使用者 | 服務主體 |
---|---|---|---|
使用者身分識別 | 不支援 | 支援 | 支援 |
SAS | 支援 | 支援 | 支援 |
服務主體 | 支援 | 支援 | 支援 |
受控識別 | 支援 | 支援 | 支援 |
支援的儲存體和授權類型
您可以使用下列授權類型和 Azure 儲存體 型態組合:
授權類型 | Blob 儲存體 | ADLS Gen1 | ADLS Gen2 |
---|---|---|---|
SAS | 支援 | 不支援 | 支援 |
服務主體 | 支援 | 支援 | 支援 |
受控識別 | 支援 | 支援 | 支援 |
使用者身分識別 | 支援 | 支援 | 支援 |
跨租使用者案例
如果 Azure 儲存體 與 Azure Synapse Analytics 無伺服器 SQL 集區位於不同的租使用者中,建議使用透過服務主體進行授權。 您也可以使用共用存取簽章 授權。 不支援受控服務識別 。
授權類型 | 受防火牆保護的儲存體 | 非防火牆保護的記憶體 |
---|---|---|
SAS | 支援 | 支援 |
服務主體 | 不支援 | 支援 |
注意
如果 Azure 儲存體 受到 Azure 儲存體 防火牆的保護,且位於另一個租使用者中,則不支援服務主體。 請改用共用存取簽章 (SAS)。
受防火牆保護的儲存體
您可以藉由建立 資源實例規則,設定記憶體帳戶以允許存取特定無伺服器 SQL 集區。 存取使用防火牆保護的記憶體時,請使用 使用者身分識別 或 受控識別。
注意
Azure 儲存體 上的防火牆功能處於公開預覽狀態,且可在所有公用雲端區域中使用。
下表提供 Azure Synapse Analytics 無伺服器 SQL 端點中不同登入方法的可用防火牆保護 Azure 儲存體 授權類型:
授權類型 | SQL 使用者 | Microsoft Entra 使用者 | 服務主體 |
---|---|---|---|
使用者身分識別 | 不支援 | 支援 | 支援 |
SAS | 不支援 | 不支援 | 不支援 |
服務主體 | 不支援 | 不支援 | 不支援 |
受控識別 | 支援 | 支援 | 支援 |
若要透過使用者身分識別存取以防火牆保護的記憶體,您可以使用 Azure 入口網站 或 Az.Storage PowerShell 模組。
透過 Azure 入口網站 Azure 儲存體 防火牆設定
- 在 Azure 入口網站 中搜尋您的記憶體帳戶。
- 在主要導覽功能表中,移至 [設定] 底下的 [網络]。
- 在 [資源實例] 區段中,新增 Azure Synapse 工作區的例外狀況。
- 選取
Microsoft.Synapse/workspaces
作為 [資源類型]。 - 選取工作區的名稱作為 實例名稱。
- 選取儲存。
透過PowerShell Azure 儲存體防火牆設定
請遵循下列步驟來設定記憶體帳戶,並新增 Azure Synapse 工作區的例外狀況。
開啟 PowerShell 或 安裝 PowerShell。
安裝最新版的 Az.Storage 模組和 Az.Synapse 模組,例如下列腳本:
Install-Module -Name Az.Storage -RequiredVersion 3.4.0 Install-Module -Name Az.Synapse -RequiredVersion 0.7.0
重要
請確定您至少 使用 3.4.0 版。 您可以執行下列命令來檢查 Az.Storage 版本:
Get-Module -ListAvailable -Name Az.Storage | Select Version
線上到您的 Azure 租使用者:
Connect-AzAccount
在 PowerShell 中定義變數:
- 資源群組名稱 - 您可以在記憶體帳戶概觀 Azure 入口網站 中找到此專案。
- 帳戶名稱 - 受防火牆規則保護的記憶體帳戶名稱。
- 租使用者識別碼 - 您可以在 [租使用者屬性] 的 [屬性] 底下,在 [Microsoft Entra 標識符] 中找到此 Azure 入口網站 專案。
- 工作區名稱 - Azure Synapse 工作區的名稱。
$resourceGroupName = "<resource group name>" $accountName = "<storage account name>" $tenantId = "<tenant id>" $workspaceName = "<Azure Synapse workspace name>" $workspace = Get-AzSynapseWorkspace -Name $workspaceName $resourceId = $workspace.Id $index = $resourceId.IndexOf("/resourceGroups/", 0) # Replace G with g - /resourceGroups/ to /resourcegroups/ $resourceId = $resourceId.Substring(0,$index) + "/resourcegroups/" ` + $resourceId.Substring($index + "/resourceGroups/".Length) $resourceId
重要
PowerShell 腳本所傳回的值
$resourceid
應該符合此範本:/subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Synapse/workspaces/{name-of-workspace}
請務必以小寫撰寫 資源群組 。新增 Azure 記憶體帳戶網路規則:
$parameters = @{ ResourceGroupName = $resourceGroupName Name = $accountName TenantId = $tenantId ResourceId = $resourceId } Add-AzStorageAccountNetworkRule @parameters
確認記憶體帳戶網路規則已套用在記憶體帳戶防火牆中。 下列 PowerShell 腳本會將
$resourceid
先前步驟中的變數與記憶體帳戶網路規則的輸出進行比較。$parameters = @{ ResourceGroupName = $resourceGroupName Name = $accountName } $rule = Get-AzStorageAccountNetworkRuleSet @parameters $rule.ResourceAccessRules | ForEach-Object { if ($_.ResourceId -cmatch "\/subscriptions\/(\w\-*)+\/resourcegroups\/(.)+") { Write-Host "Storage account network rule is successfully configured." -ForegroundColor Green $rule.ResourceAccessRules } else { Write-Host "Storage account network rule is not configured correctly. Remove this rule and follow the steps in detail." -ForegroundColor Red $rule.ResourceAccessRules } }
認證
若要查詢位於 Azure 儲存體 中的檔案,您的無伺服器 SQL 集區端點需要包含驗證資訊的認證。 使用兩種類型的認證:
- 伺服器層級認證用於使用
OPENROWSET
函式執行的臨機操作查詢。 認證 名稱 必須符合記憶體 URL。 - 資料庫範圍認證用於外部數據表。 具有應該用來存取記憶體之認證的外部數據表參考
DATA SOURCE
。
授與管理認證的許可權
若要授與管理認證的能力:
若要允許使用者建立或卸除伺服器層級認證,系統管理員必須在 master 資料庫中授
ALTER ANY CREDENTIAL
與其登入的許可權。 例如:GRANT ALTER ANY CREDENTIAL TO [login_name];
若要允許使用者建立或卸除資料庫範圍認證,系統管理員必須將資料庫的許可權授
CONTROL
與用戶資料庫中的資料庫使用者。 例如:GRANT CONTROL ON DATABASE::[database_name] TO [user_name];
授與許可權以使用認證
存取外部記憶體的資料庫用戶必須具有使用認證的許可權。 若要使用認證,用戶必須具有 REFERENCES
特定認證的許可權。
若要授 REFERENCES
與登入之伺服器層級認證的許可權,請在 master 資料庫中使用下列 T-SQL 查詢:
GRANT REFERENCES ON CREDENTIAL::[server-level_credential] TO [login_name];
若要為資料庫使用者授與 REFERENCES
資料庫範圍認證的許可權,請在用戶資料庫中使用下列 T-SQL 查詢:
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[database-scoped_credential] TO [user_name];
伺服器層級認證
當 SQL 登入呼叫 OPENROWSET
函式而不 DATA_SOURCE
讀取記憶體帳戶上的檔案時,會使用伺服器層級認證。
伺服器層級認證 的名稱必須 符合 Azure 記憶體的基底 URL,選擇性地後面接著容器名稱。 執行 CREATE CREDENTIAL 會新增認證。 您必須提供 CREDENTIAL NAME
自變數。
注意
不支援 自 FOR CRYPTOGRAPHIC PROVIDER
變數。
伺服器層級的 CREDENTIAL 名稱必須符合下列格式: <prefix>://<storage_account_path>[/<container_name>]
。 下表說明記憶體帳戶路徑:
外部資料來源 | Prefix | 儲存體帳戶路徑 |
---|---|---|
Azure Blob 儲存體 | https |
<storage_account>.blob.core.windows.net |
Azure Data Lake Storage Gen1 | https |
<storage_account>.azuredatalakestore.net/webhdfs/v1 |
Azure Data Lake Storage Gen2 \(部分機器翻譯\) | https |
<storage_account>.dfs.core.windows.net |
然後,伺服器層級認證就可以使用下列驗證類型來存取 Azure 記憶體:
Microsoft Entra 使用者可以存取 Azure 記憶體上的任何檔案,如果他們是記憶體 Blob 數據擁有者、記憶體 Blob 數據參與者或記憶體 Blob 數據參與者角色的成員。 Microsoft Entra 使用者不需要認證才能存取記憶體。
SQL 驗證的使用者無法使用 Microsoft Entra 驗證來存取記憶體。 他們可以使用受控識別、SAS 金鑰、服務主體,或如果有公用存取記憶體,透過資料庫認證存取記憶體。
資料庫範圍認證
當任何主體呼叫 OPENROWSET
函式時,會使用資料庫範圍認證, DATA_SOURCE
或從 無法存取公用檔案的外部數據表 中選取數據。 資料庫範圍認證不需要符合記憶體帳戶的名稱,它會在定義記憶體位置的 DATA SOURCE 中參考。
資料庫範圍認證可讓您使用下列驗證類型來存取 Azure 記憶體:
Microsoft Entra 使用者可以存取 Azure 記憶體上的任何檔案,如果他們是記憶體 Blob 數據擁有者、記憶體 Blob 數據參與者或記憶體 Blob 數據參與者角色的成員。 Microsoft Entra 使用者不需要認證才能存取記憶體。
CREATE EXTERNAL DATA SOURCE mysample
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
)
SQL 驗證的使用者無法使用 Microsoft Entra 驗證來存取記憶體。 他們可以使用受控識別、SAS 金鑰、服務主體,或如果有公用存取記憶體,透過資料庫認證存取記憶體。
資料庫範圍認證用於外部資料來源,以指定將用來存取此記憶體的驗證方法:
CREATE EXTERNAL DATA SOURCE mysample
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>',
CREDENTIAL = <name of database scoped credential>
)
範例
存取公開可用的數據源
使用下列腳本來建立可存取公開可用數據源的數據表。
CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat]
WITH ( FORMAT_TYPE = PARQUET)
GO
CREATE EXTERNAL DATA SOURCE publicData
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<public_container>/<path>' )
GO
CREATE EXTERNAL TABLE dbo.userPublicData ( [id] int, [first_name] varchar(8000), [last_name] varchar(8000) )
WITH ( LOCATION = 'parquet/user-data/*.parquet',
DATA_SOURCE = [publicData],
FILE_FORMAT = [SynapseParquetFormat] )
資料庫使用者可以使用參考數據源的外部數據表或 OPENROWSET 函式,從數據源讀取檔案的內容:
SELECT TOP 10 * FROM dbo.userPublicData;
GO
SELECT TOP 10 * FROM OPENROWSET(BULK 'parquet/user-data/*.parquet',
DATA_SOURCE = 'mysample',
FORMAT='PARQUET') as rows;
GO
使用認證存取數據源
修改下列腳本來建立外部數據表,以使用 SAS 令牌、Microsoft使用者身分識別或工作區的受控識別來存取 Azure 記憶體。
-- Create master key in databases with some password (one-off per database)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>'
GO
-- Create databases scoped credential that use Managed Identity, SAS token or service principal. User needs to create only database-scoped credentials that should be used to access data source:
CREATE DATABASE SCOPED CREDENTIAL WorkspaceIdentity
WITH IDENTITY = 'Managed Identity'
GO
CREATE DATABASE SCOPED CREDENTIAL SasCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'sv=2019-10-1********ZVsTOL0ltEGhf54N8KhDCRfLRI%3D'
GO
CREATE DATABASE SCOPED CREDENTIAL SPNCredential WITH
IDENTITY = '**44e*****8f6-ag44-1890-34u4-22r23r771098@https://login.microsoftonline.com/**do99dd-87f3-33da-33gf-3d3rh133ee33/oauth2/token'
, SECRET = '.7OaaU_454azar9WWzLL.Ea9ePPZWzQee~'
GO
-- Create data source that one of the credentials above, external file format, and external tables that reference this data source and file format:
CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat] WITH ( FORMAT_TYPE = PARQUET)
GO
CREATE EXTERNAL DATA SOURCE mysample
WITH ( LOCATION = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
-- Uncomment one of these options depending on authentication method that you want to use to access data source:
--,CREDENTIAL = WorkspaceIdentity
--,CREDENTIAL = SasCredential
--,CREDENTIAL = SPNCredential
)
CREATE EXTERNAL TABLE dbo.userData ( [id] int, [first_name] varchar(8000), [last_name] varchar(8000) )
WITH ( LOCATION = 'parquet/user-data/*.parquet',
DATA_SOURCE = [mysample],
FILE_FORMAT = [SynapseParquetFormat] );
資料庫使用者可以使用 參考數據源的外部數據表 或 OPENROWSET 函式,從數據源讀取檔案的內容:
SELECT TOP 10 * FROM dbo.userdata;
GO
SELECT TOP 10 * FROM OPENROWSET(BULK 'parquet/user-data/*.parquet', DATA_SOURCE = 'mysample', FORMAT='PARQUET') as rows;
GO
下一步
這些文章可協助您瞭解如何查詢不同的資料夾類型、檔類型,以及建立和使用檢視: