Para gestionar y configurar nuestras VM en Azure podemos conectar fácilmente por RDP, pero si queremos trabajar a un nivel diferente, vamos a ver en este cybertruco como lo podemos hacer también con Powershell para de esta manera poder gestionar nuestras máquinas virtuales de manera automatizada y mucho más agil.

azure vm

 

Preparando el entorno local

Necesitaremos disponer de la versión 5.1 de Powershell, con el módulo de Azure RM Powershell 6.11, como siempre primero abrimos Powershell como administrador y seguimos los siguientes pasos

1-En caso que no lo tengamos ya, instalaremos el módulo de Azure Resource Manager en nuestro Powershell con el cmdlet

Install-Module AzureRM

2-Iniciamos el servicio WinRM con el cmdlet

Start-Service WinRM

3-Añadiremos ahora la IP pública de la máquina virtual a la lista local de trusted hosts

Set-Item WSMan:\localhost\Client\TrustedHosts -Value 1.1.1.1

Configurando el NSG relativo a la VM en Azure

Ahora comenzamos a actuar ya contra nuestros recursos en Azure, en concreto contra el NSG (Network security group) asociado a ella, para abrir los puertos HTTP y HTTPS para nuestro WinRM y de esta manera trabajar a través de Powershell y llegar a nuestra VM.

1-Primero conectamos contra nuestra cuenta de Azure con

Connect-AzureRMAccount

2-Una vez en nuestro tenant, podemos ver un par de listados interesantes para obtener los datos necesarios para los siguientes comandos. Por una parte un listado de los grupos de recursos que disponemos

Get-azurermresourcegroup | ft

Seguidamente y habiendo identificado el grupo de recursos sobre el que trabajaremos, podemos sacar un listado de los recursos que contiene, entre ellos se encontraría nuestra máquina virtual y nuestro Network Security Group

Get-azurermresource -resourcegroupname cyberseguridad | ft

3-Una vez tenemos esos datos prepararemos y lanzaremos dos comandos muy similares, cada uno de ellos compuesto por tres cmdlets. Vamos a ver sus tres partes por separados

Primero debemos identificar y obtener el NSG sobre el que queremos aplicar la regla para ellos utilizaremos el cmdlet Get-AzureRmNetworkSecurityGroup con los parámetros -name para indicar el nombre de la NSG y -Resourcegroupname para indicar el grupo de recursos donde se encuentra el NSG.

Get-AzureRmNetworkSecurityGroup -Name Nsg -ResourceGroupName cyberseguridad

La segunda parte del comando es la regla en si que queremos añadir, para ello y con la entrada por pipeline de la primera parte utilizaremos el cmdlet  Add-AzureRmNetworkSecurityRuleConfig con una buena cantidad de parámetros para definir la regla en si.

Add-AzureRmNetworkSecurityRuleConfig -Name AllowingWinRMHTTPS -Description "To Enable PowerShell Remote Access" -Access Allow -Protocol Tcp -Direction Inbound -Priority 104 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * DestinationPortRange 5986

Los parámetros en orden son:

  • Name donde le indicamos el nombre de la regla
  • Description para añadir una descripción
  • Access que puede ser allow o deny
  • Protocol para especificar el protocolo, en este caso TCP
  • Direction para indicar si es de entrada (inbound) o salida (outbound) a nuestra VM
  • Priority para asignar la prioridad que deba tener la regla esto debe ser un valor único en el grupo entre 100 y 4096
  • SourceAddressPrefix para indicar el origen que tendrá la conexión afectada por la regla en este caso Internet
  • SourcePortRange para indicar el puerto a través el cual se conectará si lo conocemos en otro caso ponemos *
  • DestionationAddressPrefix para indicar la ip de destino de la máquina a la que afectará la regla, podemos indicar *, una IP o palabras genéricas como VirtualNetwork, Internet o AzureLoadBalancer
  • DestinationPortRange especificamos a que puerto afectará la regla en la VM.

Por último la tercera parte del comando que recibirá de nuevo la entrada por tubería del anterior será utilizando el cmdlet Set-AzureRmNetworkSecurityGroup tal cual para aplicar la regla.

Los dos comandos quedarían de la siguiente manera.

Get-AzureRmNetworkSecurityGroup -Name NSG -ResourceGroupName cyberseguridad | Add-AzureRmNetworkSecurityRuleConfig -Name PermitirWinRMHTTPS -Description "Permitir WinRM a través de HTTPS" -Access Allow -Protocol Tcp -Direction Inbound -Priority 104 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * DestinationPortRange 5986 | Set-AzureRmNetworkSecurityGroup

Get-AzureRmNetworkSecurityGroup -Name NSG -ResourceGroupName cyberseguridad | Add-AzureRmNetworkSecurityRuleConfig -Name PermitirWinRMHTTP -Description "Permitir WinRM a través de HTTP" -Access Allow -Protocol Tcp -Direction Inbound -Priority 105 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * DestinationPortRange 5985 | Set-AzureRmNetworkSecurityGroup

Configurando el firewall en nuestra VM

Una vez ejecutado este señor comando vamos a preparar nuestra máquina virtual para aceptar la conexión remota a nivel local. Este paso es básicamente el mismo que usariamos en cualquier máquina física para permitir el acceso a través de WinRM. Para ellos vamos a crear un fichero .ps1 que ejecutaremos en remoto en nuestra máquina virtual. El contenido del mismo será el siguiente

winrm qc /force netsh advfirewall firewall add rule name= WinRMHTTP dir=in action=allow protocol=TCP localport=5985 netsh advfirewall firewall add rule name= WinRMHTTPS dir=in action=allow protocol=TCP localport=5986

Simplemente estamos añadiendo un par de reglas al firewall local de nuestra máquina virtual para permitir el WinRM

Ejecutamos el script creado en nuestra máquina virtual utilizando el cmdlet Invoke-AzureRMVMRunCommand, indicando el grupo de recursos y el nombre de la máquina virtual.

Invoke-AzureRmVMRunCommand -ResourceGroupName cyberseguridad -Name demo -CommandId 'RunPowerShellScript' -ScriptPath C:\scripts\ejemplo.ps1

Conectando con Powershell a nuestra VM

Ahora que ya hemos configurado tanto nuestro Powershell como las reglas dentro del Network Security Group y el Firewall en nuestra máquina virtual, ya solo nos queda conectar con el cmdlet Enter-PSSession tal y como haríamos en nuestra red local indicando la IP pública de nuestra VM.

Enter-PSSession -ComputerName 1.1.1.1

Espero que os sea de gran utilidad este cybertruco, nos vemos en el próximo

Fuente Microsoft