Configurar o PolyBase para acessar dados externos no armazenamento de objetos compatível com o S3

Aplica-se a: SQL Server 2022 (16.x)

Este artigo explica como usar o PolyBase para consultar dados externos em um armazenamento de objetos compatível com o S3.

O SQL Server 2022 (16.x) introduziu a capacidade de se conectar a qualquer armazenamento de objetos compatível com o S3. Há duas opções disponíveis para autenticação: autenticação básica ou autorização de passagem (também conhecida como autorização STS).

A Autenticação Básica, também conhecida como credenciais estáticas, requer que o usuário armazene a access key id e a secret key id no SQL Server. Cabe ao usuário revogar e girar explicitamente as credenciais sempre que necessário. O controle de acesso refinado exigiria que o administrador configurasse credenciais estáticas para cada logon. Essa abordagem pode ser desafiadora ao lidar com dezenas ou centenas de credenciais únicas.

A autorização de passagem (STS) oferece uma solução para esses problemas ao permitir o uso de identidades do próprio usuário do SQL Server para acessar o armazenamento de objetos compatível com o S3. O armazenamento de objetos compatível com o S3 tem a capacidade de atribuir uma credencial temporária usando o STS (Serviço de Token de Segurança). Essas credenciais são de curto prazo e geradas forma dinâmica.

Este artigo inclui instruções tanto para a autenticação básica quanto para a autorização de passagem (STS).

Pré-requisitos

Para usar os recursos de integração do armazenamento de objetos compatível com o S3, você precisa das seguintes ferramentas e recursos:

  • Instalar o recurso PolyBase para SQL Server.
  • Instalar o SSMS (SQL Server Management Studio) ou o Azure Data Studio.
  • Armazenamento compatível com o S3.
  • Um bucket do S3 criado. Os buckets não podem ser criados nem configurados por meio do SQL Server.
  • Um usuário (Access Key ID) e o segredo (Secret Key ID) conhecido por você. Você precisará de ambos para se autenticar no ponto de extremidade do armazenamento de objetos do S3.
  • Permissão ListBucket no usuário do S3 para privilégios de procura.
  • Permissão ReadOnly no usuário do S3 para privilégios de leitura.
  • Permissão WriteOnly no usuário do S3 para privilégios de gravação.
  • O protocolo TLS (Segurança da camada de transporte) deve ser configurado. Supõe-se que todas as conexões serão transmitidas com segurança por HTTPS, e não por HTTP. O ponto de extremidade será validado por um certificado instalado no host do sistema operacional do SQL Server. Para saber mais sobre o TLS e certificados, consulte Habilitar conexões criptografadas para o Mecanismo de Banco de Dados.

Permissões

Para que o usuário proxy leia o conteúdo de um bucket do S3, ele precisa ter permissão para executar as seguintes ações no ponto de extremidade do S3:

  • No AWS S3, crie uma função personalizada e indique especificamente qual API do S3 requer acesso.
    • O backup requer estas permissões: ListBucket (procurar), PutObject (ler, para backup).
    • A restauração requer estas permissões: ListBucket (procurar), GetObject (ler, para restaurar), GetObject (ler, para restaurar).
  • Em outro armazenamento compatível com o S3:
    • O backup requer que o usuário (Access Key ID) tenha permissões ListBucket e WriteOnly.
    • O armazenamento requer que o usuário (Access Key ID) deve ter permissões ListBucket e ReadOnly.

Habilitar o PolyBase

  1. Habilitar o PolyBase em sp_configure:

    EXEC sp_configure @configname = 'polybase enabled', @configvalue = 1;
    GO
    RECONFIGURE
    GO
    
  2. Confirmar a configuração:

    EXEC sp_configure @configname = 'polybase enabled';
    

Autenticação

Para continuar, escolha Autenticação Básica ou autorização de passagem (STS).

Autenticação Básica

Antes de criar uma credencial no escopo do banco de dados, o banco de dados de usuário precisa ter uma chave mestra para proteger a credencial. Para obter mais informações, confira CREATE MASTER KEY.

Criar uma credencial com escopo de banco de dados com a Autenticação Básica

O script de exemplo a seguir cria uma credencial s3-dc no escopo do banco de dados database_name em uma instância do SQL Server. Para obter mais informações, veja 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

Verifique a nova credencial no escopo do banco de dados com sys.database_scoped_credentials (Transact-SQL):

SELECT * FROM sys.database_scoped_credentials;

Criar uma fonte de dados externa com a Autenticação Básica

O script de exemplo a seguir cria uma fonte de dados externa s3_ds no banco de dados do usuário de origem no SQL Server. A fonte de dados externa faz referência à credencial no escopo do banco de dados s3_dc. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE.

CREATE EXTERNAL DATA SOURCE s3_ds
WITH
(   LOCATION = 's3://<ip_address>:<port>/'
,   CREDENTIAL = s3_dc
);
GO

Verifique a nova fonte de dados externa com sys.external_data_sources.

SELECT * FROM sys.external_data_sources;

Limitações da Autenticação Básica

  1. Para armazenamento de objetos compatível com o S3, os clientes não têm permissão para criar a ID da chave de acesso contendo um caractere :.
  2. O comprimento total da URL é limitado a 259 caracteres. Isso significa que s3://<hostname>/<objectkey> não deve exceder 259 caracteres. O s3:// conta para esse limite, portanto, o tamanho do caminho não pode exceder 259-5 = 254 caracteres.
  3. O nome da credencial do SQL é limitado a 128 caracteres no formato UTF-16.
  4. O nome da credencial criado precisa conter o nome do bucket, a menos que essa credencial seja para uma nova fonte de dados externa.
  5. A ID da chave de acesso e a ID da chave de secreta precisam conter apenas valores alfanuméricos.

Autorização de passagem (STS)

O armazenamento de objetos compatível com o S3 tem a capacidade de atribuir uma credencial temporária por meio do uso do STS (Serviço de Token de Segurança). Essas credenciais são de curto prazo e geradas forma dinâmica.

A autorização de passagem depende dos Serviços de Federação do Active Directory (ADFS) atuando como provedor de identidade OpenID Connect (OIDC). Cabe ao ADFS se comunicar com o STS de armazenamento de objetos compatível com o S3, solicitar o STS e fornecê-lo de volta ao SQL Server.

Usar a autorização de passagem (STS) no SQL Server

  1. O TLS deve ser configurado com certificados entre o SQL Server e o servidor host compatível com o S3. Supõe-se que todas as conexões serão transmitidas com segurança por HTTPS, e não por HTTP. O ponto de extremidade será validado por um certificado instalado no host do sistema operacional do SQL Server. Certificados públicos ou autoassinados são compatíveis.

  2. Crie uma credencial com escopo de banco de dados para a qual será usada para passar a identidade para o armazenamento de objetos compatível com o S3. Para obter mais informações, veja CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL). Conforme o exemplo a seguir:

    CREATE DATABASE SCOPED CREDENTIAL CredName
    WITH IDENTITY = 'User Identity'
    
  3. Crie uma fonte de dados externa para acessar o armazenamento de objetos compatível com o S3. Use CONNECTION_OPTIONS, como formato JSON, para informar as informações necessárias para o ADFS e o STS. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE. Conforme o exemplo a seguir:

    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"
                } ]
        }' ]
    }
    
  • As opções ADFS especificam o ponto de extremidade de transporte do Windows e o identificador relying_party do SQL Server no ADFS.
  • As opções STS especificam o ponto de extremidade STS de armazenamento de objetos compatível com o S3 e os parâmetros para a solicitação AssumeRoleWithWebIdentity. O AssumeRoleWithWebIdentity é o método usado para adquirir a credencial de segurança temporária usada para autenticação. Para a lista completa de parâmetros, incluindo os opcionais, e informações sobre os valores padrão, consulte Referência de API do STS.

Usar a autorização de passagem (STS) com o Active Directory

  • Marque as propriedades das contas de usuário do SQL Server no AD como não confidenciais para permitir a passagem para o armazenamento compatível com o S3.
  • Permita a delegação restrita de Kerberos para serviços ADFS para o usuário relacionado ao SPN (nomes da entidade de serviço) do SQL Server.

Usar a autorização de passagem (STS) com os Serviços de Federação do Active Directory (ADFS)

  • Habilite o SQL Server para ser um objeto de confiança do provedor de declarações no Active Directory.
  • Permita a autenticação intranet do Windows como método de autenticação para o ADFS.
  • Habilite o ponto de extremidade do serviço de transporte do Windows em sua intranet.
  • Habilite os pontos de extremidade OIDC (OpenID Connect).
  • Registre o SQL Server como um objeto de confiança de terceira parte confiável.
    • Forneça um identificador exclusivo.
    • Defina regras de declarações para JWT (Token Web JSON).
  • Declarações personalizadas - estas declarações podem ser adicionadas pelos clientes se forem necessárias para determinar a política de acesso no lado do armazenamento.
  • Para obter mais informações específicas do fornecedor, consulte o provedor de plataforma compatível com o S3.

Usar autorização de passagem (STS) no armazenamento de objetos compatível com o S3

  • Siga a documentação fornecida pelo provedor de armazenamento compatível com o S3 para configurar o provedor de identidade OIDC externo. Para configurar o provedor de identidade, geralmente são necessários os valores a seguir.

    • Ponto final de configuração do provedor OIDC.
    • Impressão digital do provedor OIDC.
    • Autorização de passagem para armazenamento de objetos compatível com o S3

Limitações da autorização de passagem (STS)

  • A STS (autorização de passagem) para o armazenamento de objetos compatível com o S3 é compatível com logons do SQL Server com a autenticação do Windows.
  • Os tokens STS não podem ser usados para BACKUP em URL para armazenamento de objetos compatíveis com o S3.
  • O ADFS e o SQL Server devem estar no mesmo domínio. O ponto de extremidade de transporte do Windows do ADFS deve ser desabilitado da extranet.
  • O ADFS deve ter o mesmo AD (Active Directory) que o SQL Server como provedor de confiança de declaração.
  • O armazenamento compatível com o S3 deve ter um serviço de ponto de extremidade STS que permita que os clientes solicitem credenciais temporárias usando JWT de identidades externas.
  • As consultas OPENROWSET e CETAS (Create External Table as Select) são compatíveis com os formatos parquet e CSV.
  • Por padrão, o tempo de renovação do tíquete Kerberos é de sete dias e a vida útil é de dez horas no Windows e duas horas no Linux. O SQL Server renova o token Kerberos do usuário por até sete dias. Após sete dias, o tíquete do usuário expira, portanto, a passagem para o armazenamento compatível com o S3 falhará. Nesse caso, o SQL Server deve autenticar novamente o usuário para obter um novo tíquete Kerberos.
  • O ADFS 2019 com Windows Server 2019 será compatível.
  • As chamadas de API REST do S3 usam o AWS Signature versão 4.