Cargando...

Bicep: Implementar un Bastion Host en Azure

Al diseñar una arquitectura en la nube es fundamental la seguridad. Las máquinas virtuales que no están sirviendo aplicaciones al público se pueden aprovisionar en subredes privadas. De hecho, en la mayoría de los casos es evitable exponer recursos a Internet, por ejemplo, para una arquitectura que alojará una aplicación web se pueden desplegar los servidores web en subredes privadas y delante colocar un balanceador de carga que tendrá la IP pública, por otro lado, un grupo de seguridad debe permitir el tráfico únicamente desde el balanceador de carga. También, hay otros aspectos a considerar como la salida a Internet para instalar o actualizar software, que puede ser por medio de un NAT. Bien, pero… ¿cómo conectarse a las máquinas virtuales en Azure? Evidentemente, necesitarás ingresar a las máquinas para hacer configuraciones, instalar actualizaciones, etc. Una opción común es implementar una máquina virtual (Bastion Host) con IP pública y desde esa máquina conectarse a las demás. Bueno, te cuento que no es necesario recurrir a esa alternativa, Azure ofrece un servicio totalmente administrado que cumple con todas las funciones mencionadas y más.

Qué es Azure Bastion

Azure Bastion es un servicio que permite conectarse y administrar máquinas virtuales de forma segura desde el portal de Azure a través de TLS. Es plataforma como servicio (PaaS), es decir, un servicio administrado por Azure, de nuestro lado solo tenemos que aprovisionar el recurso en una red virtual y usarlo. Con Azure Bastion puedes establecer conexiones por SSH o RDP a las máquinas virtuales, por lo que funciona con Windows y GNU/Linux, sin ningún problema. Al usar Azure Bastion, no necesitamos direcciones IP públicas para las máquinas virtuales y evitamos exponer puertos a Internet. Además, ya provee la salida a Internet para instalar software o hacer actualizaciones en los servidores. El funcionamiento es sencillo, ingresas al portal de Azure y desde el portal vas a las máquinas, seleccionas conectar usando Bastion, y se abrirá la sesión. Es un cliente web basado en HTML 5.

Implementar Azure Bastion con una plantilla ARM

Como sabes, en Crashell la automatización es nuestra prioridad, por lo tanto, definir infraestructura como código es fundamental. A continuación, te comparto una plantilla ARM escrita en Bicep para implementar Azure Bastion de forma automatizada.

La plantilla creará los siguientes recursos en Azure:

  • Dirección IP pública
  • Red virtual
  • Tres subredes
  • Azure Bastion

La razón de crear 3 subredes es para desplegar las máquinas virtuales en las 2 subredes adicionales. También, el objetivo es que puedas usar nuestra plantilla, Crear máquinas virtuales en un conjunto de disponibilidad. Igual, las puedes unificar si lo consideras apropiado. Para la subred de Azure Bastion hay un requisito, debe tener el nombre AzureBastionSubnet y el prefijo de red /27.

Ahora sí, nos dejamos palabras y vamos al código. Debes crear un archivo con la extensión .bicep, para este ejemplo lo he nombrado como bastion.bicep

Importante mencionar que Azure Bastion admite dos tipos de SKU: Basic y Standard. Para este escenario he elegido Basic que cuenta con las funcionalidades base, sin embargo, Standard cuenta con otras características interesantes.

@description('Nombre de la aplicación o proyecto - Prefijo para el nombre de los recursos')
param projectName string = 'crashell'

@description('Región para crear los recursos')
param location string = resourceGroup().location

var nameBastion           = '${projectName}-bastion'
var vnetName              = '${projectName}-vnet'
var vnetAddress           = '10.0.0.0/16'
var subnet1Name           = 'subnet1'
var subnet2Name           = 'subnet2'
var subnet1Address        = '10.0.1.0/24'
var subnet2Adress         = '10.0.2.0/24'
var subnetBastion         = 'AzureBastionSubnet'
var subnetBastionAddress  = '10.0.3.0/27'
var pipName               = '${projectName}-ip'
var envTag                = 'dev'

resource pip 'Microsoft.Network/publicIPAddresses@2021-03-01' = { 
  name: pipName
  location: location
  properties: {
    publicIPAllocationMethod: 'Static'
    dnsSettings: {
      domainNameLabel: 'crashell'
    }
  }
  sku: {
    name: 'Standard'
  }
  tags: {
    name: projectName
    env: envTag
  }
}

resource vnet 'Microsoft.Network/virtualNetworks@2021-03-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        vnetAddress
      ]
    }
    subnets: [
      {
        name: subnet1Name
        properties: {
          addressPrefix: subnet1Address
        }
      }
      {
        name: subnet2Name
        properties: {
          addressPrefix: subnet2Adress
        }
      }
      {
        name: subnetBastion
        properties: {
          addressPrefix: subnetBastionAddress
        }
      }
    ]
  }
  tags: {
    name: projectName
    env: envTag
  }
}

resource bastion 'Microsoft.Network/bastionHosts@2021-03-01' = {
  name: nameBastion
  location: location
  sku: {
    name: 'Basic'
  }
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig'
        properties: {
          subnet: {
            id: resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, subnetBastion)
          }
          publicIPAddress: {
            id: pip.id
          }
        }
      }
    ]
  }
  tags: {
    name: projectName
    env: envTag
  }
}

Implementar plantilla ARM desde la CLI

Primero debes autenticarte con el comando az login. Necesitas un grupo de recursos que puedes crear con la siguiente instrucción:

az group create --name CrashellRG --location eastus --tags @{name="crashell"}

Es ideal comprobar para encontrar errores y obtener una vista previa de los cambios antes de hacer la implementación. Para ello, ejecuta:

az deployment group create --resource-group CrashellRG --template-file bastion.bicep -c

El comando anterior hace la comprobación y pregunta si quieres hacer el deployment. Para hacer la implementación sin hacer una comprobación, ejecuta:

az deployment group create --resource-group CrashellRG --template-file bastion.bicep

Eliminar recursos en Azure desde la CLI

Para eliminar todos los recursos creados, la forma más rápida es eliminar el grupo de recursos. Ejecuta la siguiente instrucción:

az group delete --name CrashellRG

Puedes visitar el repositorio Infraestructura como código en Azure con Bicep para encontrar esta plantilla completa y otras más.

  • John Doe
    43 Sales$156,24 Totals
    62%
  • Rosy O'Dowell
    12 Leads$56,24 Totals
    32%

With supporting text below as a natural lead-in to additional content.

Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.