Despliegue Azure Bastion mediante una Logic App para su automatización.

Hola, soy Alvaro Cañas, nuevo colaborador del blog AzureBrains, con muchas ganas de aportar a esta comunidad en particular y a la de Azure en general. Espero que este sea el primer post de muchos y con el objetivo que ayude a gente que empieza en el mundillo de Azure y le puedan ser utiles este tipo de tutoriales.

Cuando queremos conectar a nuestras máquinas virtuales en un entorno Azure podemos hacerlo de muchas maneras, pero quizá una de las más seguras es con el uso de Azure Bastion.

Bastion es un servicio PaaS que nos permite conectar a nuestras maquinas virtuales mediante SSH y RDP desde nuestro portal de Azure. Bastion se aprovisiona en una red virtual y nos dará acceso a cualquier maquina virtual que forme parte de ella. En este tutorial voy a mostrar como desplegar un Bastion usando el portal con una Logic App con un trigger de HTTP para automatizar su creación y eliminación, y con ello ahorrar costes.

  1. Preparando estructura

Red virtual

Necesitaremos una red virtual con una subnet llamada AzureBastionSubnet a la que Bastion se conectara en su despliegue

Crear subnet: az network vnet create --resource-group $nombreRG --name $nombreVnet --address-prefix 10.0.0.0/16 --subnet-name $nombresubnet --subnet-prefix 10.0.0.0/24
Crear bastion subnet: az network vnet subnet create --resource-group $nombreRG --vnet-name $nombreVnet --name AzureBastionSubnet --address-prefixes 10.0.2.0/24

Ip publica para Bastion

El siguiente paso será crear un recurso nuevo que sea una ip publica de tipo Standard ya que Basic no es soportada para Bastion.

Crear ip publica: az network public-ip create --resource-group $nombreRG --name $nombreIPpublica --dns-name bastioninternal --allocation-method Static --sku Standard

2. Configuración de automatización

Como ultimo recurso, crearemos una Logic App que usaremos para automatizar.

Permisos para Logic app

Dentro de la Logic app recién creada, iremos al apartado Identity.

Despues activaremos la casilla de Status y guardamos.

Pincharemos en Azure Role Assignments y Add role Assignments. Desde aquí le daremos los permisos necesarios que necesita para crear y editar recursos.

Elegimos nuestra suscripción y el rol de Contributor.

Diseñando el esquema.

Nos iremos a Logic App Designer. Elegiremos una plantilla en blanco.

Buscaremos por el connector “Request” y elegimos “When a HTTP request is received”.

En el cuadro donde pone “Request Body JSON Schema”, pegaremos lo siguiente:

Esto servirá para para definir el input que necesita recibir tanto para crear como para eliminar el recurso.

Si en la petición pone Action:Deploy, esta actuara dependiendo de la acción que hayamos configurado.

Le daremos a “Next step” y elegiremos Control-Switch-Action. Esto nos permitirá que podamos elegir que queremos hacer cuando hagamos la petición.

Le damos un nombre, por ejemplo deploy, y le agregamos una acción. Buscamos Azure Resource Manager y Create or Update a template deployment.

Nos pedira que los loguemos.

Despues rellenamos con los datos en nuestro caso.

Añadimos dos nuevos parámetros que serán Parameters y Template Content.

En el parametro Parameters, rellenaremos lo siguiente con nuestros datos.

{
  "bastionHosts_name": {
    "value": "$nombreRG"
  },
  "publicIPAddresses_externalid": {
    "value": "/subscriptions/$SubID/resourceGroups/$nombreRG providers/Microsoft.Network/publicIPAddresses/$nombreIPP"
  },
  "virtualNetworks__externalid": {
    "value": "/subscriptions/$SubID/resourceGroups/$nombreRG /providers/Microsoft.Network/virtualNetworks/$nombreVN"
  },
  "bastion_location": {
        "value": "eastus2"
  }
} 

En el parámetro Template Content, pegaremos lo siguiente:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "bastionHosts_name": {
      "type": "String"
    },
    "publicIPAddresses_externalid": {
      "type": "String"
    },
    "virtualNetworks__externalid": {
      "type": "String"
    },
    "bastion_location":{
      "type":"String"
    }
  },
  "resources": [
    {
      "apiVersion": "2020-05-01",
      "location": "[parameters('bastion_location')]",
      "name": "[parameters('bastionHosts_name')]",
      "properties": {
        "ipConfigurations": [
          {
            "name": "IpConf",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[parameters('publicIPAddresses_externalid')]"
              },
              "subnet": {
                "id": "[concat(parameters('virtualNetworks__externalid'), '/subnets/AzureBastionSubnet')]"
              }
            }
          }
        ]
      },
      "type": "Microsoft.Network/bastionHosts"
    }
  ],
  "variables": {}
}

Veremos algo así:

Pinchamos en + para agregar una nueva fase.

En el nuevo paso, lo nombramos como Delete y buscamos http. Pinchamos en HTTP.

Elegimos en Method, DELETE. La url será la direccion de donde estará el Bastion Hosst, una vez que se haya creado. Usaremos la siguiente direccion con nuestros datos.

https://management.azure.com/subscriptions/$Sub_ID/resourceGroups/$nombreRG/providers/Microsoft.Network/bastionHosts/$nombreBastion}/?api-version=2020-06-01

Añadimos un nuevo parámetro llamado  “Authentication”. Lo configuramos de esta manera.

Comprobacion.

Guardamos y usaremos el siguiente script de Powershell para triggear la Logic App.

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/json")
$body = "{`"Action`":`"Deploy`"}"
$RequestURL = "Your URL Here"
$response = Invoke-RestMethod $RequestURL -Method 'POST' -Headers $headers -Body $body

$ResquestURL será la url de nuestro trigger http, es decir:

Donde pone Deploy en $body, podríamos cambiarlo por Delete para elegir la segunda fase y eliminar el Bastion.

Si al usar el script no se despliega, podemos ir a Run History de la Logic App o Activity Log del grupo de recursos donde lo desplegamos para ver posibles errores.

Espero que os haya sido útil este tutorial. El próximo sera sobre una herramienta que le he visto mucho potencial ,Azure Resource Mover, que sirve para mover cómodamente recursos entre regiones sin preocuparte de las dependencias que tengan dichos recursos.

Un saludo