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
- 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
oPrivileged 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.
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.- Remplace
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 esmyserver.database.windows.net
, sustituya<ServerName>
pormyserver
.
Set-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> -AssignIdentity
- Reemplace
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 esmyserver.database.windows.net
, reemplace<ServerName>
pormyserver
.
$xyz = Get-AzSqlServer -ResourceGroupName <ResourceGroupName> -ServerName <ServerName> $xyz.identity
La salida debería mostrar
PrincipalId
,Type
yTenantId
. La identidad asignada es elPrincipalId
.- Reemplace
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.
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 deTenantId
recopilado anteriormente. - Reemplace
<ServerName>
por el nombre del servidor lógico. Si el nombre del servidor esmyserver.database.windows.net
, sustituya<ServerName>
pormyserver
.
# 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 Configuración de un administrador de Microsoft Entra.
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.
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:
En Azure Portal, seleccione Microsoft Entra ID>Registro de aplicaciones>Nuevo registro.
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.
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.
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.
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
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 adb_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 obtener más información, consulte Configuración de un administrador de Microsoft Entra.
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 deTenantId
recopilado anteriormente. - Reemplace
<ClientId>
por el valor deClientId
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 esmyserver.database.windows.net
, sustituya<ServerName>
pormyserver
. - 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.- Reemplace
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
- Entidad de servicio de Microsoft Entra con la SQL de Azure
- ¿Qué son las identidades administradas de recursos de Azure?
- Cómo usar identidades administradas para App Service y Azure Functions
- Autenticación de entidades de servicio de Microsoft Entra en SQL DB: ejemplo de código
- Objetos de aplicación y de entidad de servicio en Microsoft Entra ID
- Creación de una entidad de servicio de Azure con Azure PowerShell
- Rol Lectores de directorio en Microsoft Entra ID para Azure SQL