適用於:SQL Server 2022 (16.x)
本文說明如何使用 PolyBase,查詢位於 S3 相同物件儲存體中的外部資料。
SQL Server 2022 (16.x) 引進連線到任何 S3 相容物件儲存體的能力,有兩個可用的驗證選項:基本驗證或傳遞授權 (也稱為 STS 授權)。
基本驗證 (也稱為靜態認證) 需要使用者將 和 access key id 儲存secret key id在 SQL Server 中。 使用者會在需要時明確撤銷和輪換認證。 細粒度的存取控制要求管理員管理每次登入的靜態憑證,在處理數十或數百個唯一憑證時,這種方法可能具有挑戰性。
傳遞 (STS) 授權提供這些問題的解決方案,方法是使用 SQL Server 自己的使用者身分識別來存取 S3 相容物件儲存體。 S3 相容物件儲存體能夠透過使用 Security Token Service (STS) 來指派暫時認證。 這些認證是短期且動態產生的。
本文包含基本驗證和傳遞授權 (STS) 授權的指示。
必要條件
若要使用 S3 相容物件儲存體整合功能,需要下列工具和資源:
- 安裝適用於 SQL Server 的 PolyBase 功能。
- 安裝 SQL Server Management Studio (SSMS)。
- S3 相容儲存體。
- 已建立 S3 儲存桶。 無法從 SQL Server 建立或設定儲存桶。
- 使用者 (
Access Key ID) 和你已知的祕密 (Secret Key ID)。 您需要這兩項,才能對 S3 物件儲存體端點進行驗證。 - 必須設定傳輸層安全性 (TLS)。 假設所有連線都將透過 HTTPS 而不是 HTTP 安全地傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。 如需 TLS 和憑證的詳細資訊,請參閱 設定 SQL Server 資料庫引擎以加密連線。
權限
為了讓 Proxy 使用者能夠讀取 S3 貯體的內容,使用者 (Access Key ID) 必須允許針對 S3 端點執行下列動作:
- 需要 GetBucketLocation 和 GetObject 權限,才能從 S3 物件儲存體讀取特定檔案。
- 指向 S3 資料夾位置的外部資料表或 OPENROWSET 查詢需要 ListBucket,而非單一檔案。 如果沒有 ListBucket 權限,您將收到錯誤
Msg 4860, Level 16, State 7, Line 15 Cannot bulk load. The file "s3://<ip address>:9000/bucket/*.*" does not exist or you do not have file access rights.
- 指向 S3 資料夾位置的外部資料表或 OPENROWSET 查詢需要 ListBucket,而非單一檔案。 如果沒有 ListBucket 權限,您將收到錯誤
- 需要 PutObject 權限才能寫入 S3 物件儲存體。
提示
您的 S3 符合規範物件儲存提供者可能需要額外的 API 作業許可權,或針對包含 API 作業權限的角色使用不同的命名。 請參閱您的產品文件。
啟用 PolyBase
在
sp_configure啟用 PolyBase:EXEC sp_configure @configname = 'polybase enabled', @configvalue = 1; GO RECONFIGURE GO確認設定:
EXEC sp_configure @configname = 'polybase enabled';
驗證
若要繼續,請選擇基本驗證或直通 (STS) 授權。
基本驗證
在您建立資料庫範圍認證之前,使用者資料庫必須具有保護認證的主要金鑰。 如需詳細資訊,請參閱 CREATE MASTER KEY。
使用基本驗證來建立資料庫範圍憑證
下列範例腳本會在 SQL Server 執行個體的 s3-dc 資料庫中建立資料庫範圍認證 database_name。 如需詳細資訊,請參閱 CREATE DATABASE SCOPED CREDENTIAL。
USE [database_name];
GO
IF NOT EXISTS(SELECT * FROM sys.database_scoped_credentials WHERE name = 's3_dc')
BEGIN
CREATE DATABASE SCOPED CREDENTIAL s3_dc
WITH IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>' ;
END
GO
使用 sys.database_scoped_credentials驗證新的資料庫範圍認證:
SELECT * FROM sys.database_scoped_credentials;
使用基本驗證建立外部資料來源
下列範例指令碼會在 SQL Server 的來源使用者資料庫中建立外部資料來源 s3_ds。 外部資料來源會參考 s3_dc 資料庫範圍認證。 如需詳細資訊,請參閱 CREATE EXTERNAL DATA SOURCE。
CREATE EXTERNAL DATA SOURCE s3_ds
WITH
( LOCATION = 's3://<ip_address>:<port>/'
, CREDENTIAL = s3_dc
);
GO
使用 sys.external_data_sources 驗證新的外部資料來源。
SELECT * FROM sys.external_data_sources;
虛擬託管 URL
某些 S3 相容儲存系統(例如 Amazon Web Services)會利用 virtual_hosted 樣式 URL 在 S3 儲存桶中實作資料夾結構。 新增下列 CONNECTION_OPTIONS,以允許建立指向 S3 儲存桶資料夾位置的外部表格,例如 CONNECTION_OPTIONS = '{"s3":{"url_style":"virtual_hosted"}}'。
如果沒有 CONNECTION_OPTIONS 設定,在查詢指向資料夾的外部表格時,您可能會發現下列錯誤:
Msg 13807, Level 16, State 1, Line 23
Content of directory on path '/<folder_name>/' cannot be listed.
基本驗證的限制
- 對於與 S3 相容的物件儲存,客戶無法建立包含
:字元的存取金鑰 ID。 - URL 總長度會限制在 259 個字元內。 這表示
s3://<hostname>/<objectkey>不應超過 259 個字元。 計s3://數會計入此限制,因此路徑長度不能超過 259-5 = 254 個字元。 - 在 UTF-16 格式中,SQL 認證名稱受制於 128 個字元。
- 除非此認證適用於新的外部資料來源,否則所建立的認證名稱必須包含儲存桶名稱。
- 存取金鑰識別碼和秘密金鑰識別碼只能包含英數字元值。
傳遞 (STS) 授權
適用於: 僅限 SQL Server 2022 (16.x)。
S3 相容物件儲存體能夠透過使用 Security Token Service (STS) 來指派暫時認證。 這些認證是短期且動態產生的。
傳遞授權依賴 Active Directory 同盟服務 (ADFS) 作為 OpenID Connect (OIDC) 身分識別提供者,由 ADFS 與 S3 相容的物件儲存體 STS 通訊、要求 STS 並將其提供回 SQL Server。
在 SQL Server 上使用傳遞 (STS) 授權
必須在 SQL Server 與 S3 相容的主機伺服器之間使用憑證來設定 TLS。 假設所有連線都將透過 HTTPS 而不是 HTTP 安全地傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。 支援公開或自我簽署的憑證。
建立資料庫範圍認證,用來將身分識別傳遞至 S3 相容物件儲存體。 如需詳細資訊,請參閱 CREATE DATABASE SCOPED CREDENTIAL。 如下所示的範例:
CREATE DATABASE SCOPED CREDENTIAL CredName WITH IDENTITY = 'User Identity'建立外部資料來源以存取 S3 相容物件儲存體。 使用
CONNECTION_OPTIONS做為 JSON 格式,以通知 ADFS 和 STS 的必要資訊。 如需詳細資訊,請參閱 CREATE EXTERNAL DATA SOURCE。 如下所示的範例:CREATE EXTERNAL DATA SOURCE EdsName WITH { LOCATION = 's3://<hostname>:<port>/<bucket_name>' , CREDENTIAL = <CredName> [ , CONNECTION_OPTIONS = ' { [ , "authorization": { "adfs": { "endpoint": "http[s]://hostname:port/servicepath", "relying_party": "SQL Server Relying Party Identifier" }, "sts": { "endpoint": "http[s]://hostname:port/stspath", "role_arn": "Role Arn" [ , "role_session_name": "AD user login" ] -- default value if not provided [ , "duration_seconds": 3600 ] -- default value if not provided [ , "version": "2011-06-15" ] -- default value if not provided [ , "request_parameters": "In request query string format" ] } } ] [ , "s3": { "url_style": "Path" } ] }' ] }
-
ADFS選項會指定 ADFS 中 SQL Server 的 Windows 傳輸端點和relying_party識別碼。 -
STS選項會針對AssumeRoleWithWebIdentity要求指定 S3 相容物件儲存體 STS 端點和參數。AssumeRoleWithWebIdentity是用來取得用來驗證之暫存安全性認證的方法。 如需參數的完整清單,包括選擇性參數,以及預設值的相關資訊,請參閱 STS API 參照。
使用 STS 傳遞授權搭配 Active Directory
- 將 AD 中的 SQL Server 使用者帳戶屬性標示為非敏感性,以允許傳遞至 S3 相容儲存體。
- 針對與 SQL Server SPN (服務主體名稱) 相關的使用者,允許對 ADFS 服務的 Kerberos 限制委派。
使用傳遞 (STS) 授權搭配 Active Directory 同盟服務
- 讓 SQL Server 成為 Active Directory 中的宣告提供者信任。
- 允許內部網路 Windows 驗證作為 ADFS 的驗證方法。
- 在您的內部網路中啟用 Windows 傳輸服務端點。
- 啟用 OIDC (OpenID Connect) 端點。
- 將 SQL Server 註冊為依賴方信任。
- 提供唯一識別碼。
- 設置 JWT(JSON Web 權杖)中的聲明規則。
- 自訂宣告 - 如果需要這些宣告來決定儲存體端的存取原則,客戶可以新增這些宣告。
- 如需更多廠商特定的資訊,請洽詢您的 S3 相容平台提供者。
在 S3 相容物件儲存體上使用傳遞 (STS) 授權
請遵循 S3 相容儲存體提供者所提供的文件,設定外部 OIDC 識別提供者。 若要設定識別提供者,通常需要下列值。
- OIDC 提供者的設定端點。
- OIDC 提供者的指紋。
- 傳遞授權至 S3 相容物件儲存體
傳遞 (STS) 授權的限制
- 使用 Windows 驗證的 SQL Server 登入支援 STS 授權直接通過至 S3 相容的物件儲存體。
- STS 權杖無法用於 S3 相容物件儲存的 BACKUP 至 URL。
- ADFS 和 SQL Server 必須位於相同的網域中。 應該從外部網路停用 ADFS Windows 傳輸端點。
- ADFS 應具有與 SQL Server 相同的 AD (Active Directory),並將其用作宣告信任提供者。
- S3 相容儲存體應該具有 STS 端點服務,允許用戶端使用外部身份的 JWT 來要求臨時憑證。
- OPENROWSET 和 CETAS (Create External Table as Select) 查詢會支援 Parquet 和 CSV 格式。
- 根據預設,Kerberos 票證更新時間是七天,存留期在 Windows 上為 10 小時,在 Linux 上為 2 小時。 SQL Server 可以更新使用者的 Kerberos 權杖,更新期限最長為 7 天。 七天之後,使用者的票證會到期,因此傳遞至 S3 相容儲存體會失敗。 在此情況下,SQL Server 需要重新驗證使用者,才能取得新的 Kerberos 票證。
- 支援使用 Windows Server 2019 的 ADFS 2019。
- S3 REST API 呼叫使用 AWS 簽章第 4 版。
Linux 上的 SQL Server 上的 PolyBase
針對 Linux 上的 SQL Server 的 PolyBase,需要進行更多設定。
- 您必須設定 TLS。 假設所有連線都將透過 HTTPS 而不是 HTTP 安全地傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。
- Linux 上的憑證管理不同。 檢閱並遵循 Linux 中針對 S3 相容儲存體所詳述的設定。