Tutorial: Creación de usuarios de Microsoft Entra con aplicaciones de Microsoft Entra

Se aplica a:Azure SQL Database

En este artículo se explica cómo configurar una entidad de servicio para que pueda crear usuarios de Microsoft Entra en Azure SQL Database. Esta funcionalidad permite la configuración mediante programación de la administración de acceso a los recursos de Azure SQL para usuarios y aplicaciones del inquilino de Microsoft Entra.

Nota:

Microsoft Entra ID era conocido anteriormente como Azure Active Directory (Azure AD).

Para obtener más información sobre la autenticación de Microsoft Entra para Azure SQL, consulte Uso de la autenticación de Microsoft Entra.

En este tutorial, aprenderá a:

  • Asignación de una identidad al servidor lógico
  • Asignación del rol Lectores de directorio a la identidad del servidor
  • Registro de una aplicación en Microsoft Entra ID
  • Creación de un usuario de base de datos para la entidad de servicio de esa aplicación en Azure SQL Database
  • Creación de un usuario de base de datos de Microsoft Entra con la entidad de servicio

Requisitos previos

  • Una implementación de Azure SQL Database existente. Suponemos que tiene una base de datos SQL Database en funcionamiento para este tutorial.
  • Permisos de Microsoft Entra Global Administrator o Privileged Role Administrator en el inquilino donde reside la base de datos SQL.
  • La versión más reciente del módulo de PowerShell Az.Sql.
  • Instale la última versión del módulo de PowerShell Microsoft.Graph.

Asignación de una identidad al servidor lógico

  1. Conéctese a Azure, especificando el inquilino de Microsoft Entra que hospeda la base de datos SQL. El identificador de inquilino puede encontrarse en la página Información general de su recurso Microsoft Entra ID en Azure Portal. Copie el identificador de inquilino y ejecute el siguiente comando de PowerShell:

    • Remplace <TenantId> por su identificador de inquilino.
    Connect-AzAccount -Tenant <TenantId>
    

    Anote el valor de TenantId para usarlo más adelante en este tutorial.

  2. Genere una identidad administrada asignada por el sistema y asígnela al servidor lógico en Azure. Ejecute el siguiente comando de PowerShell:

    • Reemplace <ResourceGroupName> y <ServerName> por los recursos en el comando Set-AzSqlServer. Si el nombre del servidor es myserver.database.windows.net, sustituya <ServerName> por myserver.
    Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
    
  3. Compruebe que la identidad del servidor se asignara correctamente. Ejecute el siguiente comando de PowerShell:

    • Reemplace <ResourceGroupName> y <ServerName> por sus recursos. Si el nombre del servidor es myserver.database.windows.net, reemplace <ServerName> por myserver.
    $xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName>
    $xyz.identity
    

    La salida debería mostrar PrincipalId, Type y TenantId. La identidad asignada es el PrincipalId.

  4. También puede comprobar la identidad si va a Azure Portal.

    • En el recurso Microsoft Entra ID, vaya a Aplicaciones empresariales. Escriba el nombre del servidor lógico. El id. de objeto que aparece en el recurso es el identificador de la identidad del servidor principal.

    Screenshot shows where to find the Object ID for an enterprise application.

Adición de la identidad del servidor al rol Lectores de directorio

La identidad del servidor requiere permisos para consultar Microsoft Entra ID para las funciones administrativas, lo que incluye la creación de usuarios e inicios de sesión de Microsoft Entra, y realizar la expansión de grupos para aplicar permisos de usuario en función de su pertenencia a grupos de Microsoft Entra. Si se revocan los permisos de identidad del servidor para consultar Microsoft Entra ID o se elimina la identidad del servidor, la autenticación de Microsoft Entra deja de funcionar.

Asigne permisos de consulta de Microsoft Entra a la identidad del servidor agregándola al rol Lectores de directorios o asignando los siguientes permisos de Microsoft Graph de nivel inferior:

Nota:

Este script debe ejecutarlo un Global Administrator o un Privileged Role Administrator de Microsoft Entra.

El siguiente script concede permiso a los lectores de directorio de Microsoft Entra a una identidad que representa el servidor lógico para Azure SQL Database.

  • Reemplace <TenantId> por el valor de TenantId recopilado anteriormente.
  • Reemplace <ServerName> por el nombre del servidor lógico. Si el nombre del servidor es myserver.database.windows.net, sustituya <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 **Global Administrator** or **Privileged Role Administrator** 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'."
}

Nota:

La salida de este script indica si la identidad se asigna al rol Lectores de directorio. Puede volver a ejecutar el script si no está seguro de si se concedió el permiso.

Para obtener más información sobre cómo asignar el rol Lectores de directorio para SQL Managed Instance, consulte Aprovisionamiento de un administrador de Microsoft Entra (SQL Managed Instance).

En entornos de producción, una práctica de administración común consiste en asignar el rol Lectores de directorio a un grupo asignable de roles en Microsoft Entra ID. A continuación, los propietarios de grupos pueden agregar identidades administradas al grupo. Esto mantiene el principio de privilegios mínimos y omite la necesidad de un Administrador global o Administrador de roles con privilegios para conceder el rol Lectores de directorio individualmente a cada instancia de SQL. Para más información sobre esta característica, consulte Rol Lectores de directorio en Microsoft Entra ID para Azure SQL.

Creación de aplicaciones en Microsoft Entra ID

Registro de las aplicaciones. Para registrar una aplicación, necesita al menos el rol Desarrollador de aplicaciones de Microsoft Entra ID. Para obtener más información sobre cómo asignar roles, vea Asignar roles de usuario en Microsoft Entra ID.

En este tutorial se usan dos entidades de servicio. La primera entidad de servicio, DBOwnerApp, se usa para crear otros usuarios en la base de datos. La segunda entidad de servicio, myapp, es la aplicación para la que DBOwnerApp crea un usuario de base de datos más adelante en este tutorial.

Para registrar las aplicaciones, siga estos pasos:

  1. En Azure Portal, seleccione Microsoft Entra ID>Registro de aplicaciones>Nuevo registro.

    Screenshot shows the Register an application page.

    Una vez que se crea el registro de aplicaciones, se genera y se muestra el valor del identificador de la aplicación (cliente). Anote este valor para usarlo más adelante en este tutorial.

    Screenshot of the Azure portal that shows the App ID.

  2. Crear un secreto de cliente para que la aplicación inicie sesión. Consulte Carga de un certificado o creación de un secreto para iniciar sesión. Registre el secreto de cliente de DBOwnerApp para su uso futuro en este tutorial.

Para obtener más información, consulte Uso del portal para crear una aplicación de Microsoft Entra y una entidad de servicio con acceso a los recursos.

Creación del usuario de la entidad de servicio

Agregue la entidad de servicio recién creada, DBOwnerApp, como usuario de SQL Database y asígnele permisos.

Conéctese a SQL Database mediante una identidad de Microsoft Entra que tenga permisos para crear otros usuarios.

Importante

Solo los usuarios de Microsoft Entra pueden crear otros usuarios de Microsoft Entra en Azure SQL Database. Ningún usuario con autenticación de SQL, incluido un administrador del servidor, puede crear un usuario de Microsoft Entra. El administrador de Microsoft Entra es el único usuario que puede crear inicialmente otros usuarios de Microsoft Entra en SQL Database. Después de que el administrador de Microsoft Entra haya creado otros usuarios, cualquier usuario de Microsoft Entra con los permisos adecuados puede crear otros usuarios de Microsoft Entra.

  1. Cree el usuario DBOwnerApp en la base de datos de SQL Database con el siguiente comando de T-SQL:

    CREATE USER [DBOwnerApp] FROM EXTERNAL PROVIDER
    GO
    
  2. Para crear otros usuarios de Microsoft Entra, como mínimo, se requiere el permiso SQL ALTER ANY USER. Este permiso también se hereda a través de la pertenencia a db_owner y a través de la asignación como administrador de Microsoft Entra. En los ejemplos siguientes se muestran tres opciones diferentes para asignar permisos a DBOwnerApp que le permiten crear otros usuarios de Microsoft Entra en la base de datos.

    Puede agregar DBOwnerApp al rol db_owner con sp_addrolemember:

    EXEC sp_addrolemember 'db_owner', [DBOwnerApp]
    GO
    

    Puede asignar el permiso ALTER ANY USER a DBOwnerApp como el ejemplo de T-SQL siguiente:

    GRANT ALTER ANY USER TO [DBOwnerApp]
    GO
    

    Puede establecer DBOwnerApp como administrador de Microsoft Entra. Esto se puede hacer mediante los comandos de Azure Portal, PowerShell o la CLI de Azure. Para más información, consulte Aprovisionamiento del administrador de Microsoft Entra (SQL Database).

Creación de un usuario con una entidad de servicio

  1. Use el siguiente script para crear un usuario de entidad de servicio de Microsoft Entra myapp mediante la entidad de servicio DBOwnerApp:

    • Reemplace <TenantId> por el valor de TenantId recopilado anteriormente.
    • Reemplace <ClientId> por el valor de ClientId recopilado anteriormente.
    • Reemplace <ClientSecret> por el secreto de cliente que creó anteriormente.
    • Reemplace <ServerName> por el nombre del servidor lógico. Si el nombre del servidor es myserver.database.windows.net, sustituya <ServerName> por myserver.
    • Reemplace <database name> por el nombre de su base de datos SQL Database.
    # 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 System.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 System.Data.SqlClient.SqlCommand($ddlstmt, $conn)       
    
    Write-host "results"
    $command.ExecuteNonQuery()
    $conn.Close()
    

    Como alternativa, puede usar el código siguiente: autenticación de entidad de servicio de Microsoft Entra en Azure SQL Database. Modifique el script para ejecutar la instrucción DDL CREATE USER [myapp] FROM EXTERNAL PROVIDER. El mismo script se puede usar para crear un usuario o un grupo de Microsoft Entra en la base de datos.

  2. Compruebe si el usuario myapp existe en la base de datos; para ello, ejecute el comando siguiente:

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

    Debería mostrarse una salida similar a la siguiente:

    name	type	type_desc	appId
    myapp	E	EXTERNAL_USER	6d228f48-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

Pasos siguientes