Tutorial: Usar uma identidade gerenciada atribuída pelo sistema da VM do Windows para acessar o SQL AzureTutorial: Use a Windows VM system-assigned managed identity to access Azure SQL

Identidades gerenciadas para recursos do Azure é um recurso do Azure Active Directory.Managed identities for Azure resources is a feature of Azure Active Directory. Cada um dos serviços do Azure que dão suporte a identidades gerenciadas para recursos do Azure está sujeito à própria linha do tempo.Each of the Azure services that support managed identities for Azure resources are subject to their own timeline. Não deixe de examinar o status de disponibilidade das identidades gerenciadas do seu recurso e os problemas conhecidos antes de começar.Make sure you review the availability status of managed identities for your resource and known issues before you begin.

Este tutorial mostra como usar uma identidade atribuída pelo sistema para uma VM (máquina virtual) do Windows para acessar o SQL Server do Azure.This tutorial shows you how to use a system-assigned identity for a Windows virtual machine (VM) to access an Azure SQL server. As Identidades de Serviço Gerenciadas são gerenciadas automaticamente pelo Azure e permitem a você autenticar os serviços que dão suporte à autenticação do Azure AD sem necessidade de inserir as credenciais em seu código.Managed Service Identities are automatically managed by Azure and enable you to authenticate to services that support Azure AD authentication, without needing to insert credentials into your code. Você aprenderá como:You learn how to:

  • Conceda à sua VM acesso a um SQL Server do AzureGrant your VM access to an Azure SQL server
  • Habilitar a autenticação do Azure AD para o SQL ServerEnable Azure AD authentication for the SQL server
  • Crie um usuário contido no banco de dados que represente a identidade atribuída do sistema da VMCreate a contained user in the database that represents the VM's system assigned identity
  • Obtenha um token de acesso usando a identidade da VM e use-o para consultar um SQL Server do AzureGet an access token using the VM identity and use it to query an Azure SQL server

Pré-requisitosPrerequisites

Conceda à VM acesso a um banco de dados em um SQL Server do AzureGrant your VM access to a database in an Azure SQL server

Para conceder acesso da sua VM a um banco de dados em um SQL Server do Azure, você pode usar um SQL Server existente ou criar um novo.To grant your VM access to a database in an Azure SQL Server, you can use an existing SQL server or create a new one. Para criar um novo servidor e banco de dados usando o portal do Azure, siga este início rápido do Azure SQL.To create a new server and database using the Azure portal, follow this Azure SQL quickstart. Também há inícios rápidos que usam a CLI do Azure e o Azure PowerShell na documentação do SQL Azure.There are also quickstarts that use the Azure CLI and Azure PowerShell in the Azure SQL documentation.

Há duas etapas para conceder acesso da VM a um banco de dados:There are two steps to granting your VM access to a database:

  1. Habilite a autenticação do Azure AD para o SQL Server.Enable Azure AD authentication for the SQL server.
  2. Crie um usuário contido no banco de dados que represente a identidade atribuída do sistema da VM.Create a contained user in the database that represents the VM's system-assigned identity.

Habilitar a autenticação do Azure AD para o SQL ServerEnable Azure AD authentication for the SQL server

Configure a autenticação do Azure AD para o SQL Server usando estas etapas:Configure Azure AD authentication for the SQL server using the following steps:

  1. No portal do Azure, selecione Servidores SQL na navegação à esquerda.In the Azure portal, select SQL servers from the left-hand navigation.
  2. Clique no SQL Server a ser habilitado para autenticação do Azure AD.Click the SQL server to be enabled for Azure AD authentication.
  3. Na seção Configurações da folha, clique em Administrador do Active Directory.In the Settings section of the blade, click Active Directory admin.
  4. Na barra de comandos, clique em Definir administrador.In the command bar, click Set admin.
  5. Selecione uma conta de usuário do Azure AD para ser um administrador do servidor e clique em Selecionar.Select an Azure AD user account to be made an administrator of the server, and click Select.
  6. Na barra de comandos, clique em Salvar.In the command bar, click Save.

Crie um usuário contido no banco de dados que represente a identidade atribuída do sistema da VMCreate a contained user in the database that represents the VM's system assigned identity

Para esta próxima etapa, você precisará do SSMS (Microsoft SQL Server Management Studio).For this next step, you will need Microsoft SQL Server Management Studio (SSMS). Antes de começar, também pode ser útil examinar os seguintes artigos para obter informações sobre a integração do Azure AD:Before beginning, it may also be helpful to review the following articles for background on Azure AD integration:

O BD SQL requer nomes de exibição exclusivos do AAD.SQL DB requires unique AAD display names. Com isso, contas do AAD como usuários, grupos e Entidades de serviço (aplicativos) e nomes de VM habilitados para identidade gerenciada devem ser definidos exclusivamente no AAD com relação a seus nomes de exibição.With this, the AAD accounts such as users, groups and Service Principals (applications) and VM names enabled for managed identity must be uniquely defined in AAD regarding their display names. O BD SQL verifica o nome de exibição do AAD durante a criação do T-SQL desses usuários e, se ele não for exclusivo, o comando falhará solicitando para fornecer um nome de exibição do AAD exclusivo para uma determinada conta.SQL DB checks the AAD display name during T-SQL creation of such users and if it is not unique, the command fails requesting to provide a unique AAD display name for a given account.

  1. Inicie o SQL Server Management Studio.Start SQL Server Management Studio.

  2. Na caixa de diálogo Conectar-se ao servidor, insira o nome de seu SQL Server no campo Nome do servidor.In the Connect to Server dialog, Enter your SQL server name in the Server name field.

  3. No campo Autenticação, selecione Active Directory – Universal com suporte para MFA.In the Authentication field, select Active Directory - Universal with MFA support.

  4. No campo Nome de usuário, digite o nome da conta do Azure AD que você definir como o administrador do servidor, por exemplo, helen@woodgroveonline.comIn the User name field, enter the name of the Azure AD account that you set as the server administrator, for example, helen@woodgroveonline.com

  5. Clique em Opções.Click Options.

  6. No campo Conectar-se ao banco de dados, digite o nome do banco de dados não são do sistema que você deseja configurar.In the Connect to database field, enter the name of the non-system database you want to configure.

  7. Clique em Conectar.Click Connect. Conclua o processo de conexão.Complete the sign-in process.

  8. No Pesquisador de Objetos, expanda a pasta Bancos de Dados.In the Object Explorer, expand the Databases folder.

  9. Clique com o botão direito do mouse em um banco de dados de usuário e clique em Nova consulta.Right-click on a user database and click New query.

  10. Na janela de consulta, insira a linha a seguir e clique em Executar na barra de ferramentas:In the query window, enter the following line, and click Execute in the toolbar:

    Observação

    VMName no comando a seguir é o nome da VM para a qual você habilitou o sistema de identidade atribuído na seção de pré-requisitos.VMName in the following command is the name of the VM that you enabled system assigned identity on in the prerequsites section.

    CREATE USER [VMName] FROM EXTERNAL PROVIDER
    

    O comando deve ser concluído com êxito, criando o usuário independente para a identidade atribuída ao sistema da VM.The command should complete successfully, creating the contained user for the VM's system-assigned identity.

  11. Desmarque a janela de consulta, insira a linha a seguir e clique em Executar na barra de ferramentas:Clear the query window, enter the following line, and click Execute in the toolbar:

    Observação

    VMName no comando a seguir é o nome da VM para a qual você habilitou o sistema de identidade atribuído na seção de pré-requisitos.VMName in the following command is the name of the VM that you enabled system assigned identity on in the prerequsites section.

    ALTER ROLE db_datareader ADD MEMBER [VMName]
    

    O comando deve ser concluído com êxito, concedendo ao usuário independente a capacidade de ler todo o banco de dados.The command should complete successfully, granting the contained user the ability to read the entire database.

O código em execução na VM agora pode obter um token usando sua identidade gerenciada atribuída pelo sistema e usar o token para autenticar-se para o SQL server.Code running in the VM can now get a token using its system-assigned managed identity and use the token to authenticate to the SQL server.

Obter um token de acesso usando a identidade gerenciada atribuída pelo sistema da VM e usá-lo para chamar o Azure SQLGet an access token using the VM's system-assigned managed identity and use it to call Azure SQL

O SQL Azure tem suporte nativo para autenticação do Azure AD, de modo que pode aceitar diretamente os tokens de acesso obtidos usando identidades gerenciadas para recursos do Azure.Azure SQL natively supports Azure AD authentication, so it can directly accept access tokens obtained using managed identities for Azure resources. Você usa o método token de acesso para criar uma conexão para o SQL.You use the access token method of creating a connection to SQL. Isso faz parte da integração do SQL Azure ao Azure AD e é diferente de fornecer as credenciais na cadeia de conexão.This is part of Azure SQL's integration with Azure AD, and is different from supplying credentials on the connection string.

Aqui está um exemplo de código .NET de abertura de uma conexão a SQL usando um token de acesso.Here's a .NET code example of opening a connection to SQL using an access token. Esse código deve ser executado na VM para ser capaz de acessar o ponto de extremidade da identidade gerenciada atribuída pelo sistema da VM.This code must run on the VM to be able to access the VM's system-assigned managed identity's endpoint. É necessário ter o .NET Framework 4.6 ou superior para usar o método de token de acesso..NET Framework 4.6 or higher is required to use the access token method. Substitua os valores de AZURE-SQL-SERVERNAME e DATABASE de acordo.Replace the values of AZURE-SQL-SERVERNAME and DATABASE accordingly. Observe a ID de recurso para o SQL Azure é https://database.windows.net/.Note the resource ID for Azure SQL is https://database.windows.net/.

using System.Net;
using System.IO;
using System.Data.SqlClient;
using System.Web.Script.Serialization;

//
// Get an access token for SQL.
//
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://database.windows.net/");
request.Headers["Metadata"] = "true";
request.Method = "GET";
string accessToken = null;

try
{
    // Call managed identities for Azure resources endpoint.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // Pipe response Stream to a StreamReader and extract access token.
    StreamReader streamResponse = new StreamReader(response.GetResponseStream());
    string stringResponse = streamResponse.ReadToEnd();
    JavaScriptSerializer j = new JavaScriptSerializer();
    Dictionary<string, string> list = (Dictionary<string, string>) j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
    accessToken = list["access_token"];
}
catch (Exception e)
{
    string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
}

//
// Open a connection to the SQL server using the access token.
//
if (accessToken != null) {
    string connectionString = "Data Source=<AZURE-SQL-SERVERNAME>; Initial Catalog=<DATABASE>;";
    SqlConnection conn = new SqlConnection(connectionString);
    conn.AccessToken = accessToken;
    conn.Open();
}

Como alternativa, uma maneira rápida de testar a configuração de ponta a ponta sem necessidade de escrever e implantar um aplicativo na VM é usando o PowerShell.Alternatively, a quick way to test the end to end setup without having to write and deploy an app on the VM is using PowerShell.

  1. No portal, navegue até Máquinas Virtuais e vá para a máquina virtual do Windows e em Visão geral, clique em Conectar.In the portal, navigate to Virtual Machines and go to your Windows virtual machine and in the Overview, click Connect.

  2. Insira o seu Nome de usuário e Senha que você adicionou quando criou a VM do Windows.Enter in your Username and Password for which you added when you created the Windows VM.

  3. Agora que você criou uma Conexão de Área de Trabalho Remota com a máquina virtual, abra o PowerShell na sessão remota.Now that you have created a Remote Desktop Connection with the virtual machine, open PowerShell in the remote session.

  4. Usando o Invoke-WebRequest do PowerShell, faça uma solicitação para o ponto de extremidade da identidade gerenciada local para obter um token de acesso ao SQL Azure.Using PowerShell’s Invoke-WebRequest, make a request to the local managed identity's endpoint to get an access token for Azure SQL.

        $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatabase.windows.net%2F' -Method GET -Headers @{Metadata="true"}
    

    Converta a resposta de um objeto JSON para um objeto do PowerShell.Convert the response from a JSON object to a PowerShell object.

    $content = $response.Content | ConvertFrom-Json
    

    Extraia o token de acesso da resposta.Extract the access token from the response.

    $AccessToken = $content.access_token
    
  5. Abra uma conexão com o SQL Server.Open a connection to the SQL server. Lembre-se de substituir os valores para AZURE-SQL-SERVERNAME e DATABASE.Remember to replace the values for AZURE-SQL-SERVERNAME and DATABASE.

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Data Source = <AZURE-SQL-SERVERNAME>; Initial Catalog = <DATABASE>"
    $SqlConnection.AccessToken = $AccessToken
    $SqlConnection.Open()
    

    Em seguida, crie e envie uma consulta para o servidor.Next, create and send a query to the server. Lembre-se de substituir o valor para TABLE.Remember to replace the value for TABLE.

    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "SELECT * from <TABLE>;"
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    

Examine o valor de $DataSet.Tables[0] para exibir os resultados da consulta.Examine the value of $DataSet.Tables[0] to view the results of the query.

Próximas etapasNext steps

Neste tutorial, você aprendeu a usar uma identidade gerenciada atribuída pelo sistema para acessar o SQL Server do Azure.In this tutorial, you learned how to use a system-assigned managed identity to access Azure SQL server. Para saber mais sobre o Azure SQL Server, consulte:To learn more about Azure SQL Server see: