Inicio de sesión en Azure PowerShell de forma no interactiva para escenarios de automatización

Una entidad de servicio en Azure es una cuenta no interactiva que proporciona una identidad que usan las aplicaciones, los servicios y las herramientas de automatización para acceder a recursos específicos de Azure. La autenticación con una entidad de servicio es la mejor manera de escribir scripts seguros porque actúan como una identidad de seguridad con permisos asignados que rigen qué acciones se pueden realizar y a qué recursos se puede acceder. Las entidades de servicio ayudan a automatizar de forma segura las tareas de administración sin usar cuentas de usuario personales, lo que facilita un acceso más seguro y fácil de administrar a los recursos de Azure. Al igual que otras cuentas de usuario, sus permisos se administran con Microsoft Entra. Al conceder solo los permisos que una entidad de servicio necesita, los scripts de automatización están seguros.

Requisitos previos

Inicio de sesión con una identidad administrada

Las identidades administradas son un tipo especial de entidad de servicio que proporcionan los servicios de Azure con una identidad administrada automáticamente. El uso de este tipo de identidad no requiere almacenar credenciales en la configuración ni el código para autenticarse en cualquier servicio de Azure que admita identidades administradas.

Hay dos tipos de identidades administradas:

  • Identidad administrada asignada por el sistema
  • Identidad administrada asignada por el usuario

Las identidades administradas proporcionan una manera segura de comunicarse con otros servicios de Azure sin que los desarrolladores tengan que administrar credenciales. También ayudan a mitigar el riesgo de perder credenciales.

Aquí se muestra cómo funcionan las identidades administradas en escenarios reales:

  • Azure administra automáticamente la creación y eliminación de las credenciales usadas por la identidad administrada.
  • Un servicio de Azure habilitado con una identidad administrada puede acceder de forma segura a otros servicios, como Azure Key Vault, Azure SQL Database, Azure Blob Storage, etc., mediante tokens de Microsoft Entra.
  • Esta identidad se administra directamente dentro de Azure sin necesidad de aprovisionamiento adicional.

Las identidades administradas simplifican el modelo de seguridad evitando la necesidad de almacenar y administrar credenciales, y desempeñan un papel fundamental en las operaciones seguras en la nube al reducir el riesgo asociado con el control de secretos.

Identidad administrada asignada por el sistema

Azure crea automáticamente una identidad administrada asignada por el sistema para una instancia de servicio de Azure (como una máquina virtual de Azure, App Service o Azure Functions). Si se elimina la instancia del servicio, Azure elimina automáticamente las credenciales y la identidad asociada con el servicio.

Este ejemplo se conecta mediante una identidad administrada asignada por el sistema del entorno de host. Si se ejecuta en una máquina virtual que tiene asignada una identidad de administrada, esto permite que el código inicie sesión con esa identidad asignada.

 Connect-AzAccount -Identity

Identidad administrada asignada por el usuario

Una identidad administrada asignada por el usuario es una identidad que se crea y administra en Microsoft Entra. Se puede asignar a una o varias instancias de un servicio de Azure. El ciclo de vida de una identidad administrada asignada por el usuario se administra de manera independiente a las instancias de servicio de Azure a las que se asigna.

Al usar una identidad administrada asignada por el usuario, debe especificar el parámetro AccountId además del parámetro Identidad, tal como se muestra en el ejemplo siguiente.

 Connect-AzAccount -Identity -AccountId <user-assigned-identity-clientId-or-resourceId>

Los siguientes comandos se conectan mediante la identidad administrada de myUserAssignedIdentity. Agrega la identidad asignada por el usuario a la máquina virtual y, después, se conecta mediante el ClientId de la identidad asignada por el usuario.

$identity = Get-AzUserAssignedIdentity -ResourceGroupName myResourceGroup -Name myUserAssignedIdentity
Get-AzVM -ResourceGroupName contoso -Name testvm | Update-AzVM -IdentityType UserAssigned -IdentityId $identity.Id
Connect-AzAccount -Identity -AccountId $identity.ClientId # Run on the virtual machine
Account                              SubscriptionName TenantId                             Environment
-------                              ---------------- --------                             -----------
00000000-0000-0000-0000-000000000000 My Subscription  00000000-0000-0000-0000-000000000000 AzureCloud

Para más información, consulte Configuración de identidades administradas para recursos de Azure en una máquina virtual de Azure.

Inicio de sesión con una entidad de servicio

Para iniciar sesión con una entidad de servicio, utilice el parámetro ServicePrincipal del cmdlet de Connect-AzAccount. También necesitará la siguiente información para la entidad de servicio:

  • AppId
  • Credenciales de inicio de sesión o acceso al certificado que se usa para crear la entidad de servicio
  • Id. de inquilino

La manera de iniciar sesión con una entidad de servicio depende de si la ha configurado a para la autenticación basada en certificado o en contraseña.

Autenticación basada en certificados

Para ver cómo crear una entidad de servicio para usarla con Azure PowerShell, consulte Creación de una entidad de servicio de Azure con Azure PowerShell.

La autenticación basada en certificados requiere que Azure PowerShell pueda recuperar información de un almacén de certificados local en función de una huella digital del certificado.

Connect-AzAccount -ApplicationId $appId -Tenant $tenantId -CertificateThumbprint <thumbprint>

Si usa una entidad de servicio en lugar de una aplicación registrada, especifique el parámetro ServicePrincipal y proporcione el identificador de aplicación de la entidad de servicio como el valor del parámetro ApplicationId.

Connect-AzAccount -ServicePrincipal -ApplicationId $servicePrincipalId -Tenant $tenantId -CertificateThumbprint <thumbprint>

En Windows PowerShell 5.1, el almacén de certificados puede administrarse e inspeccionarse con el módulo PKI. En PowerShell 7.x y versiones posteriores, el proceso es diferente. Los siguientes scripts muestran cómo importar un certificado existente en el almacén de certificados al que PowerShell tiene acceso.

Importación de un certificado en PowerShell 7.x y versiones posteriores

# Import a PFX
$storeName = [System.Security.Cryptography.X509Certificates.StoreName]::My
$storeLocation = [System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser
$store = [System.Security.Cryptography.X509Certificates.X509Store]::new($storeName, $storeLocation)
$certPath = <path to certificate>
$credentials = Get-Credential -Message "Provide PFX private key password"
$flag = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable
$certificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($certPath, $credentials.Password, $flag)
$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$store.Add($Certificate)
$store.Close()

Importación de un certificado en Windows PowerShell 5.1

# Import a PFX
$credentials = Get-Credential -Message 'Provide PFX private key password'
Import-PfxCertificate -FilePath <path to certificate> -Password $credentials.Password -CertStoreLocation cert:\CurrentUser\My

Autenticación basada en contraseña

Cree una entidad de servicio para usarla en los ejemplos de esta sección. Para más información sobre las entidades de servicio, consulte Creación de una entidad de servicio de Azure PowerShell.

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName

Precaución

El secreto proporcionado de la entidad de servicio se almacena en el archivo AzureRmContext.json del perfil de usuario ($env:USERPROFILE\.Azure). Asegúrese de que este directorio tiene las protecciones adecuadas.

Para obtener las credenciales de la entidad de servicio en forma del objeto adecuado, utilice el cmdlet de Get-Credential. Este cmdlet solicita un nombre de usuario y una contraseña. Use el valor de AppId de la entidad de servicio como nombre de usuario y convierta el valor de secret en texto sin formato para la contraseña.

# Retrieve the plain text password for use with Get-Credential in the next command.
$sp.PasswordCredentials.SecretText

$pscredential = Get-Credential -UserName $sp.AppId
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId

En escenarios de automatización, deberá crear las credenciales a partir de los valores de AppId y SecretText de la entidad de servicio:

$SecureStringPwd = $sp.PasswordCredentials.SecretText | ConvertTo-SecureString -AsPlainText -Force
$pscredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $sp.AppId, $SecureStringPwd
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId

Use procedimientos recomendados de almacenamiento de contraseñas para automatizar las conexiones de la entidad de servicio.

Consulte también