Controlar o acesso à conta de armazenamento para o pool SQL sem servidor no Azure Synapse Analytics

Tip

Microsoft Fabric Data Warehouse é um armazém relacional de escala empresarial baseado numa base de data lake, com uma arquitetura pronta para o futuro, IA incorporada e novas funcionalidades. Se és novo no data warehousing, começa pelo Fabric Data Warehouse. As cargas de trabalho existentes de pool SQL dedicado podem atualizar para o Fabric para acessar novas capacidades em ciência de dados, análise em tempo real e relatórios.

Uma consulta de pool SQL sem servidor lê ficheiros diretamente do Armazenamento do Azure. As permissões para aceder aos ficheiros no armazenamento Azure são controladas em dois níveis:

  • Nível de armazenamento - O utilizador deve ter permissão para aceder a ficheiros de armazenamento subjacentes. O seu administrador de armazenamento deve permitir que o principal da Microsoft Entra leia/escreva ficheiros, ou gere a chave de assinatura de acesso partilhada (SAS) que será usada para aceder ao armazenamento.
  • Nível de serviço SQL - O utilizador deve ter concedido permissão para ler dados usando uma tabela externa ou para executar a OPENROWSET função. Leia mais sobre as permissões necessárias nesta secção.

Este artigo descreve os tipos de credenciais que pode usar e como a pesquisa de credenciais é implementada para utilizadores de SQL e Microsoft Entra.

Permissões de armazenamento

Um pool SQL serverless no espaço de trabalho do Synapse Analytics pode ler o conteúdo de ficheiros armazenados no armazenamento do Azure Data Lake. É necessário configurar permissões de armazenamento para permitir que um utilizador que execute uma consulta SQL leia os ficheiros. Existem três métodos para permitir o acesso aos ficheiros:

  • Controlo de acesso baseado em funções (RBAC) permite-lhe atribuir um papel a algum utilizador de Microsoft Entra no tenant onde o seu armazenamento está colocado. Um leitor deve ser membro da função de Leitor de Dados do Blob de Armazenamento, Contribuinte de Dados do Blob de Armazenamento ou Proprietário de Dados do Blob de Armazenamento na conta de armazenamento. Um utilizador que escreve dados no Armazenamento Blob do Azure deve ser membro da função Storage Blob Data Contributor ou Storage Blob Data Owner. O papel de Proprietário de Armazenamento não implica que um utilizador seja também Proprietário dos Dados de Armazenamento.
  • Listas de Controlo de Acesso (ACL) permitem-lhe definir permissões detalhadas de leitura (R), escrita (W) e execução (X) nos ficheiros e diretórios do armazenamento do Azure. O ACL pode ser atribuído a utilizadores do Microsoft Entra. Se os leitores quiserem ler um ficheiro num caminho no Armazenamento do Azure, devem ter Execute(X) ACL em todas as pastas do caminho do ficheiro e Read(R) ACL no ficheiro. Saiba mais sobre como definir permissões ACL na camada de armazenamento.
  • Assinatura de acesso partilhada (SAS) permite que um leitor aceda aos ficheiros no armazenamento Azure Data Lake usando o token com limite de tempo. O leitor nem sequer precisa de ser autenticado como utilizador da Microsoft Entra. O token SAS contém as permissões concedidas ao leitor, bem como o período em que o token é válido. O token SAS é uma boa escolha para acesso com tempo limitado a qualquer utilizador que nem sequer precise de estar no mesmo tenant Microsoft Entra. O token SAS pode ser definido na conta de armazenamento ou em diretórios específicos. Saiba mais sobre conceder acesso limitado a recursos de Armazenamento do Azure usando assinaturas de acesso partilhadas.

Como alternativa, pode tornar os seus ficheiros publicamente disponíveis permitindo acesso anónimo. Esta abordagem NÃO deve ser usada se tiver dados não públicos.

Tipos de autorização de armazenamento suportados

Um utilizador que tenha iniciado sessão num pool SQL serverless deve estar autorizado a aceder e consultar os ficheiros no Armazenamento do Azure se os ficheiros não estiverem publicamente disponíveis. Pode usar quatro tipos de autorização para aceder a armazenamento não público: identidade do utilizador, assinatura de acesso partilhada, principal de serviço e identidade gerida.

Nota

Microsoft Entra pass-through é o comportamento padrão quando crias um espaço de trabalho.

Identidade do utilizador, também conhecida como "Microsoft Entra pass-through", é um tipo de autorização onde a identidade do utilizador Microsoft Entra que iniciou sessão no pool SQL serverless é usada para autorizar o acesso aos dados. Antes de aceder aos dados, o administrador do Armazenamento do Azure deve conceder permissões ao utilizador do Microsoft Entra. Como indicado na tabela Tipos de autorização suportados para utilizadores de base de dados, não é suportado para o tipo de utilizador SQL.

Importante

Um token de autenticação do Microsoft Entra pode ser armazenado em cache pelos aplicativos cliente. Por exemplo, o Power BI armazena tokens do Microsoft Entra em cache e reutiliza o mesmo token por uma hora. Consultas de longa execução podem falhar se o token expirar no meio da execução da consulta. Se estiver a enfrentar falhas de consulta causadas pelo token de acesso Microsoft Entra que expira a meio da consulta, considere mudar para um principal de serviço , identidade gerida ou assinatura de acesso partilhada.

Você precisa ser membro da função Proprietário de Dados de Blob de Armazenamento, Colaborador de Dados de Blob de Armazenamento ou Leitor de Dados de Blob de Armazenamento para usar a sua identidade e aceder aos dados. Como alternativa, você pode especificar regras de ACL refinadas para acessar arquivos e pastas. Mesmo que você seja proprietário de uma conta de armazenamento, ainda precisará se adicionar a uma das funções de Dados de Blob de Armazenamento. Para saber mais sobre controlo de acesso na Azure Data Lake Store Gen2, consulte o artigo sobre controlo de acesso em Azure Data Lake Storage Gen2.

Cenários entre inquilinos

Nos casos em que Armazenamento do Azure está num tenant diferente do pool SQL serverless Synapse, a autorização via Service Principal é o método recomendado. A autorização SAS também é possível, embora a Identidade Gerida não seja suportada.

Tipo de Autorização Armazenamento protegido por firewall armazenamento protegido não por firewall
SAS Suportado Suportado
Diretor de Serviço Não Suportado Suportado

Nota

Se Armazenamento do Azure estiver protegido por um firewall Armazenamento do Azure, Service Principal não será suportado.

Tipos de autorização suportados para utilizadores de bases de dados

A tabela seguinte apresenta os tipos de autorização disponíveis do Armazenamento do Azure para diferentes métodos de início de sessão num endpoint SQL serverless do Azure Synapse Analytics:

Tipo de autorização Utilizador SQL utilizador do Microsoft Entra Serviço principal
Identidade do usuário Não Suportado Suportado Suportado
SAS Suportado Suportado Suportado
Serviço principal Suportado Suportado Suportado
Identidade Gerenciada Suportado Suportado Suportado

Armazenamentos suportados e tipos de autorização

Pode usar as seguintes combinações de tipos de autorização e tipos de Armazenamento do Azure:

Tipo de autorização Armazenamento de Blobs ADLS Gen1 ADLS Gen2
SAS Suportado Não suportado Suportado
Serviço principal Suportado Suportado Suportado
Identidade Gerenciada Suportado Suportado Compatível
Identidade do usuário Suportado Suportado Suportado

Cenários entre inquilinos

Nos casos em que o Armazenamento do Azure está num locatário diferente do pool SQL sem servidor do Azure Synapse Analytics, a autorização através do principal de serviço é o método recomendado. Também é possível a autorização de assinatura de acesso partilhado. Identidade de Serviço Gerido não tem suporte.

Tipo de Autorização Armazenamento protegido por firewall armazenamento protegido não por firewall
SAS Suportado Suportado
Serviço principal Não Suportado Suportado

Nota

Se Armazenamento do Azure estiver protegido por um firewall Armazenamento do Azure e estiver noutro tenant, principal de serviço não será suportado. Em vez disso, utilize uma assinatura de acesso partilhado (SAS).

Armazenamento protegido por firewall

Podes configurar contas de armazenamento para permitir o acesso a um pool SQL serverless específico criando uma regra de instância de recursos. Ao aceder a armazenamento protegido pelo firewall, use Identidade de Utilizador ou Identidade Gerida.

Nota

A funcionalidade de firewall no Armazenamento do Azure está em pré-visualização pública e está disponível em todas as regiões da cloud pública.

A tabela seguinte fornece os tipos de autorização Armazenamento do Azure protegidos por firewall disponíveis para diferentes métodos de início de sessão num endpoint SQL serverless do Azure Synapse Analytics:

Tipo de autorização Utilizador SQL Utilizador do Microsoft Entra Serviço principal
Identidade do usuário Não Suportado Suportado Suportado
SAS Não Suportado Não Suportado Não Suportado
Serviço principal Não Suportado Não Suportado Não Suportado
Identidade Gerenciada Suportado Suportado Suportado

Para aceder a armazenamento protegido pelo firewall através de uma identidade de utilizador, pode usar o portal Azure ou o módulo PowerShell do Az.Storage.

Configuração do firewall do Armazenamento do Azure através do portal Azure

  1. Procure a sua Conta de Armazenamento no portal do Azure.
  2. No menu principal de navegação, vá a Rede em Definições.
  3. Na secção Resource instances, adicione uma exceção para o seu espaço de trabalho Azure Synapse.
  4. Selecione Microsoft.Synapse/workspaces como Tipo de recurso.
  5. Selecione o nome do seu espaço de trabalho como nome de Instância.
  6. Selecione Guardar.

Configuração do firewall do Armazenamento do Azure via PowerShell

Siga estes passos para configurar a sua conta de armazenamento e adicionar uma exceção para o espaço de trabalho do Azure Synapse.

  1. Abre o PowerShell ou instala o PowerShell.

  2. Instale as versões mais recentes do módulo Az.Storage e do módulo Az.Synapse, por exemplo, no seguinte script:

    Install-Module -Name Az.Storage -RequiredVersion 3.4.0
    Install-Module -Name Az.Synapse -RequiredVersion 0.7.0
    

    Importante

    Certifica-te de que usas pelo menos a versão 3.4.0. Podes verificar a versão do teu Az.Storage executando este comando:

    Get-Module -ListAvailable -Name Az.Storage | Select Version
    
  3. Ligue-se ao seu Inquilino Azure:

    Connect-AzAccount
    
  4. Defina variáveis no PowerShell:

    • Nome do grupo de recursos - pode encontrar isto no portal Azure no Visão Geral da sua conta de armazenamento.
    • Nome da Conta - nome da conta de armazenamento protegida pelas regras do firewall.
    • ID de Inquilino - pode encontrá-lo no portal Azure em Microsoft Entra ID, em Properties, em Tenant Properties.
    • Nome do Espaço de Trabalho - Nome do Azure Synapse Workspace.
        $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
    

    Importante

    O valor do $resourceid devolvido pelo script PowerShell deve corresponder a este modelo: /subscriptions/{subscription-id}/resourcegroups/{resource-group}/providers/Microsoft.Synapse/workspaces/{name-of-workspace} É importante escrever resourcegroups em minúsculas.

  5. Adicione uma regra de rede de contas de armazenamento Azure:

        $parameters = @{
            ResourceGroupName = $resourceGroupName
            Name = $accountName
            TenantId = $tenantId 
            ResourceId = $resourceId
        }
    
        Add-AzStorageAccountNetworkRule @parameters
    
  6. Verifica se a regra da rede de contas de armazenamento foi aplicada no firewall da tua conta de armazenamento. O script PowerShell seguinte compara a $resourceid variável dos passos anteriores com a saída da regra da rede de contas de armazenamento.

        $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
            }
        }
    

Credenciais

Para consultar um ficheiro localizado no Armazenamento do Azure, o seu endpoint de pool SQL serverless precisa de uma credencial que contenha a informação de autenticação. São utilizados dois tipos de credenciais:

  • A credencial de nível de servidor é usada para consultas ad-hoc executadas usando a função OPENROWSET. O nome da credencial deve corresponder à URL de armazenamento.
  • Uma credencial com âmbito de base de dados é usada para tabelas externas. Referências a tabelas externas DATA SOURCE com a credencial que deve ser usada para aceder ao armazenamento.

Conceder permissões para gerir credenciais

Para conceder a capacidade de gerir credenciais:

  • Para permitir que um utilizador crie ou elimine uma credencial ao nível do servidor, um administrador deve conceder a ALTER ANY CREDENTIAL permissão para o seu login na base de dados principal. Por exemplo:

    GRANT ALTER ANY CREDENTIAL TO [login_name];
    
  • Para permitir que um utilizador crie ou elimine uma credencial com âmbito de base de dados, um administrador deve conceder a CONTROL permissão sobre a base de dados ao utilizador da base de dados na base de dados. Por exemplo:

    GRANT CONTROL ON DATABASE::[database_name] TO [user_name];
    

Conceder permissões para usar credenciais

Os utilizadores de bases de dados que acedam a armazenamento externo devem ter permissão para usar credenciais. Para usar a credencial, o utilizador deve ter a REFERENCES permissão sobre uma credencial específica.

Para conceder a REFERENCES permissão a uma credencial ao nível do servidor para um login, use a seguinte consulta T-SQL na base de dados mestre:

GRANT REFERENCES ON CREDENTIAL::[server-level_credential] TO [login_name];

Para conceder uma REFERENCES permissão numa credencial com âmbito de base de dados para um utilizador de base de dados, use a seguinte consulta T-SQL na base de dados do utilizador:

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[database-scoped_credential] TO [user_name];

Credencial ao nível do servidor

As credenciais ao nível do servidor são usadas quando um login SQL chama a função OPENROWSET sem um DATA_SOURCE para ler ficheiros numa conta de armazenamento.

O nome da credencial ao nível do servidor must corresponde à URL base do armazenamento Azure, opcionalmente seguido de um nome de contentor. Uma credencial é adicionada ao executar o CREATE CREDENTIAL. Tens de apresentar o argumento CREDENTIAL NAME .

Nota

O FOR CRYPTOGRAPHIC PROVIDER argumento não é suportado.

O nome do CREDENTIAL ao nível do servidor deve corresponder ao seguinte formato: <prefix>://<storage_account_path>[/<container_name>]. Os caminhos das contas de armazenamento são descritos na tabela seguinte:

Fonte de dados externa Prefixo Caminho da conta de armazenamento
Armazenamento de Blobs do Azure 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

As credenciais ao nível do servidor conseguem então aceder ao armazenamento Azure usando os seguintes tipos de autenticação:

Os utilizadores do Microsoft Entra podem aceder a qualquer ficheiro no armazenamento Azure se forem membros das funções de Proprietário de Dados de Blob de Armazenamento, Contribuidor de Dados de Blob de Armazenamento ou Leitor de Dados de Blob de Armazenamento. Os utilizadores da Microsoft Entra não precisam de credenciais para aceder ao armazenamento.

Os utilizadores autenticados por SQL não podem usar a autenticação Microsoft Entra para aceder ao armazenamento. Podem aceder ao armazenamento através de uma credencial de base de dados usando Identidade Gerida, Chave SAS, Principal de Serviço ou, se houver acesso público ao armazenamento.

Credencial com escopo específico para base de dados

Credenciais com âmbito de base de dados são usadas quando qualquer chamada OPENROWSET principal funciona com DATA_SOURCE ou seleciona dados de tabelas externas que não acedem a ficheiros públicos. A credencial com âmbito de base de dados não precisa de corresponder ao nome da conta de armazenamento, está referenciada em FONTE DE DADOS que define a localização do armazenamento.

As credenciais com âmbito de base de dados permitem o acesso ao armazenamento Azure usando os seguintes tipos de autenticação:

Os utilizadores do Microsoft Entra podem aceder a qualquer ficheiro no armazenamento Azure se forem membros das funções Storage Blob Data Owner, Storage Blob Data Contributor ou Storage Blob Data Reader. Os utilizadores da Microsoft Entra não precisam de credenciais para aceder ao armazenamento.

CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>'
)

Os utilizadores autenticados por SQL não podem usar a autenticação Microsoft Entra para aceder ao armazenamento. Podem aceder ao armazenamento através de uma credencial de base de dados usando Identidade Gerida, Chave SAS, Principal de Serviço ou, se houver acesso público ao armazenamento.

Credenciais com âmbito de base de dados são usadas em fontes de dados externas para especificar que método de autenticação será usado para aceder a este armazenamento:

CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>',
          CREDENTIAL = <name of database scoped credential> 
)

Exemplos

Aceda a uma fonte de dados pública disponível

Use o script seguinte para criar uma tabela que acede à fonte de dados publicamente disponível.

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] )

O utilizador da base de dados pode ler o conteúdo dos ficheiros da fonte de dados usando a função de tabela externa ou OPENROWSET que faz referência à fonte de dados:

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

Aceder a uma fonte de dados usando credenciais

Modifique o script seguinte para criar uma tabela externa que acede ao armazenamento Azure usando o token SAS, a identidade Microsoft Entra do utilizador ou a identidade gerida do espaço de trabalho.

-- 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] );

O utilizador da base de dados pode ler o conteúdo dos ficheiros da fonte de dados usando a função de tabela externa ou OPENROWSET que faz referência à fonte de dados:

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

Estes artigos ajudam-no a aprender como consultar diferentes tipos de pastas, tipos de ficheiros e criar e usar vistas: