設定 PolyBase 以存取 S3 相容物件儲存體中的外部資料

適用於:SQL Server 2022 (16.x)

本文說明如何使用 PolyBase,查詢位於 S3 相同物件儲存體中的外部資料。

SQL Server 2022 (16.x) 引進連線到任何 S3 相容物件儲存體的能力,有兩個可用的驗證選項:基本驗證或傳遞授權 (也稱為 STS 授權)。

基本驗證 (也稱為靜態認證) 需要使用者將 access key idsecret key id 儲存在 SQL Server 中,使用者可視需要明確撤銷和輪替認證。 精細的存取控制需要系統管理員為每個登入設定靜態認證,在處理數十或數百個唯一認證時,這種方法可能很有挑戰。

傳遞 (STS) 授權提供這些問題的解決方案,方法是使用 SQL Server 自己的使用者身分識別來存取 S3 相容物件儲存體。 S3 相容物件儲存體能夠透過使用 Security Token Service (STS) 來指派暫時認證。 這些認證是短期且動態產生的。

本文包含基本驗證和傳遞授權 (STS) 授權的指示。

必要條件

若要使用 S3 相容物件儲存體整合功能,需要下列工具和資源:

  • 安裝適用於 SQL Server 的 PolyBase 功能。
  • 安裝 SQL Server Management Studio (SSMS)Azure Data Studio
  • S3 相容儲存體。
  • 會建立 S3 貯體。 無法從 SQL Server 建立或設定貯體。
  • 使用者 (Access Key ID) 和已知的祕密 (Secret Key ID)。 您將需要這兩者,針對 S3 物件儲存體端點進行驗證。
  • S3 使用者的 ListBucket 權限,可取得瀏覽權限。
  • S3 使用者的 ReadOnly 權限,可取得讀取權限。
  • S3 使用者的 WriteOnly 權限,可取得寫入權限。
  • 必須設定傳輸層安全性 (TLS)。 假設所有連線皆會透過 HTTPS 而非 HTTP 進行安全傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。 如需 TLS 和憑證詳細資訊,請參閱啟用資料庫引擎的加密連線

權限

為了讓 Proxy 使用者能夠讀取 S3 貯體的內容,使用者必須允許針對 S3 端點執行下列動作:

  • 在 AWS S3 中,建立自訂角色,並特別指出 S3 API 需要存取權。
    • 備份需要這些權限:ListBucket (Browse)、PutObject (寫入 - 用於備份)。
    • 還原需要這些權限:ListBucket (Browse)、GetObject (讀取 - 用於還原)、GetObject (讀取 - 用於還原)。
  • 在其他 S3 相容儲存體中:
    • 備份需要使用者 (Access Key ID) 必須同時具有 ListBucketWriteOnly 權限。
    • 還原需要使用者 (Access Key ID) 必須同時有 ListBucketReadOnly 權限。

啟用 PolyBase

  1. sp_configure 啟用 PolyBase:

    EXEC sp_configure @configname = 'polybase enabled', @configvalue = 1;
    GO
    RECONFIGURE
    GO
    
  2. 確認設定:

    EXEC sp_configure @configname = 'polybase enabled';
    

驗證

若要繼續,請選擇基本驗證傳遞 (STS) 授權

基本驗證

在您建立資料庫範圍認證之前,使用者資料庫必須具有保護認證的主要金鑰。 如需詳細資訊,請參閱 CREATE MASTER KEY

使用基本驗證建立資料庫範圍認證

下列範例指令碼會在 SQL Server 執行個體的 database_name 資料庫中建立資料庫範圍認證 s3-dc。 如需詳細資訊,請參閱 CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)

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 (Transact-SQL) 驗證新的資料庫範圍認證:

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;

基本驗證的限制

  1. 對於 S3 相容物件儲存體,不允許客戶建立其中含 : 字元的存取金鑰識別元。
  2. URL 總長度會限制在 259 個字元內。 這表示 s3://<hostname>/<objectkey> 不應超過 259 個字元。 s3:// 會計入此限制,因此路徑長度不能超過 259-5 = 254 個字元。
  3. 在 UTF-16 格式中,SQL 認證名稱受制於 128 個字元。
  4. 除非此認證適用於新的外部資料來源,否則所建立的認證名稱必須包含貯體名稱。
  5. 存取金鑰識別碼和秘密金鑰識別碼只能包含英數字元值。

傳遞 (STS) 授權

S3 相容物件儲存體能夠透過使用 Security Token Service (STS) 來指派暫時認證。 這些認證是短期且動態產生的。

傳遞授權依賴 Active Directory 同盟服務 (ADFS) 做為 OpenID Connect (OIDC) 識別提供者,由 ADFS 與 S3 相容物件儲存體 STS 通訊、要求 STS,並將它提供回給 SQL Server。

在 SQL Server 上使用傳遞 (STS) 授權

  1. 必須使用 SQL Server 與 S3 相容主機伺服器之間的憑證設定 TLS。 假設所有連線皆會透過 HTTPS 而非 HTTP 進行安全傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。 不支援公開或自我簽署憑證。

  2. 建立資料庫範圍認證,用來將身分識別傳遞至 S3 相容物件儲存體。 如需詳細資訊,請參閱 CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)。 下列範例:

    CREATE DATABASE SCOPED CREDENTIAL CredName
    WITH IDENTITY = 'User Identity'
    
  3. 建立外部資料來源以存取 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) 授權的限制

  • SQL Server 使用 Windows 驗證登入,支援授權 (STS) 傳遞至 S3 相容物件儲存體。
  • STS 權杖無法用於備份至 S3 相容物件儲存體的 URL
  • ADFS 和 SQL Server 必須位於相同的網域中。 應該從外部網路停用 ADFS Windows 傳輸端點。
  • ADFS 應該具有與宣告信任提供者相同的 AD (Active Directory) 即 SQL Server 。
  • S3 相容儲存體應該具有 STS 端點服務,可讓用戶端使用外部身分識別的 JWT 要求暫時認證。
  • OPENROWSET 和 CETAS (Create External Table as Select) 查詢會支援 Parquet 和 CSV 格式。
  • 根據預設,Kerberos 票證更新時間是七天,存留期在 Windows 上為 10 小時,在 Linux 上為 2 小時。 SQL Server 可更新使用者最多 7 天的 Kerberos 權杖。 七天之後,使用者的票證會到期,因此傳遞至 S3 相容儲存體會失敗。 在此情況下,SQL Server 需要重新驗證使用者,才能取得新的 Kerberos 票證。
  • 將支援使用 Windows Server 2019 的 ADFS 2019。
  • S3 REST API 呼叫使用 AWS 簽章第 4 版。