Añadir usuario de Azure AD como administrador en una VM de Azure

Leyendo el título de esta entrada algunos dirán que porque me complico tanto la vida y no agrego a los usuarios como administradores de las VM mediante GPO si estas van a estar en dominio.

Pues bien, pongámonos en el caso que necesitamos agregar al responsable del despliegue de la VM como administrador (o a cualquier otro usuario) de manera automatizada y esta persona no debe tener permisos como admin local en ninguna otra VM que no sea esta.

La solución con la que di pese a que pueda parecer rebuscada, es la más sencilla de todas. Inyectar una extensión que incluya un custom script.

A continuación os muestro el proceso:

En primer lugar debemos generar y guardar un script que añadirá a un usuario como administrador local y que queremos añadir como extensión, en una Storage Account de Azure (En mi caso he creado un contenedor llamado Scripts dentro de la Storage Account y lo he guardado con el nombre de add_localAdmin.ps1). Si buscamos por Internet encontraremos cientos de ellos, como por ejemplo:

param(
[parameter(Mandatory=$true)]
 [String] $UPN
) 

$User = $UPN.split('@')[0]
$domain = $UPN.split('@')[-1]
$group = [ADSI]"WinNT://$ENV:COMPUTERNAME/Administrators,group"
$group.Add("WinNT://XxxDOMINIOxxX/$User,user") 

En este script se pasa por parámetro el User Principal Name ($UPN) de un usuario y este es añadido al grupo de Administradores locales del equipo (Este parámetro será proporcionado por el runbook que lo añadirá como extensión en la VM).

Seguidamente se debe crear el runbook  siguiente:

param(
 [parameter(Mandatory=$true)]
 [String] $Usermail,
 [parameter(Mandatory=$true)]
 [String] $vmname,
 [parameter(Mandatory=$true)]
 [String] $RGNAME
)
$connectionName = "AzureRunAsConnection"
try
{
 # Get the connection "AzureRunAsConnection "
 $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
 Add-AzureRmAccount `
 -ServicePrincipal `
 -TenantId $servicePrincipalConnection.TenantId `
 -ApplicationId $servicePrincipalConnection.ApplicationId `
 -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
 if (!$servicePrincipalConnection)
 {
 $ErrorMessage = "Connection $connectionName not found."
 throw $ErrorMessage
 } else{
 Write-Error -Message $_.Exception
 throw $_.Exception
 }
}
$StorageAccountName = "XxxNombreStorageAccountxxX"
$filename = "add_localAdmin.ps1"
$StorageAccountKey = Get-AzureRMStorageaccountKey -StorageAccountName $StorageAccountName -ResourceGroupName "XxxRGDeLaStorageAccountxxX"
Get-AzureRmVM -Name $vmname -ResourceGroupName $RGNAME | Set-AzureRmVMCustomScriptExtension -Name CustomScript -VMName $vmname -ResourceGroupName $RGNAME -StorageAccountName $StorageAccountName -StorageAccountKey $storageAccountKey.Key1 -ContainerName "scripts" -FileName $fileName -Run $fileName -Argument $usermail 

Donde podemos observar que se proporciona por parámetro el nombre de la VM sobre la que queremos añadir el usuario local ($vmname), el Resource group al que pertenece ($RGNAME) y el UPN del usuario en cuestión ($Usermail).

Seguidamente haciendo uso del CMDLET Get-AzureRMVM y combinándolo con  Set-AzureRmVMCustomScriptExtension introducimos como extensión el script que hemos alojado en nuestra Storage Account (add_localAdmin.ps1) y con el parámetro -Argument enviamos el usuario que queremos añadir como administrador.

Una vez ejecutado el runbook, ya tenemos un usuario de nuestro AzureAD agregado como Administrador local de una VM de Azure.

Decir que como mejora a este script le podríamos añadir una validación previa donde se comprueba si el usuario introducido existe o no en el Azure AD, pero esta comprobación debería ser lanzada con un usuario del dominio y no con una RunAsAccount.

$user = get-azurermaduser -Mail $usermail
if ($user -eq $null){
 write-output "-----> El usuario introducido NO existe en el AD"
 exit
} else{
 write-output "-----> El usuario $usermail introducido existe en el AD"
}

 

Autor: Jordi Suñé

Gran aficionado a los juegos de mesa, las motos y consultor cloud (o almenos eso pone en mi firma de correo). Después de más de dos años en @Tokiota me dedico a presentar y diseñar soluciones tecnológicas Microsoft tanto cloud como onpremise , implantarlas y en alguna que otra ocasión dar workshops y charlas. Intento mantenerme al día de todas las novedades en nuestro sector, aunque eso me quite horas de sueño, pero todo el mundo sabe que para eso se inventó el café ^^

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s