921
El uso de credenciales de seguridad codificadas en scripts de automatización es una mala práctica, aunque algunos administradores de TI todavía lo hacen. Si es uno de los pocos que lo hace con Azure, tal vez sea hora de que cambie a las entidades principales de servicio de Azure.
Pero, ¿qué es una entidad de servicio de Azure de todos modos? En esencia, es una forma de identidad de seguridad a la que se le puede asignar acceso detallado y permiso a los recursos en diferentes niveles de alcance. Cuando crea una entidad de servicio, puede asignar una función integrada, como Propietario, Colaborador o Lector.
Una entidad de servicio de Azure es similar a una cuenta de usuario porque tiene un identificador de aplicación (nombre de usuario) y un secreto (contraseña). El secreto también puede tener una fecha de caducidad, como una contraseña que caduca. Una entidad de servicio puede usar un certificado en lugar de un secreto, que es más seguro.
Requisitos
- Un equipo con el módulo de Azure PowerShell instalado.
- Un arrendatario de Azure activo.
Crear una nueva entidad de servicio de Azure
El cmdlet para crear una nueva entidad de servicio de Azure es New-AzAdServicePrincipal. Al crear la entidad de servicio, debe decidir su tipo de autenticación. Hay dos tipos: basado en contraseña y basado en certificados. La entidad de servicio puede tener tipos de autenticación basados en contraseña y certificados.
Antes que nada, este tutorial asume que ya se conectó a Az PowerShell. Si no lo has hecho, hazlo ahora.
Connect-AzAccount -Tenant <tenant id>
con contraseña
La autenticación basada en contraseña utiliza el ID de la aplicación y el texto secreto, similar a un nombre de usuario y una contraseña. Esto significa que debes tratar el secreto, bueno, un secreto. Este tipo de autenticación es conveniente y familiar, pero menos seguro.
Ejecute el siguiente comando para crear una nueva entidad de servicio con una contraseña generada automáticamente.
$azsp = New-AzADServicePrincipal -DisplayName 'Blue Turtle'
Este comando crea una nueva entidad de servicio de Azure denominada «Blue Turtle». El objeto resultante se almacenará en la variable $azsp.
Después de crear la entidad de servicio, puede obtener los valores AppID y SecretText.
$azsp | Format-List AppDisplayName, AppId
$azsp.PasswordCredentials | Format-List SecretText, EndDateTime
Como puede ver, el vencimiento del texto secreto es de un año desde el momento en que creó la entidad de servicio.
Con Certificado
La autenticación basada en certificados también utiliza el ID de la aplicación. Pero en lugar de una contraseña, utiliza un certificado digital para probar su identidad durante la autenticación. El certificado puede estar dentro del almacén de certificados o como un archivo PFX en el disco.
Primero, cree un certificado autofirmado. El certificado se creará en el certificado personal Cert:CurrentUserMy store con el asunto CN=Blue Turtle y tendrá una vigencia de cinco (5) años.
# What's the display name of the service principal?
# This name will be the subject of the certificate.
$spDisplayName="Blue Turtle"
# How many years will the certificate be valid?
$yearsValid = 5$cert = New-SelfSignedCertificate -CertStoreLocation "cert:CurrentUserMy" `
-Subject "CN=$($spDisplayName)" `
-KeySpec KeyExchange `
-NotBefore ((Get-Date).AddDays(-1)) `
-NotAfter ((Get-Date).AddYears($yearsValid))
$cert
Puede ver el nuevo certificado cuando abre la consola de administración de certificados (certmgr.msc).
A continuación, convierta el certificado en una cadena codificada en base64:
$certData = [System.Convert]::ToBase64String($cert.RawData)
$certData
Los datos resultantes se almacenan en la variable $certData.
Por último, creemos la entidad de servicio de Azure y adjuntemos el certificado:
$azsp = New-AzADServicePrincipal -DisplayName $spDisplayName `
-CertValue $certData `
-EndDate $cert.NotAfter `
-StartDate $cert.NotBefore
$azsp
Una vez que se crea la entidad de servicio, ejecute los siguientes comandos para obtener la identificación de la aplicación y los detalles del certificado.
# Get the display name and application id
$azsp | Format-List AppDisplayName, AppId# Get the certificate expiration and thumbprint
Get-AzADAppCredential -ApplicationId $azsp.AppId | Select-Object `
DisplayName, EndDateTime, @{
n = 'ThumbPrint'; e = { $([System.Convert]::ToBase64String($_.CustomKeyIdentifier)) }
}
Como era de esperar, el certificado adjunto al principal del servicio tiene una validez de cinco años desde su creación.
Asignar un rol y un alcance
Antes de que se pueda usar una entidad de servicio de Azure para administrar los recursos de Azure, se le debe asignar una función y un ámbito.
Hay varios roles integrados de Azure en cada categoría de servicio de Azure (Informática, DevOps, Análisis, etc.). A continuación se muestran los roles más comunes en la categoría General.
- Dueño — Tiene acceso completo para administrar recursos y puede asignar roles a otros.
- Contribuyente — Tiene acceso completo para administrar recursos, pero no puede asignar roles a otros.
- Lector — Puede ver los recursos pero no puede realizar ningún cambio.
- Administrador de acceso de usuario — Puede administrar el acceso de los usuarios a los recursos de Azure.
Referirse a Roles integrados de Azure AD para obtener información sobre todos los roles de Azure disponibles.
En cuanto al ámbito, hay cuatro niveles a los que se aplica la función principal de servicio. Desde los más específicos hasta los más amplios, los alcances se pueden aplicar a lo siguiente:
- Recurso
- Grupo de recursos
- Suscripción
- Grupo de gestión
La mejor práctica es aplicar privilegios suficientes al ámbito más específico siempre que sea posible. Pero cómo diseña su jerarquía de acceso en su arrendatario de Azure es otro tema.
¿Cómo asignamos el rol de Azure a la entidad de servicio y definimos su alcance?
¿Qué entidad principal de servicio de Azure necesita acceso?
Primero, obtenga los detalles de la entidad de servicio que necesita acceso. En este ejemplo, usaremos el tortuga azul entidad de servicio que creamos anteriormente.
$sp = Get-AzADServicePrincipal -SearchString 'Blue Turtle'
¿Cuál es el alcance del acceso?
El siguiente paso es determinar el alcance del acceso. Supongamos que un ámbito de destino es una máquina virtual denominada GRDC01 en el grupo de recursos GADGETREVO. Busquemos el ID de este recurso.
$vm = Get-AzResource -Name 'GRDC01' -ResourceGroupName 'GADGETREVO'
$vm.ResourceID
Como puede ver a continuación, el ID de recurso de la máquina virtual ahora se almacena en la variable $vm.ResourceID.
Asigne el rol de Azure
La última parte es asignar el rol de Azure. En este ejemplo, hagamos que la entidad de servicio de Azure sea un «propietario» de la máquina virtual.
New-AzRoleAssignment -ApplicationId $sp.AppId`
-Scope $vm.ResourceID `
-RoleDefinitionName 'Owner'
Si la operación fue exitosa, obtendría un resultado similar a la siguiente captura de pantalla.
Conéctese a Azure PowerShell mediante la entidad de servicio
Se ha creado la entidad de servicio de Azure y se le ha asignado un rol y un ámbito. Lo que queda es usarlo para conectarse a Azure PowerShell para probar.
Como recordará, la entidad de servicio de Azure puede tener un texto y un certificado secretos; ambos se pueden utilizar para autenticar.
Autenticación basada en contraseña
Para autenticarse usando el texto secreto, ejecute el siguiente comando. Solo necesita modificar los valores de las variables $appId, $secret y $tenantId.
# Enter the service principal details
$appId = 'service principal id'
$secret="secret text"
$tenantId = 'Azure tenant id'# Create the credential object
$spCredential = [pscredential]::new(
$appId,
(ConvertTo-SecureString $secret -AsPlainText -Force)
)# Connect to Azure PowerShell
Connect-AzAccount `
-ServicePrincipal `
-Credential $spCredential `
-Tenant $tenantId
Nota. El valor secreto está en formato de texto sin formato y es fácil de leer. Cuando utilice este tipo de autenticación en producción, utilice un método de cifrado o una bóveda secreta para no exponer el secreto.
Autenticación basada en certificados
A continuación se muestra el código para autenticarse mediante el certificado. Solo necesita modificar los valores de las variables $appId, $thumbprint y $tenantId.
# Enter the service principal details
$appId = 'service principal id'
$thumbprint="certificate thumbprint"
$tenantId = 'Azure tenant id'# Connect to Azure PowerShell
Connect-AzAccount `
-ServicePrincipal `
-ApplicationId $appId `
-CertificateThumbprint $thumbprint `
-Tenant $tenantId
Verificar el permiso de la entidad de servicio para el recurso
Después de iniciar sesión con la entidad de servicio de Azure, confirmemos si el permiso del rol funciona.
Primero, confirmemos que la cuenta solo puede enumerar los recursos a los que tiene acceso.
Get-AzResource | Select-Object `
Name, ResourceGroupName, ResourceType
¿Recuerda que el principal de servicio ‘Blue Turtle’ solo tiene acceso a la máquina virtual GRDC01? Como era de esperar, el comando solo devolvió la máquina virtual GRDC01.
Como «propietario» de la máquina virtual, esta entidad de servicio puede iniciar y detener la máquina virtual. Pongámoslo a prueba.
Start-AzVM -Name GRDC01 -ResourceGroupName GADGETREVO
De acuerdo con el siguiente resultado, la operación de inicio es exitosa.
Para confirmar aún más, obtengamos el estado de la máquina virtual.
Get-AzVM -Name GRDC01 -ResourceGroupName GADGETREVO -Status
Conclusión
Deje de usar credenciales de seguridad codificadas en sus scripts de automatización. No es agradable. Especialmente ahora, puede crear una entidad de servicio de Azure con solo los permisos específicos necesarios para administrar y acceder a sus recursos de Azure.
La autenticación basada en contraseña es menos segura que la autenticación basada en certificados. Pero la autenticación basada en contraseña sigue siendo mejor que usar el nombre de usuario y la contraseña de una cuenta de servicio sin MFA.