配置 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 兼容对象存储能够使用 Secure 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 和证书的详细信息,请参阅启用数据库引擎的加密连接

权限

为了让代理用户读取 S3 存储桶的内容,需要允许用户对 S3 端点执行以下操作:

  • 在 AWS S3 中,创建一个自定义角色并具体声明 S3 API 需要访问权限。
    • 备份需要以下权限:ListBucket(浏览)、PutObject(写入 - 进行备份)。
    • 还原需要以下权限:ListBucket(浏览)、GetObject(读取 - 用于还原)、GetObject(读取 - 用于还原)。
  • 在其他与 S3 兼容的存储中:
    • 备份要求用户 (Access Key ID) 必须同时具有 ListBucket 和 WriteOnly 权限。
    • 还原要求用户 (Access Key ID) 必须同时具有 ListBucket 和 ReadOnly 权限。

启用 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 兼容的对象存储,不允许客户创建包含 : 字符的访问密钥 ID。
  2. URL 总长度限制为 259 个字符。 这意味着 s3://<hostname>/<objectkey> 不应超过 259 个字符。 s3:// 计数包含在此限制内,因此路径长度不能超过 259-5 = 254 个字符。
  3. SQL 凭据名称的限制为 128 个 UTF-16 格式的字符。
  4. 创建的凭据名称必须包含桶名称,除非此凭据用于新的外部数据源。
  5. 访问密钥 ID 和密钥 ID 只能包含字母数字值。

直通 (STS) 授权

与 S3 兼容的对象存储能够通过使用安全令牌服务 (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 选项指定与 S3 兼容的对象存储 STS 终结点和 AssumeRoleWithWebIdentity 请求的参数。 AssumeRoleWithWebIdentity 是用于获取用于进行身份验证的临时安全凭据的方法。 有关完整的参数列表(包括可选参数)以及默认值的相关信息,请参阅 STS API 参考

将直通 (STS) 授权与 Active Directory 配合使用

  • 在 AD 中将 SQL Server 用户帐户属性标记为不敏感,以允许传递到与 S3 兼容的存储。
  • 对于与 SQL Server SPN(服务主体名称)相关的用户,允许对 ADFS 服务 进行 Kerberos 约束委派。

将直通 (STS) 授权与 Active Directory 联合身份验证服务配合使用

  • 使 SQL Server 成为 Active Directory 中的声明提供程序信任
  • 允许 Intranet Windows 身份验证作为 ADFS 的身份验证方法。
  • 在 Intranet 中启用 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 兼容对象存储的 URL
  • ADFS 和 SQL Server 必须位于相同的域中。 应从 Extranet 禁用 ADFS Windows 传输终结点。
  • ADFS 应具有与作为声明信任提供程序的 SQL Server 相同的 AD (Active directory)。
  • S3 兼容存储应具有 STS 终结点服务,使客户端能够使用外部标识的 JWT 请求临时凭据。
  • parquet 和 CSV 格式支持 OPENROWSET 和 CETAS (Create External Table as Select) 查询。
  • 默认情况下,Kerberos 票证续订时间为 7 天,在 Windows 上的生存期为 10 小时,在 Linux 上的生存期为 2 小时。 SQL Server 最多可将用户的 Kerberos 令牌续订 7 天。 7 天后,用户的票证过期,因此直通到 S3 兼容存储将会失败。 在这种情况下,SQL Server 必须重新对用户进行身份验证才能获取新的 Kerberos 票证。
  • 支持将 ADFS 2019 与 Windows Server 2019 配合使用。
  • S3 REST API 调用会使用 AWS 签名版本 4。