Partilhar via


Tutorial: Criar utilizadores Microsoft Entra usando aplicações Microsoft Entra

Aplica-se a: Base de Dados SQL do Azure

Este artigo explica como configurar um principal de serviço para que possa criar utilizadores Microsoft Entra no Base de Dados SQL do Azure. Esta funcionalidade permite-lhe gerir programaticamente o acesso aos recursos SQL do Azure para utilizadores e aplicações no seu tenant Microsoft Entra.

Observação

Microsoft Entra ID era anteriormente conhecido como Azure Active Directory (Azure d.C.).

Para obter mais informações sobre a autenticação Microsoft Entra para SQL do Azure, consulte Utilizar a autenticação Microsoft Entra.

Neste tutorial, aprenderás como:

  • Atribuir uma identidade ao servidor lógico
  • Atribuir a função Leitores de Diretório à identidade do servidor
  • Registe uma candidatura no Microsoft Entra ID
  • Crie um utilizador de base de dados para o principal de serviço dessa aplicação no Base de Dados SQL do Azure
  • Crie um utilizador de base de dados do Microsoft Entra com o principal de serviço

Pré-requisitos

  • Uma implementação Base de Dados SQL do Azure existente. Este tutorial assume que tens uma base de dados SQL a funcionar.
  • Microsoft Entra Privileged Role Administrator permissões no tenant onde a tua base de dados SQL reside.
  • A versão mais recente do módulo Az.Sql PowerShell.
  • A versão mais recente do módulo PowerShell Microsoft.Graph.

Atribuir uma identidade ao servidor lógico

  1. Ligue-se ao Azure, especificando o inquilino Microsoft Entra que hospeda a sua base de dados SQL. O ID do Inquilino pode ser encontrado na página Overview do seu recurso Microsoft Entra ID no portal Azure. Copie a ID do Locatário e execute o seguinte comando do PowerShell:

    • Substitua <TenantId> pelo ID do locatário.
    Connect-AzAccount -Tenant <TenantId>
    

    Registre o TenantId para uso futuro neste tutorial.

  2. Gerar uma identidade gerida atribuída pelo sistema e atribuí-la ao servidor lógico em Azure. Execute o seguinte comando do PowerShell:

    • Substitua <ResourceGroupName> e <ServerName> com seus recursos no comando Set-AzSqlServer . Se o nome do servidor for myserver.database.windows.net, substitua <ServerName> por myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Verifique se a identidade do servidor foi atribuída com êxito. Execute o seguinte comando do PowerShell:

    • Substitua <ResourceGroupName> e <ServerName> pelos seus recursos. Se o nome do servidor for myserver.database.windows.net, substitua <ServerName> por myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    A sua saída mostra PrincipalId, Type, e TenantId. A identidade atribuída é o PrincipalId.

  4. Também pode verificar a identidade indo ao portal Azure.

    • No recurso Microsoft Entra ID, vá a aplicações empresariais. Digite o nome do seu servidor lógico. A ID do objeto que aparece no recurso é a ID da identidade do servidor primário.

    A captura de tela mostra onde encontrar a ID do objeto para um aplicativo empresarial.

Sugestão

Como alternativa a uma identidade gerida atribuída pelo sistema, pode usar uma identidade gerida atribuída pelo utilizador. Uma identidade gerida atribuída pelo utilizador pode ser partilhada entre múltiplos servidores lógicos, o que reduz o número de identidades a gerir e simplifica a atribuição de funções. Para mais informações, consulte Identidade gerida atribuída pelo utilizador em Microsoft Entra ID para SQL do Azure.

Adicionar identidade do servidor à função Leitores de Diretório

A identidade do servidor requer permissões para consultar o Microsoft Entra ID para funções administrativas, o que inclui criar utilizadores e logins do Microsoft Entra, e expandir o grupo para aplicar permissões de utilizador com base na sua filiação ao grupo Microsoft Entra. Se as permissões de identidade do servidor para consultar o Microsoft Entra ID forem revogadas, ou se a identidade do servidor for eliminada, a autenticação Microsoft Entra deixa de funcionar.

Atribua permissões de consulta Microsoft Entra à identidade de servidor adicionando-a à função Leitores de Diretório ou atribuindo as seguintes permissões de nível mais baixo Microsoft Graph:

Observação

Este script deve ser executado por uma função Microsoft Entra Privileged Role Administrator ou superior.

O script seguinte concede permissão aos "Leitores de Diretório" do Microsoft Entra para uma identidade que representa o servidor lógico do Base de Dados SQL do Azure.

  • Substitua o <TenantId> pelo TenantId que recolheu anteriormente.
  • Substitua <ServerName> pelo nome do servidor lógico. Se o nome do servidor for myserver.database.windows.net, substitua <ServerName> por myserver.
# This script grants "Directory Readers" permission to a service principal representing a logical server for Azure SQL Database
# It can be executed only by a user who is a member of the **Privileged Role Administrator** or higher role.
# To check if the "Directory Readers" role was granted, re-execute this script

Import-Module Microsoft.Graph.Authentication
$ServerIdentityName = "<ServerName>"    # Enter your logical server name
$TenantId = "<TenantId>"                # Enter your tenant ID

Connect-MgGraph -TenantId "<TenantId>" -Scopes "RoleManagement.ReadWrite.Directory,Application.Read.All"

# Get Microsoft Entra "Directory Readers" role and create if it doesn't exist
$roleName = "Directory Readers"
$role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
if ($role -eq $null) {
    # Instantiate an instance of the role template
    $roleTemplate = Get-MgDirectoryRoleTemplate -Filter "DisplayName eq '$roleName'"
    New-MgDirectoryRoleTemplate -RoleTemplateId $roleTemplate.Id
    $role = Get-MgDirectoryRole -Filter "DisplayName eq '$roleName'"
}

# Get service principal for server
$roleMember = Get-MgServicePrincipal -Filter "DisplayName eq '$ServerIdentityName'"
$roleMember.Count
if ($roleMember -eq $null) {
    Write-Output "Error: No service principal with name '$($ServerIdentityName)' found, make sure that ServerIdentityName parameter was entered correctly."
    exit
}
if (-not ($roleMember.Count -eq 1)) {
    Write-Output "Error: Multiple service principals with name '$($ServerIdentityName)'"
    Write-Output $roleMember | Format-List DisplayName, Id, AppId
    exit
}

# Check if service principal is already member of Directory Readers role
$isDirReader = Get-MgDirectoryRoleMember -DirectoryRoleId $role.Id -Filter "Id eq '$($roleMember.Id)'"

if ($isDirReader -eq $null) {
    # Add principal to Directory Readers role
    Write-Output "Adding service principal '$($ServerIdentityName)' to 'Directory Readers' role'..."
    $body = @{
        "@odata.id"= "https://graph.microsoft.com/v1.0/directoryObjects/{$($roleMember.Id)}"
    }
    New-MgDirectoryRoleMemberByRef -DirectoryRoleId $role.Id -BodyParameter $body
    Write-Output "'$($ServerIdentityName)' service principal added to 'Directory Readers' role'."
} else {
    Write-Output "Service principal '$($ServerIdentityName)' is already member of 'Directory Readers' role'."
}

Observação

A saída deste script indica se a identidade está atribuída à função Leitores de Diretório. Você pode executar novamente o script se não tiver certeza se a permissão foi concedida.

Para uma abordagem semelhante sobre como atribuir o papel Leitores de Diretório para SQL Managed Instance, veja Set Microsoft Entra admin.

Em ambientes de produção, uma prática comum de gestão é atribuir o papel Leitores de Diretório a um grupo de função atribuível no Microsoft Entra ID. Em seguida, os proprietários do grupo podem adicionar identidades gerenciadas ao grupo. Isso mantém o princípio do menor privilégio e ignora a necessidade de um Administrador de Função Privilegiada conceder a função Leitores de Diretório individualmente a cada instância SQL. Para mais informações sobre esta funcionalidade, consulte o papel de Leitores do Diretório em Microsoft Entra ID para SQL do Azure.

Crie uma aplicação no Microsoft Entra ID

Registe as suas candidaturas. Para registar uma aplicação, precisas pelo menos da função de Microsoft Entra ID Desenvolvedor de Aplicações. Para mais informações sobre a atribuição de funções, veja Atribuir funções de utilizador em Microsoft Entra ID.

Este tutorial usa duas entidades de serviço. A primeira principal de serviço, DBOwnerApp, é usada para criar outros utilizadores na base de dados. A segunda entidade de serviço, myapp, é o aplicativo para o qual DBOwnerApp cria um usuário de banco de dados para uso posterior neste tutorial.

Para registar as suas candidaturas:

  1. No portal Azure, selecione Microsoft Entra ID>Registos de aplicações>Novo registo.

    A captura de tela mostra a página Registrar um aplicativo.

    Depois que o registro do aplicativo é criado, o valor da ID do aplicativo (cliente) é gerado e exibido. Registre esse valor para uso futuro neste tutorial.

    Captura de ecrã do portal Azure que mostra o ID da Aplicação

  2. Crie um segredo de cliente para a aplicação iniciar sessão. Siga carregar um certificado ou criar um segredo para entrar. Registre o segredo do cliente para DBOwnerApp para uso futuro neste tutorial.

Para mais informações, consulte Utilize o portal para criar uma aplicação Microsoft Entra e um principal de serviço que possa aceder a recursos.

Criar o usuário principal do serviço

Adicione a entidade de serviço recém-criada, DBOwnerApp, como um usuário no Banco de dados SQL e atribua permissões a ela.

Ligue-se à sua base de dados SQL usando uma identidade Microsoft Entra que tenha permissões para criar outros utilizadores.

Importante

Apenas os utilizadores Microsoft Entra podem criar outros utilizadores Microsoft Entra no Base de Dados SQL do Azure. Nenhum utilizador baseado na autenticação SQL, incluindo o administrador do servidor, pode criar um utilizador Microsoft Entra. O administrador do Microsoft Entra é o único utilizador que pode inicialmente criar outros utilizadores do Microsoft Entra na base de dados SQL. Depois de o administrador da Microsoft Entra criar outros utilizadores, qualquer utilizador da Microsoft Entra com as devidas permissões pode criar outros utilizadores da Microsoft Entra.

  1. Crie o usuário DBOwnerApp no Banco de dados SQL usando o seguinte comando T-SQL:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Para criar outros utilizadores Microsoft Entra, é necessária, pelo menos, a permissão ALTER ANY USER SQL. Esta permissão é também herdada através da adesão ao db_owner e da atribuição como administrador Microsoft Entra. Os exemplos seguintes demonstram três opções diferentes para atribuir permissões a DBOwnerApp que lhe permitem criar outros utilizadores Microsoft Entra na base de dados.

    Você pode adicionar DBOwnerApp à função db_owner com sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    Você pode atribuir a ALTER ANY USER permissão para DBOwnerApp como o seguinte exemplo de T-SQL:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    Podes definir o DBOwnerApp como administrador Microsoft Entra. Usa o portal Azure, PowerShell ou comandos CLI do Azure. Para mais informações, consulte Set Microsoft Entra admin.

Criar um utilizador com um service principal

  1. Use o seguinte script para criar um utilizador principal de serviço Microsoft Entra myapp usando o principal de serviço DBOwnerApp:

    • Substitua o <TenantId> pelo TenantId que recolheu anteriormente.
    • Substitua o <ClientId> pelo ClientId que recolheu anteriormente.
    • Substitua <ClientSecret> pelo segredo do cliente criado anteriormente.
    • Substitua <ServerName> pelo nome do servidor lógico. Se o nome do servidor for myserver.database.windows.net, substitua <ServerName> por myserver.
    • Substitua <database name> pelo nome do Banco de dados SQL.

    Observação

    O script seguinte requer o Microsoft. Data.SqlClient assembly. Instale-o a partir do pacote NuGet e carregue a DLL com Add-Type -Path "path\to\Microsoft.Data.SqlClient.dll" antes de executar o script.

    # PowerShell script for creating a new SQL user called myapp using application DBOwnerApp with secret
    # DBOwnerApp is an admin for the server
    
    # Download latest  MSAL  - https://www.powershellgallery.com/packages/MSAL.PS
    Import-Module MSAL.PS
    
    $tenantId = "<TenantId>"   # Microsoft Entra tenant ID where DBOwnerApp resides
    $clientId = "<ClientId>"   # Application (client) ID recorded earlier for DBOwnerApp
    $clientSecret = "<ClientSecret>"   # Client secret for DBOwnerApp
    $scopes = "https://database.windows.net/.default" # The endpoint
    
    $result = Get-MsalToken -RedirectUri $uri -ClientId $clientId -ClientSecret (ConvertTo-SecureString $clientSecret -AsPlainText -Force) -TenantId $tenantId -Scopes $scopes
    
    $Tok = $result.AccessToken
    #Write-host "token"
    $Tok
    
    $SQLServerName = "<ServerName>"    # Logical server name
    $DatabaseName = "<database name>"   # Azure SQL database name
    
    Write-Host "Create SQL connection string"
    $conn = New-Object Microsoft.Data.SqlClient.SqlConnection
    $conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
    $conn.AccessToken = $Tok
    
    Write-host "Connect to database and execute SQL script"
    $conn.Open()
    $ddlstmt = 'CREATE USER [myapp] FROM EXTERNAL PROVIDER;'
    Write-host " "
    Write-host "SQL DDL command"
    $ddlstmt
    $command = New-Object -TypeName Microsoft.Data.SqlClient.SqlCommand($ddlstmt, $conn)
    
    Write-host "results"
    $command.ExecuteNonQuery()
    $conn.Close()
    

    Em alternativa, pode usar o seguinte código: Autenticação de principal de serviço do Microsoft Entra para o Base de Dados SQL do Azure. Modifique o script para executar a instrução DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. Use o mesmo script para criar um utilizador ou grupo Microsoft Entra na sua base de dados.

  2. Verifique se o usuário myapp existe no banco de dados executando o seguinte comando:

    SELECT name, type, type_desc, CAST(CAST(sid as varbinary(16)) as uniqueidentifier) as appId
    FROM sys.database_principals
    WHERE name = 'myapp'
    GO
    

    Você deve ver um resultado semelhante:

    name    type    type_desc    appId
    myapp    E    EXTERNAL_USER    aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb