Skip to content

Azure Services

Azure Backup para AKS: experiencia CLI simplificada para habilitar protección

Resumen

En abril de 2026, Azure Backup lanza una experiencia de CLI simplificada para habilitar backup en clusters de AKS. El proceso anterior requería múltiples pasos manuales: crear el Backup vault, registrar extensiones, configurar permisos RBAC en el cluster y en las cuentas de storage, y asociar la política. Ahora es posible hacerlo en un único comando az aks backup enable. Útil para equipos que gestionan muchos clusters o necesitan estandarizar el backup de AKS en pipelines de CI/CD.

Arquitectura de backup de AKS

Azure Backup para AKS hace snapshots de:

  • Recursos de Kubernetes (deployments, configmaps, secrets, PVCs y sus definiciones)
  • Volúmenes persistentes (datos en disco, via CSI snapshot)

El proceso usa una extensión de backup instalada en el cluster que interactúa con el Backup vault:

flowchart TD
    AKS[Cluster AKS] --> EXT[Backup Extension\nInstalada en el cluster]
    EXT --> VAULT[Backup Vault]
    EXT --> SNAP[Snapshot de volúmenes\nAzure Disk / ANF]
    VAULT --> POL[Backup Policy\nRetención y frecuencia]
    POL --> RP[Recovery Points]

    subgraph Backup flow
        EXT
        SNAP
    end

Habilitación con el nuevo comando simplificado

Antes (proceso manual)

# 1. Crear Backup vault
# 2. Instalar extensión de backup en el cluster
# 3. Crear backup instance manualmente
# 4. Asignar permisos RBAC al vault en el cluster
# 5. Asignar permisos en el Resource Group de snapshots
# (5+ comandos, gestión manual de IDs)

Ahora (comando unificado)

az aks backup enable \
  --resource-group myRG \
  --cluster-name myAKSCluster \
  --vault-name myBackupVault \
  --vault-resource-group myBackupRG \
  --backup-policy-name dailyAKSPolicy \
  --backup-storage-location-name eastus

Este comando:

  1. Instala la extensión de backup en el cluster si no está presente
  2. Crea el Backup vault si no existe (o usa uno existente)
  3. Configura automáticamente los role assignments necesarios
  4. Crea la Backup instance asociando cluster, vault y policy

Gestionar políticas de backup

Crear una política personalizada

# Ver políticas disponibles en el vault
az dataprotection backup-policy list \
  --resource-group myBackupRG \
  --vault-name myBackupVault \
  --output table

# Crear política con retención de 30 días y backup diario
az dataprotection backup-policy create \
  --resource-group myBackupRG \
  --vault-name myBackupVault \
  --name dailyAKSPolicy \
  --datasource-types AzureKubernetesService \
  --policy '{
    "policyRules": [
      {
        "backupParameters": {
          "objectType": "AzureBackupParams",
          "backupType": "Incremental"
        },
        "trigger": {
          "objectType": "ScheduleBasedTriggerContext",
          "schedule": {
            "repeatingTimeIntervals": ["R/2026-01-01T02:00:00+00:00/P1D"]
          },
          "taggingCriteria": [{"tagInfo": {"tagName": "Default"}, "isDefault": true}]
        },
        "dataStore": {
          "dataStoreType": "OperationalStore",
          "objectType": "DataStoreInfoBase"
        },
        "name": "BackupHourly",
        "objectType": "AzureBackupRule"
      }
    ]
  }'

Verificar el estado del backup

# Ver instancias de backup del cluster
az dataprotection backup-instance list \
  --resource-group myBackupRG \
  --vault-name myBackupVault \
  --query "[?contains(name,'myAKSCluster')].{Name:name, Status:properties.currentProtectionState}" \
  --output table

# Ver recovery points disponibles
az dataprotection recovery-point list \
  --resource-group myBackupRG \
  --vault-name myBackupVault \
  --backup-instance-name <backup-instance-name> \
  --output table

Restaurar desde un recovery point

az aks backup restore \
  --resource-group myRG \
  --cluster-name myAKSCluster \
  --vault-name myBackupVault \
  --vault-resource-group myBackupRG \
  --recovery-point-id <recovery-point-id> \
  --restore-location eastus \
  --restore-to-cluster-id <target-cluster-resource-id>

Warning

La restauración de AKS es destructiva para los recursos restaurados. Si restauras en el mismo cluster, los recursos existentes con los mismos nombres serán sobreescritos. Considera siempre restaurar primero en un cluster de prueba.

Integrar en pipelines de CI/CD

# Ejemplo: GitHub Actions step para habilitar backup en nuevo cluster
- name: Enable AKS Backup
  run: |
    az aks backup enable \
      --resource-group ${{ env.RESOURCE_GROUP }} \
      --cluster-name ${{ env.CLUSTER_NAME }} \
      --vault-name ${{ env.BACKUP_VAULT }} \
      --vault-resource-group ${{ env.BACKUP_RG }} \
      --backup-policy-name dailyAKSPolicy \
      --backup-storage-location-name ${{ env.LOCATION }}

Buenas prácticas

  • Almacena el Backup vault en un Resource Group separado del cluster. Si el RG del cluster se elimina accidentalmente, los backups permanecen.
  • Habilita soft delete en el Backup vault para prevenir la eliminación accidental de recovery points.
  • Prueba la restauración al menos una vez al mes en un cluster de staging para validar que los backups son funcionales.
# Habilitar soft delete en el vault
az dataprotection backup-vault update \
  --resource-group myBackupRG \
  --vault-name myBackupVault \
  --soft-delete-state On \
  --soft-delete-retention-duration-in-days 14

Referencias

AVD RDP Multipath: resiliencia de red con múltiples rutas TCP en preview

Resumen

En abril de 2026, Azure Virtual Desktop lanza en preview RDP Multipath, una extensión del protocolo RDP que mantiene múltiples rutas TCP simultáneas entre el cliente y el session host. Si una ruta falla —por ejemplo, una interfaz de red, un ISP o una VPN— la sesión continúa automáticamente a través de las rutas restantes sin reconexión visible para el usuario. Es especialmente útil para usuarios móviles o con conectividad variable que requieren sesiones RDP estables.

¿Cómo funciona RDP Multipath?

RDP Multipath usa el protocolo MPTCP (Multipath TCP) para establecer subrutas (subflows) sobre diferentes interfaces de red o rutas. Si el cliente tiene conectividad Wi-Fi y 4G/5G simultáneamente, Multipath puede usar ambas:

flowchart LR
    C[Cliente AVD] --> SF1[Subflow 1\nWi-Fi / Ethernet]
    C --> SF2[Subflow 2\n4G / 5G]
    SF1 --> SH[Session Host\nAzure]
    SF2 --> SH

    note1[Si SF1 falla → SF2 mantiene la sesión]
    note2[Carga distribuida entre rutas activas]

Diferencia con RDP Shortpath

Característica RDP Shortpath RDP Multipath
Protocolo base UDP TCP
Objetivo principal Reducir latencia Aumentar resiliencia
Rutas simultáneas 1 Múltiples
Escenario ideal Redes corporativas estables Usuarios móviles o con WAN redundante
Estado (abril 2026) GA Preview

Ambas características son complementarias y pueden estar activas al mismo tiempo.

Requisitos de la preview

  • Session hosts: Windows Server 2025 o Windows 11 24H2
  • Cliente: Windows App versión 2.0.80 o superior
  • Red: El cliente debe tener múltiples interfaces activas para aprovechar las rutas paralelas
  • OS del cliente: Windows 11 con MPTCP habilitado

Verificar MPTCP en el cliente Windows

# Verificar estado de MPTCP en Windows 11
Get-NetTCPSetting | Select-Object SettingName, AutoTuningLevelLocal, MultiPath

# Habilitar MPTCP si está desactivado
Set-NetTCPSetting -SettingName InternetCustom -MultiPath Enabled

Habilitar RDP Multipath en el host pool

En el portal de AVD → Host pool → RDP Properties → Network settings

O vía CLI:

az desktopvirtualization hostpool update \
  --resource-group myRG \
  --name myHostPool \
  --custom-rdp-property "multipath:i:1"

Verificar que Multipath está activo

Durante una sesión activa, en Windows App:

Connection Information → Transport: TCP (RDP Multipath)
                       → Active paths: 2

Desde el session host, verificar conexiones MPTCP activas:

# Ver conexiones TCP con información de subflows (Windows Server 2025)
Get-NetTCPConnection -State Established |
    Where-Object { $_.LocalPort -eq 3389 -or $_.RemotePort -eq 3389 } |
    Select-Object LocalAddress, RemoteAddress, State

Casos de uso recomendados

  • Usuarios móviles con laptops que alternan entre Wi-Fi corporativo y datos móviles
  • Sesiones críticas que no pueden interrumpirse por cambios de red (salas de control, trading, soporte remoto crítico)
  • Oficinas con doble ISP donde los usuarios necesitan failover transparente

Warning

En la preview, RDP Multipath puede no estar disponible en todas las regiones de Azure. Verifica la disponibilidad regional en la documentación oficial antes de planificar el rollout.

Note

RDP Multipath y RDP Shortpath pueden coexistir en la misma configuración de host pool: Shortpath mejora la latencia en redes con buena calidad, mientras que Multipath añade resiliencia. Si Shortpath (UDP) no está disponible por restricciones de red, la sesión cae a TCP, donde Multipath puede proporcionar resiliencia.

Buenas prácticas

  • Despliega la preview en un subconjunto de usuarios itinerantes y recoge feedback antes del rollout general.
  • Monitoriza el consumo de ancho de banda: con múltiples rutas activas, el tráfico total puede aumentar si el cliente usa ambas interfaces simultáneamente.
  • Documenta las interfaces de red disponibles en los dispositivos de los usuarios; si todos están en redes Ethernet de un solo path, Multipath no aportará beneficio.

Referencias

Azure AI Foundry Model Router: nuevos modelos y failover automático en marzo 2026

Resumen

En marzo de 2026, el Model Router de Azure AI Foundry incorpora cuatro nuevos modelos —incluyendo versiones actualizadas de GPT, DeepSeek y Claude— y estrena failover automático entre modelos: si el modelo primario no está disponible o supera su cuota, el router redirige la petición al siguiente candidato de forma transparente. Es una capacidad crítica para aplicaciones que necesitan alta disponibilidad en sus llamadas a LLMs sin gestionar lógica de fallback propia.

¿Qué es el Model Router en Foundry?

El Model Router es un endpoint unificado en Azure AI Foundry que recibe una petición de inferencia y decide qué modelo la procesa, basándose en:

  • Disponibilidad del modelo (capacidad, cuota disponible)
  • Coste por token (puede optimizar por precio)
  • Capacidades requeridas (si el prompt requiere visión, búsqueda, etc.)
flowchart LR
    APP["Aplicación"] --> MR["Model Router
    Azure AI Foundry"]
    MR -->|Disponible| M1["GPT-5.2"]
    MR -->|Failover| M2["GPT-4o"]
    MR -->|Failover| M3["DeepSeek-v3.2"]
    MR -->|Especializado| M4["Claude Opus 4.6"]
    M1 & M2 & M3 & M4 --> MR
    MR --> APP

Nuevos modelos disponibles en marzo 2026

Modelo Tipo Características destacadas
gpt-5.2 OpenAI GPT Mejor razonamiento, contexto 256K
DeepSeek-v3.2 DeepSeek Open-weights, alta eficiencia en código
claude-opus-4-6 Anthropic Larga ventana de contexto, seguimiento de instrucciones
phi-4-mini Microsoft Ligero, bajo coste, ideal para tasks simples

Failover automático: cómo funciona

Cuando una petición llega al Model Router:

  1. El router intenta el modelo con mayor prioridad configurada
  2. Si recibe 429 Too Many Requests o 503 Service Unavailable, reintenta automáticamente con el siguiente modelo del grupo de failover
  3. El proceso es transparente para el cliente: recibe una respuesta del modelo alternativo sin errores

Configurar un grupo de failover

Desde Foundry → Model Router → Deployments → Create deployment group:

{
  "deploymentGroupName": "production-llm",
  "models": [
    {
      "modelId": "gpt-5.2",
      "priority": 1,
      "quotaAllocation": 80
    },
    {
      "modelId": "gpt-4o",
      "priority": 2,
      "quotaAllocation": 60
    },
    {
      "modelId": "DeepSeek-v3.2",
      "priority": 3,
      "quotaAllocation": 100
    }
  ],
  "failoverPolicy": {
    "enableAutoFailover": true,
    "failoverOnQuotaExhaustion": true,
    "failoverOnServiceUnavailable": true
  }
}

Llamar al Model Router desde tu aplicación

El endpoint del Model Router es compatible con la API de Azure OpenAI, por lo que no necesitas cambiar el SDK:

from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(),
    "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAI(
    azure_endpoint="https://<foundry-resource>.openai.azure.com/",
    azure_ad_token_provider=token_provider,
    api_version="2025-01-01-preview"
)

response = client.chat.completions.create(
    model="production-llm",   # nombre del deployment group, no el modelo individual
    messages=[
        {"role": "user", "content": "Explica qué es el Model Router de Azure AI Foundry"}
    ]
)

# La respuesta incluye qué modelo respondió efectivamente
print(response.model)   # ej: "gpt-5.2" o "gpt-4o" si hubo failover
print(response.choices[0].message.content)

Monitorización del router

Puedes ver qué modelo procesó cada petición en las métricas de Foundry:

# KQL en Log Analytics para ver distribución de uso por modelo
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where Category == "RequestResponse"
| extend ModelUsed = tostring(Properties["model"])
| summarize Requests = count() by ModelUsed, bin(TimeGenerated, 1h)
| render columnchart

Note

El coste se factura según el modelo que efectivamente procesó la petición, no el modelo primario configurado. Si hay failover frecuente a modelos más caros, aparecerá reflejado en la factura. Configura alertas de coste en Azure Cost Management.

Buenas prácticas

  • Incluye siempre un modelo de bajo coste como último nivel de failover para evitar que las peticiones fallen por agotamiento de cuota.
  • Usa response.model para registrar qué modelo procesó cada petición y detectar patrones de failover excesivo.
  • No asumas que el modelo alternativo tiene las mismas capacidades que el primario: valida que el output del grupo de failover es aceptable para tu caso de uso.

Referencias

Resumen

Desde febrero de 2026, RDP Shortpath con UDP sobre Azure Private Link es GA en Azure Virtual Desktop. Esto permite que el tráfico de sesión de usuario (no solo el de gestión) viaje por la red privada de Azure en lugar de internet, combinando la baja latencia de UDP de RDP Shortpath con el aislamiento de red de Private Link. Es la opción recomendada para organizaciones con requisitos estrictos de seguridad de red y conectividad ExpressRoute o VPN.

¿Qué combinación es esta?

AVD tiene dos canales de tráfico diferenciados:

Canal Descripción Opción privada disponible
Control plane Gestión, registro de sesión, configuración Private Link (GA desde 2023)
Session data Tráfico de la sesión de usuario (pantalla, audio, input) RDP Shortpath UDP + Private Link (GA feb 2026)

Hasta ahora, Private Link cubría el control plane pero el tráfico de sesión podía salir a internet si no había Shortpath Managed. Con esta GA, el tráfico de sesión también puede mantenerse completamente en la red privada usando UDP.

Arquitectura

flowchart LR
    C[Cliente corporativo] --> VPN[ExpressRoute / VPN Gateway]
    VPN --> VNET[VNet corporativa]
    VNET --> PE[Private Endpoint\nAVD Session data]
    PE --> SH[Session Host AKS/VM]

    subgraph Red privada Azure
        PE
        SH
    end

    note1[No hay tráfico de sesión\nque salga a internet]

Requisitos

  • Session hosts: Windows 11 22H2 o superior, o Windows Server 2022
  • Cliente: Windows App (actualizado) o Remote Desktop client 1.2.5000+
  • Red: Private Endpoint desplegado para el servicio de datos de AVD
  • RDP Shortpath Managed habilitado en el host pool

1. Crear el Private Endpoint para sesión

En el portal de Azure → Azure Virtual Desktop → tu host pool → Networking → Private endpoints

O vía CLI:

HOSTPOOL_ID=$(az desktopvirtualization hostpool show \
  --resource-group myRG \
  --name myHostPool \
  --query id -o tsv)

az network private-endpoint create \
  --name avd-session-pe \
  --resource-group myRG \
  --vnet-name myVNet \
  --subnet mySubnet \
  --private-connection-resource-id $HOSTPOOL_ID \
  --group-id sessionHost \
  --connection-name avd-session-connection

2. Crear la zona DNS privada y el vínculo

az network private-dns zone create \
  --resource-group myRG \
  --name "privatelink.wvd.microsoft.com"

az network private-dns link vnet create \
  --resource-group myRG \
  --zone-name "privatelink.wvd.microsoft.com" \
  --name avd-dns-link \
  --virtual-network myVNet \
  --registration-enabled false

Durante una sesión activa, en Windows App o Remote Desktop:

Connection Information → Transport: UDP
                       → Path: Private

Desde PowerShell en el session host:

# Verificar conexiones UDP activas del servicio RDS
Get-NetUDPEndpoint |
    Where-Object { $_.LocalPort -gt 49152 } |
    Select-Object LocalAddress, LocalPort, OwningProcess

Impacto en costes de red

Note

El tráfico a través de Private Endpoints tiene coste de proceso. Para sesiones de usuario con alto consumo de ancho de banda (vídeo, CAD), evalúa el coste de Private Endpoint frente al coste de ancho de banda de salida a internet que evitas.

Coste Con Private Link Sin Private Link (internet)
Proceso PE ~0,01 $/hora por PE
Datos inbound ~0,01 $/GB
Datos outbound ~0,01 $/GB Tarifa de salida a internet

Buenas prácticas

  • Despliega el Private Endpoint en una subred dedicada para AVD; facilita las reglas de NSG y el troubleshooting.
  • Usa Network Watcher para verificar que el tráfico UDP efectivamente no sale a internet.
  • Si tienes clientes remotos sin VPN/ExpressRoute (por ejemplo, BYOD en casa), estos seguirán usando la ruta pública. Private Link solo aplica a clientes dentro de la red privada conectada.

Referencias

GPT-4o Realtime 1.5 y Audio 1.5: mejor seguimiento de instrucciones y soporte multilingüe

Resumen

En febrero de 2026, Microsoft publicó las versiones gpt-4o-realtime-preview-1.5 y gpt-4o-audio-preview-1.5 en Azure OpenAI. Estas versiones mejoran significativamente el seguimiento de instrucciones del system prompt, la calidad de respuesta en conversaciones en múltiples idiomas y la estabilidad de la Realtime API para casos de uso de voz. Si tienes aplicaciones de voz o audio sobre Azure OpenAI, conviene planificar la migración a estas versiones.

¿Qué cambia en estas versiones?

gpt-4o-realtime-preview-1.5

La Realtime API de Azure OpenAI permite conversaciones de baja latencia vía WebSocket: el cliente envía audio y recibe respuesta de voz sin pasar por transcripción intermedia.

Mejoras en 1.5:

  • Instruction following: el modelo respeta mejor restricciones del system prompt (idioma forzado, formato de respuesta, limitaciones de dominio)
  • Multilingüe: mejor calidad en español, alemán, francés, japonés y portugués
  • Latencia reducida: aproximadamente 15-20% menos latencia de TTFB (Time To First Byte de audio) en condiciones de carga estándar (dato estimado según release notes)

gpt-4o-audio-preview-1.5

Versión asíncrona (sin WebSocket) para procesamiento de audio. Acepta audio como input y devuelve texto o audio como output.

Mejoras en 1.5:

  • Mejor reconocimiento de acentos regionales
  • Soporte de entrada de audio de hasta 25 MB por request
  • Reducción de alucinaciones en transcripción de vocabulario técnico

Arquitectura básica con la Realtime API

sequenceDiagram
    participant C as Cliente (browser/app)
    participant A as Azure OpenAI Realtime
    C->>A: WebSocket connect (session.create)
    A-->>C: session.created
    C->>A: input_audio_buffer.append (PCM16)
    C->>A: input_audio_buffer.commit
    A-->>C: conversation.item.created
    A-->>C: response.audio.delta (streaming)
    A-->>C: response.audio.done

Actualizar el modelo en tu configuración

Si ya usas la Realtime API, actualiza el deployment a la nueva versión:

# Crear deployment de la nueva versión
az cognitiveservices account deployment create \
  --resource-group myRG \
  --name myAOAIresource \
  --deployment-name gpt4o-realtime-15 \
  --model-name gpt-4o-realtime-preview \
  --model-version "2025-06-03" \
  --model-format OpenAI \
  --sku-capacity 10 \
  --sku-name Standard

Note

El nombre del modelo en la API sigue siendo gpt-4o-realtime-preview; la versión 2025-06-03 corresponde al release 1.5. Verifica el nombre exacto de versión disponible en tu región en el Azure OpenAI model availability table.

Ejemplo de cliente Python (Realtime API)

import asyncio
import json
import websockets
from azure.identity import DefaultAzureCredential

AOAI_ENDPOINT = "wss://<resource>.openai.azure.com"
DEPLOYMENT = "gpt4o-realtime-15"
API_VERSION = "2025-01-01-preview"

async def realtime_session():
    token = DefaultAzureCredential().get_token("https://cognitiveservices.azure.com/.default").token
    url = f"{AOAI_ENDPOINT}/openai/realtime?deployment={DEPLOYMENT}&api-version={API_VERSION}"

    headers = {"Authorization": f"Bearer {token}"}

    async with websockets.connect(url, extra_headers=headers) as ws:
        # Enviar configuración de sesión con system prompt estricto
        await ws.send(json.dumps({
            "type": "session.update",
            "session": {
                "modalities": ["text", "audio"],
                "instructions": "Responde siempre en español. Solo responde sobre soporte técnico de Azure.",
                "voice": "alloy",
                "input_audio_format": "pcm16",
                "output_audio_format": "pcm16"
            }
        }))
        response = await ws.recv()
        print(json.loads(response))

asyncio.run(realtime_session())

Warning

Usa siempre DefaultAzureCredential o Managed Identity en producción. No hardcodees API keys en el código; usa variables de entorno o Azure Key Vault.

Coste estimado

Los precios de la Realtime API se cobran por tokens de audio y texto:

Tipo Precio estimado (consultar precios actuales)
Audio input ~$0.10 / 1K audio tokens
Audio output ~$0.20 / 1K audio tokens
Text tokens Similar a gpt-4o estándar

Monitoriza el consumo desde Azure Monitor o el dashboard de Azure OpenAI en Foundry para evitar sorpresas en la factura.

Buenas prácticas

  • Prueba el instruction following con casos límite antes de desplegar en producción: el modelo es mejor en 1.5 pero no infalible.
  • Implementa un VAD (Voice Activity Detection) del lado cliente para reducir tokens innecesarios de silencio.
  • Configura turn_detection de tipo server_vad si quieres que el servidor detecte el fin de turno automáticamente.

Referencias

Azure Backup para Confidential VMs: protección de datos en entornos de computación confidencial

Resumen

Desde enero de 2026, Azure Backup soporta en preview pública la protección de Confidential Virtual Machines. Es un paso importante para organizaciones que usan computación confidencial y necesitan garantías de backup sin comprometer el aislamiento de memoria que ofrecen las Confidential VMs. Si tu organización trabaja con datos sensibles bajo regulaciones estrictas y ya usa Confidential VMs, este es el momento de evaluar la integración.

¿Qué son las Confidential VMs?

Las Confidential VMs de Azure usan hardware TEE (Trusted Execution Environment) —basado en AMD SEV-SNP— para cifrar la memoria de la VM durante la ejecución. Ni los administradores del host ni Microsoft pueden acceder a esa memoria.

Esto tiene una implicación directa en backup: los mecanismos tradicionales de snapshot no pueden leer el contenido cifrado de los discos sin el contexto de la VM.

Cómo funciona el backup de Confidential VMs

Azure Backup usa un mecanismo específico que respeta el modelo de confianza de las Confidential VMs:

flowchart TD
    A[Confidential VM\nAMD SEV-SNP] --> B[Disco OS cifrado\nCMK - Customer Managed Key]
    B --> C[Azure Backup Service]
    C --> D{Tipo de snapshot}
    D --> E[Crash-consistent snapshot\nCifrado en reposo con CMK]
    E --> F[Recovery Services Vault\nCMK heredado]
    F --> G[Restore en VM confidencial\ndel mismo tamaño/familia]

Los puntos clave del comportamiento:

  • El snapshot se cifra con la Customer Managed Key (CMK) del disco original
  • Los datos nunca se descifran fuera del entorno confidencial
  • El restore requiere una VM compatible (misma familia, AMD SEV-SNP)

Requisitos previos

  • VM de la serie DCasv5 o ECasv5 (AMD SEV-SNP)
  • OS disk cifrado con CMK (no Platform Managed Key)
  • Recovery Services Vault con cross-region restore habilitado si se necesita DR

Configurar backup desde la CLI

# Variables
VAULT="my-backup-vault"
RG="my-rg"
VM_ID="/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<vm>"

# Crear Recovery Services Vault si no existe
az backup vault create \
  --resource-group $RG \
  --name $VAULT \
  --location eastus

# Habilitar backup en la Confidential VM
az backup protection enable-for-vm \
  --resource-group $RG \
  --vault-name $VAULT \
  --vm $VM_ID \
  --policy-name DefaultPolicy

Limitaciones en preview

Limitación Detalle
Tipo de consistencia Solo crash-consistent (no application-consistent)
Restore cross-subscription No disponible en preview
Familias soportadas DCasv5, ECasv5 únicamente
Key rotation durante backup No soportado; rota la CMK fuera de la ventana de backup

Warning

Durante la preview, no se garantiza SLA de RPO/RTO para Confidential VMs. Evalúa si es adecuado para cargas de producción críticas o úsalo en entornos de pre-producción primero.

Buenas prácticas

  • Almacena la CMK en Azure Key Vault con soft delete y purge protection habilitados. Si pierdes la clave, los backups son irrecuperables.
  • Configura alertas de Azure Backup para detectar fallos en la ventana de backup.
  • Documenta los requisitos de VM para el restore: si necesitas recuperar en otra región, debes tener la familia DCasv5/ECasv5 disponible allí.
# Verificar que el disco está cifrado con CMK
az vm show \
  --resource-group $RG \
  --name <vm-name> \
  --query "storageProfile.osDisk.managedDisk.securityProfile"

Referencias

Azure AI Language completo en Microsoft Foundry: migración desde Language Studio

Resumen

Desde enero de 2026, todas las capacidades de Azure AI Language están disponibles en Microsoft Foundry (portal nuevo). Esto incluye la experiencia completa de Language Studio —gestión de proyectos, entrenamiento, despliegue— y una nueva funcionalidad clave: Orchestration workflow, que permite enrutar consultas de usuario entre proyectos CLU y CQA desde una interfaz unificada. Si aún usas Language Studio clásico, es el momento de migrar.

¿Qué incluye Azure AI Language en Foundry?

Capacidades migradas desde Language Studio

  • Conversational Language Understanding (CLU): intents, entities, entrenamiento de modelos de lenguaje conversacional
  • Custom Question Answering (CQA): bases de conocimiento para responder preguntas
  • Named Entity Recognition, Sentiment Analysis, Key Phrase Extraction y otras capacidades cognitivas
  • Custom Text Classification y Custom NER

Novedad: Orchestration Workflow

El Orchestration Workflow es un orquestador que recibe una consulta de usuario y la enruta al proyecto CLU o CQA más adecuado según la intención detectada.

flowchart LR
    U["Usuario"] --> OW["Orchestration Workflow"]
    OW -->|Intent: soporte técnico| CLU["Proyecto CLU
    Soporte"]
    OW -->|Intent: FAQ producto| CQA["Proyecto CQA
    Documentación"]
    CLU --> R1["Respuesta estructurada"]
    CQA --> R2["Respuesta de KB"]

Esto reduce la complejidad de aplicaciones que antes necesitaban lógica de enrutamiento propia en el backend.

Cómo acceder a las capacidades en Foundry

1. Crear un recurso Azure AI Language

az cognitiveservices account create \
  --name my-language-resource \
  --resource-group myRG \
  --kind TextAnalytics \
  --sku S \
  --location eastus \
  --yes

2. Acceder a Foundry

Navega a https://ai.azure.com y asegúrate de que el toggle New Foundry está activado.

En el panel izquierdo verás las secciones de Language con todos los proyectos disponibles.

3. Crear un Orchestration Workflow

Desde Foundry → Language → Orchestration Workflow → New project:

{
  "projectName": "mi-orquestador",
  "language": "es",
  "projectKind": "Orchestration",
  "intents": [
    {
      "category": "SoporteTecnico",
      "target": {
        "targetProjectKind": "Luis",
        "apiVersion": "2022-10-01",
        "projectName": "soporte-clu"
      }
    },
    {
      "category": "FAQ",
      "target": {
        "targetProjectKind": "QuestionAnswering",
        "projectName": "docs-cqa"
      }
    }
  ]
}

4. Llamar al orquestador desde tu aplicación

from azure.ai.language.conversations import ConversationAnalysisClient
from azure.core.credentials import AzureKeyCredential

client = ConversationAnalysisClient(
    endpoint="https://<resource>.cognitiveservices.azure.com/",
    credential=AzureKeyCredential("<key>")
)

result = client.analyze_conversation(
    task={
        "kind": "Conversation",
        "analysisInput": {
            "conversationItem": {
                "id": "1",
                "participantId": "user",
                "text": "¿Cómo instalo el agente de monitorización?"
            }
        },
        "parameters": {
            "projectName": "mi-orquestador",
            "deploymentName": "production"
        }
    }
)

print(result["result"]["prediction"]["topIntent"])

Migración desde Language Studio

Microsoft ha publicado una guía de migración paso a paso. El proceso consiste en:

  1. Abrir el proyecto existente en Language Studio clásico
  2. Exportar el modelo entrenado (JSON)
  3. Importarlo en Foundry desde Language → Import project
  4. Reentrenar y validar
  5. Actualizar los endpoints en la aplicación (misma API, diferente portal de gestión)

Warning

Language Studio clásico seguirá funcionando durante el período de transición, pero las nuevas funcionalidades —incluyendo Orchestration Workflow mejorado— solo estarán disponibles en el nuevo portal Foundry.

Note

El endpoint y las API keys no cambian al migrar. Lo que cambia es la interfaz de administración.

Buenas prácticas

  • Prueba el Orchestration Workflow en un entorno de desarrollo antes de apuntar tráfico de producción.
  • Configura intents de fallback para evitar que consultas sin match claro lleguen a un proyecto equivocado.
  • Usa Managed Identity en lugar de API keys para acceder al recurso de Language desde tu aplicación.
# Asignar rol Cognitive Services User a la identidad gestionada
az role assignment create \
  --assignee <principal-id> \
  --role "Cognitive Services Language Reader" \
  --scope /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<resource>

Referencias

AVD: gestión centralizada de RDP Shortpath vía Intune y GPO ya es GA

Resumen

Azure Virtual Desktop permite desde enero de 2026 configurar todos los modos de transporte de RDP Shortpath —Managed, Public/STUN y Public/TURN— directamente desde Microsoft Intune o Group Policy. Esta funcionalidad es ahora GA y elimina la necesidad de gestionar configuraciones dispersas en múltiples capas. Los admins de VDI pueden controlar el comportamiento de transporte de red desde una sola política, aplicada a nivel de session host.

¿Qué es RDP Shortpath?

RDP Shortpath es una característica de Azure Virtual Desktop que establece una ruta de transporte UDP directa entre el cliente y el session host, evitando el relay de Azure. Esto reduce la latencia y mejora la experiencia de usuario, especialmente en redes con buena conectividad.

Hay tres modos de transporte configurables:

Modo Descripción Cuándo usar
Managed UDP directo sobre Azure ExpressRoute o VPN Usuarios corporativos con red privada
Public/STUN UDP directo con hole punching NAT Usuarios en internet con NAT estándar
Public/TURN UDP con relay cuando STUN falla NAT simétrico, redes restrictivas

Qué cambia con la GA de enero 2026

Antes de este cambio, la configuración de Shortpath requería combinar ajustes en:

  • Host pool properties (portal de AVD)
  • Registry keys en los session hosts (manual o via scripts)

Ahora todo se configura con registry-backed policies desplegadas vía Intune o GPO. Estas configuraciones aplican a nivel de session host, como una capa adicional sobre las host pool settings.

flowchart TD
    A[Admin] --> B{Herramienta de gestión}
    B --> C[Intune / Endpoint Manager]
    B --> D[Group Policy]
    C --> E[Registry-backed policy]
    D --> E
    E --> F[Session Host]
    F --> G{RDP Shortpath Mode}
    G --> H[Managed - ExpressRoute/VPN]
    G --> I[Public/STUN]
    G --> J[Public/TURN]

Configuración vía Intune

1. Crear un perfil de configuración de dispositivo

En el portal de Intune:

  1. Ve a Devices → Configuration profiles → Create profile
  2. Plataforma: Windows 10 and later
  3. Tipo de perfil: Settings catalog

2. Buscar y configurar las políticas de RDP Shortpath

Busca en el catálogo: Remote Desktop

Las claves relevantes están bajo:

Administrative Templates > Windows Components > Remote Desktop Services > 
Remote Desktop Session Host > Connections

3. Valores recomendados para entornos corporativos con red privada

Enable RDP Shortpath for managed networks: Enabled
Enable RDP Shortpath for public networks: Enabled (STUN)
RDP Shortpath maximum transport unit: 1400

Configuración equivalente vía GPO

# Verificar configuración actual en un session host
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" |
    Select-Object fUseUdpPortRedirector, UdpRedirectorPort
GPO Path: Computer Configuration > Administrative Templates > 
Windows Components > Remote Desktop Services > Remote Desktop Session Host > Connections

- Enable RDP Shortpath for managed networks: Enabled
- Enable RDP Shortpath for public networks: Enabled

Cómo verificar que Shortpath está funcionando

En el cliente de Windows App o Remote Desktop, durante una sesión activa:

Connection Information → Transport: UDP (RDP Shortpath)

Desde PowerShell en el session host:

Get-WinEvent -LogName "Microsoft-Windows-RemoteDesktopServices-RdpCoreCDV/Operational" |
    Where-Object { $_.Message -like "*Shortpath*" } |
    Select-Object TimeCreated, Message -First 10

Buenas prácticas

  • Las políticas de Intune/GPO se aplican además de las host pool settings, no las reemplazan. Comprueba que no haya conflicto entre capas.
  • Para usuarios con NAT simétrico o firewalls corporativos restrictivos, habilita Public/TURN como fallback, pero monitoriza el uso de relay: tiene mayor latencia que STUN.
  • Aplica las políticas primero en un grupo piloto antes de desplegarlas a todos los session hosts.
  • Documenta qué modo está activo en cada host pool para facilitar el troubleshooting.

Note

RDP Shortpath es independiente de Private Link. Si usas Private Link para el tráfico de gestión, Shortpath afecta únicamente al canal de datos de la sesión de usuario.

Referencias

AKS v1.34: FIPS, TLS 1.2 EMS y la retirada definitiva de Azure Linux 2.0

Resumen

AKS v1.34 llega con cambios que afectan directamente a entornos en producción: los componentes del plano de control se compilan ahora con Go 1.25 y módulos criptográficos FIPS, lo que impone el Extended Master Secret (EMS) en conexiones TLS 1.2 de nodos FIPS. Además, a partir del 31 de marzo de 2026 los nodos con Azure Linux 2.0 dejan de funcionar. Si tienes clústeres con esa imagen, debes migrar ya.

¿Qué cambió en AKS v1.34?

Enforcement de EMS en TLS 1.2 (nodos FIPS)

Go 1.25 rechaza handshakes TLS 1.2 que no incluyan el Extended Master Secret (EMS) cuando FIPS está activado. Esto afecta a:

  • Aplicaciones cliente que hablan con el API server de Kubernetes
  • Admission webhooks registrados contra kube-apiserver
  • Cualquier componente compilado con Go < 1.21

Las aplicaciones compiladas con Go < 1.21 no enviaban EMS por defecto en TLS 1.2, por lo que fallarán al conectarse a componentes de AKS v1.34 en nodos FIPS.

sequenceDiagram
    participant App as App (Go < 1.21)
    participant AKS as AKS v1.34 API Server (FIPS)
    App->>AKS: TLS 1.2 ClientHello (sin EMS)
    AKS-->>App: ❌ Handshake rechazado
    Note over App,AKS: Go 1.25 + FIPS exige EMS en TLS 1.2

Retirada de Azure Linux 2.0

Fecha Evento
30 nov 2025 Fin de soporte y actualizaciones de seguridad
31 mar 2026 Eliminación de imágenes de nodo

Desde el 31 de marzo no puedes escalar ni recuperar nodos con Azure Linux 2.0. Las operaciones de reimage y redeploy fallarán.

Cómo verificar si estás afectado

Comprobar versión de Kubernetes y osSKU

az aks show \
  --resource-group <rg> \
  --name <cluster> \
  --query "agentPoolProfiles[].{name:name, osSku:osSku, k8sVersion:currentOrchestratorVersion}" \
  -o table

Comprobar si FIPS está habilitado en el node pool

az aks nodepool show \
  --resource-group <rg> \
  --cluster-name <cluster> \
  --name <nodepool> \
  --query "enableFips"

Cómo migrar

Opción 1: Actualizar node pools a Azure Linux 3

az aks nodepool upgrade \
  --resource-group <rg> \
  --cluster-name <cluster> \
  --name <nodepool> \
  --os-sku AzureLinux

Note

AzureLinux en la CLI apunta a la versión 3.x por defecto desde finales de 2025.

Opción 2: Actualizar a versión de Kubernetes compatible

Si el node pool está en una versión antigua, primero actualiza Kubernetes:

az aks upgrade \
  --resource-group <rg> \
  --name <cluster> \
  --kubernetes-version 1.32.x

Resolver problemas de TLS 1.2 EMS

Si tienes aplicaciones compiladas con Go < 1.21:

# Verificar versión de Go en tu aplicación
go version

# Rebuild con Go 1.21+
go build -o myapp .

Para webhooks, verificar que el servidor TLS responde con EMS:

openssl s_client -connect <webhook-endpoint>:443 -tls1_2 2>&1 | grep "extended master secret"

Buenas prácticas

  • Comprueba la versión de Go de todos los componentes que usen la API de Kubernetes antes de activar FIPS.
  • Si usas cert-manager, ingress controllers o admission webhooks de terceros, verifica que estén actualizados.
  • Para migration de AzureLinux 2.0, crea primero un nuevo node pool con AzureLinux 3, drena el antiguo y elimínalo.
  • Suscríbete a las AKS release notes para anticipar cambios similares.

Warning

No esperes al 31 de marzo para migrar Azure Linux 2.0. Una vez eliminadas las imágenes, las operaciones de scaling y remediation fallan sin previo aviso.

Referencias

Seguridad en Azure Storage: Guía Completa de Firewall, Resource Instances y Mejores Prácticas

Introducción

La seguridad de las cuentas de almacenamiento en Azure es crítica para proteger tus datos. En este artículo profundizaremos en las diferentes opciones de firewall disponibles cuando no se usa Azure private endpoint, con especial énfasis en Resource Instances, Trusted Services y las configuraciones recomendadas cuando no se utilizan Private Endpoints.

Conceptos Fundamentales

¿Qué es el Firewall de Storage Account?

El firewall de Azure Storage Account es una capa de seguridad que controla el acceso al endpoint público de tu cuenta de almacenamiento. Es importante entender que:

  • Un solo firewall protege TODOS los servicios (Blob, Files, Queue, Table)
  • Las reglas aplican a nivel de Storage Account, no por servicio individual
  • El firewall controla quién puede conectarse, mientras que RBAC controla qué puede hacer
graph TD
    A[Cliente/Servicio] -->|Intenta acceder| B{Firewall}
    B -->|✅ Permitido| C{RBAC}
    B -->|❌ Bloqueado| D[403 Forbidden]
    C -->|✅ Con permisos| E[Acceso a datos]
    C -->|❌ Sin permisos| F[403 Unauthorized]

Tipos de Reglas de Red

Azure Storage ofrece cuatro tipos de reglas de red que puedes configurar:

1. Virtual Network Rules

Permiten tráfico desde subnets específicas dentro de Azure Virtual Networks.

# Agregar regla de VNet
Add-AzStorageAccountNetworkRule `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -VirtualNetworkResourceId "/subscriptions/xxx/resourceGroups/rg/providers/Microsoft.Network/virtualNetworks/vnet/subnets/subnet"

Límite: Máximo 400 reglas por Storage Account

2. IP Network Rules

Permiten tráfico desde rangos de IP públicas específicas.

# Agregar regla de IP
Add-AzStorageAccountNetworkRule `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -IPAddressOrRange "203.0.113.0/24"

Límite: Máximo 400 reglas por Storage Account

3. Resource Instance Rules ⭐

Permiten tráfico desde recursos Azure específicos identificados por su Resource ID.

# Agregar Resource Instance
Add-AzStorageAccountNetworkRule `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -TenantId "your-tenant-id" `
    -ResourceId "/subscriptions/xxx/resourceGroups/rg/providers/Microsoft.Synapse/workspaces/myworkspace"

Límite: Máximo 200 reglas por Storage Account

4. Trusted Service Exceptions

Permiten tráfico desde servicios de Microsoft en la lista de confianza.

# Habilitar Trusted Services
Update-AzStorageAccountNetworkRuleSet `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -Bypass AzureServices,Logging,Metrics

Límite: Sin límite (es un flag de configuración)

Resource Instances: Control Granular

¿Qué son las Resource Instances?

Las Resource Instance Rules son la forma más segura de permitir acceso a servicios Azure cuando no usas Private Endpoints. A diferencia de Trusted Services (que permite CUALQUIER instancia de un servicio en tu tenant), Resource Instances te permite especificar exactamente qué recurso puede acceder.

Comparación: Trusted Services vs Resource Instances

Aspecto Trusted Services Resource Instances
Granularidad ❌ Cualquier instancia del tenant ✅ Solo recursos específicos
Seguridad ⚠️ Permisivo ✅ Restrictivo
Principio de menor privilegio ❌ No cumple ✅ Cumple completamente
Auditoría ❌ Difícil rastrear ✅ Trazabilidad completa
Compliance ⚠️ Puede tener problemas ✅ SOC2, ISO27001 friendly
Zero Trust ❌ No alineado ✅ Completamente alineado

Ejemplo Práctico

Imagina que tienes múltiples Azure Synapse Workspaces en tu tenant:

Update-AzStorageAccountNetworkRuleSet `
    -Bypass AzureServices

# Resultado:
# ✅ prod-synapse → Acceso permitido
# ✅ dev-synapse → Acceso permitido
# ✅ test-synapse → Acceso permitido
# ✅ Cualquier otro Synapse creado → Acceso permitido
Add-AzStorageAccountNetworkRule `
    -TenantId "xxx" `
    -ResourceId "/subscriptions/xxx/.../Microsoft.Synapse/workspaces/prod-synapse"

# Resultado:
# ✅ prod-synapse → Acceso permitido
# ❌ dev-synapse → Bloqueado
# ❌ test-synapse → Bloqueado
# ❌ Cualquier otro Synapse → Bloqueado

Requerimientos para Resource Instances

Para usar Resource Instances correctamente, necesitas cumplir varios requisitos:

✅ Checklist de Requerimientos

  • Managed Identity: El recurso debe tener System-Assigned Managed Identity habilitada
  • Mismo Tenant: Recurso y Storage Account en el mismo Microsoft Entra tenant
  • Firewall Restrictivo: Storage Account con DefaultAction: Deny
  • Permisos para configurar: Rol Storage Account Contributor o superior
  • Resource ID completo: Necesitas el Resource ID del recurso Azure
  • Rol RBAC asignado: La Managed Identity necesita roles de acceso a datos

Importante

La Resource Instance Rule solo da acceso al endpoint público, NO a los datos. Debes asignar roles RBAC a la Managed Identity del recurso.

Configuración Completa Paso a Paso

# Variables
$rgName = "myResourceGroup"
$storageAccount = "mystorageaccount"
$synapseWorkspaceName = "prod-synapse"
$synapseRG = "synapse-rg"
$tenantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# 1. Obtener Resource ID del Synapse Workspace
$synapseResourceId = (Get-AzSynapseWorkspace `
    -ResourceGroupName $synapseRG `
    -Name $synapseWorkspaceName).Id

# 2. Configurar firewall restrictivo
Update-AzStorageAccountNetworkRuleSet `
    -ResourceGroupName $rgName `
    -Name $storageAccount `
    -DefaultAction Deny `
    -Bypass Logging,Metrics

# 3. Agregar Resource Instance Rule
Add-AzStorageAccountNetworkRule `
    -ResourceGroupName $rgName `
    -Name $storageAccount `
    -TenantId $tenantId `
    -ResourceId $synapseResourceId

# 4. Obtener Managed Identity Object ID
$workspace = Get-AzSynapseWorkspace `
    -ResourceGroupName $synapseRG `
    -Name $synapseWorkspaceName
$principalId = $workspace.Identity.PrincipalId

# 5. Asignar rol RBAC para acceso a datos
New-AzRoleAssignment `
    -ObjectId $principalId `
    -RoleDefinitionName "Storage Blob Data Contributor" `
    -Scope "/subscriptions/$((Get-AzContext).Subscription.Id)/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccount"

Write-Host "✅ Configuración completa!" -ForegroundColor Green

Excepciones (Bypass): Logging y Metrics

Las Exceptions son configuraciones especiales que permiten que ciertos servicios bypaseen el firewall.

Tipos de Excepciones

1. Allow Azure services on the trusted services list
Bypass: AzureServices

¿Qué hace?
  - Permite TODOS los servicios de la lista de Trusted Services
  - Incluye: Azure Backup, Synapse, SQL, Stream Analytics, etc.

⚠️ Recomendación: Usar Resource Instances en su lugar
2. Allow read access to storage logging
Bypass: Logging

¿Qué hace?
  - Permite leer el contenedor especial "$logs"
  - Solo para diagnósticos de Azure Monitor
  - NO da acceso a tus datos de aplicación

✅ Recomendación: SIEMPRE habilitado
3. Allow read access to storage metrics
Bypass: Metrics

¿Qué hace?
  - Permite leer las tablas "$Metrics*"
  - Solo para métricas de Azure Monitor
  - NO da acceso a tus datos de aplicación

✅ Recomendación: SIEMPRE habilitado

Cómo Configurar Excepciones en el Portal

  1. Ve a tu Storage Account
  2. Navega a: Security + networkingNetworking
  3. Click en View junto a "Virtual networks, IP addresses, and exceptions"
  4. Scroll down hasta la sección Exceptions
  5. Marca/desmarca los checkboxes según necesites:
  6. ☐ Allow Azure services on the trusted services list
  7. ☑️ Allow read access to storage logging
  8. ☑️ Allow read access to storage metrics
  9. Click en Save

Configuración Recomendada sin Private Endpoints

Esta es la configuración óptima para máxima seguridad sin el costo adicional de Private Endpoints:

🎯 Configuración de Producción

Nota sobre Azure Backup

Si usas Azure Backup para discos no administrados, necesitarás habilitar AzureServices en el Bypass. Ver sección de Azure Backup para más detalles.

# 1. Configurar firewall restrictivo con excepciones de lectura
Update-AzStorageAccountNetworkRuleSet `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -DefaultAction Deny `
    -Bypass Logging,Metrics  # SIN AzureServices (a menos que uses Azure Backup)

# 2. Agregar Resource Instances específicas
$resources = @(
    "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.Synapse/workspaces/prod-synapse",
    "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.DataFactory/factories/prod-adf",
    "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.Databricks/workspaces/prod-dbx"
)

foreach ($resourceId in $resources) {
    Add-AzStorageAccountNetworkRule `
        -ResourceGroupName "myRG" `
        -Name "mystorageaccount" `
        -TenantId "your-tenant-id" `
        -ResourceId $resourceId
}

# 3. Agregar IPs de oficina/VPN (opcional)
$officeIPs = @("203.0.113.10", "198.51.100.0/24")
foreach ($ip in $officeIPs) {
    Add-AzStorageAccountNetworkRule `
        -ResourceGroupName "myRG" `
        -Name "mystorageaccount" `
        -IPAddressOrRange $ip
}

Arquitectura Visual

┌─────────────────────────────────────────────────────────────┐
│         Storage Account Firewall Configuration              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│ Public network access: Selected networks                    │
│ Default Action: DENY                                        │
│                                                             │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                             │
│ Exceptions (Bypass):                                        │
│   ☐ AzureServices (NO - demasiado permisivo)               │
│   ☑️ Logging (SÍ - para troubleshooting)                   │
│   ☑️ Metrics (SÍ - para monitoreo)                         │
│                                                             │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│                                                             │
│ Resource Instances (granular):                             │
│   ✅ prod-synapse                                           │
│   ✅ prod-adf                                               │
│   ✅ prod-databricks                                        │
│                                                             │
│ VNet Rules: [subnets específicas]                          │
│ IP Rules: [oficinas, VPN]                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Alcance del Firewall: Todos los Servicios

Concepto Clave

El firewall de Storage Account protege TODOS los servicios, no puedes configurarlo por servicio individual.

Servicios Afectados

El firewall aplica a todos estos endpoints:

  • 🔵 Blob Storage: https://{account}.blob.core.windows.net
  • 📁 File Storage: https://{account}.file.core.windows.net
  • 📮 Queue Storage: https://{account}.queue.core.windows.net
  • 📊 Table Storage: https://{account}.table.core.windows.net

Control Granular por Servicio

Si necesitas que un recurso acceda solo a Blob pero no a Files, usa RBAC:

# Firewall: Permite conexión al endpoint (todos los servicios)
Add-AzStorageAccountNetworkRule -ResourceId $resourceId

# RBAC: Controla acceso específico por servicio
New-AzRoleAssignment `
    -ObjectId $principalId `
    -RoleDefinitionName "Storage Blob Data Contributor" `  # Solo Blob
    -Scope $storageAccountScope

# No asignas roles para Files, Queues o Tables
# → Aunque el firewall permita conexión, no tiene permisos RBAC

Validación de Configuración

Script de Validación Completa

function Test-StorageAccountSecurityConfig {
    param(
        [string]$ResourceGroupName,
        [string]$StorageAccountName
    )

    $rules = Get-AzStorageAccountNetworkRuleSet `
        -ResourceGroupName $ResourceGroupName `
        -Name $StorageAccountName

    Write-Host "`n🔍 VALIDACIÓN DE CONFIGURACIÓN ÓPTIMA" -ForegroundColor Cyan
    Write-Host "═══════════════════════════════════════`n" -ForegroundColor Cyan

    $score = 0
    $maxScore = 5

    # Check 1: DefaultAction
    if ($rules.DefaultAction -eq "Deny") {
        Write-Host "✅ DefaultAction: Deny (Correcto)" -ForegroundColor Green
        $score++
    } else {
        Write-Host "❌ DefaultAction: Allow (Cambiar a Deny)" -ForegroundColor Red
    }

    # Check 2: Bypass óptimo
    if ($rules.Bypass -notlike "*AzureServices*" -and 
        $rules.Bypass -like "*Logging*" -and 
        $rules.Bypass -like "*Metrics*") {
        Write-Host "✅ Bypass: Logging,Metrics (Óptimo)" -ForegroundColor Green
        $score++
    } elseif ($rules.Bypass -like "*AzureServices*") {
        Write-Host "⚠️  Bypass incluye AzureServices (Considerar usar Resource Instances)" -ForegroundColor Yellow
    }

    # Check 3: Resource Instances
    if ($rules.ResourceAccessRules.Count -gt 0) {
        Write-Host "✅ Resource Instances: $($rules.ResourceAccessRules.Count) configuradas" -ForegroundColor Green
        foreach ($rule in $rules.ResourceAccessRules) {
            $resourceName = $rule.ResourceId.Split('/')[-1]
            Write-Host "   → $resourceName" -ForegroundColor Gray
        }
        $score++
    } else {
        Write-Host "⚠️  No hay Resource Instances configuradas" -ForegroundColor Yellow
    }

    # Check 4: VNet Rules
    if ($rules.VirtualNetworkRules.Count -gt 0) {
        Write-Host "✅ VNet Rules: $($rules.VirtualNetworkRules.Count)" -ForegroundColor Green
        $score++
    }

    # Check 5: IP Rules
    if ($rules.IpRules.Count -gt 0) {
        Write-Host "✅ IP Rules: $($rules.IpRules.Count)" -ForegroundColor Green
        $score++
    }

    # Resumen
    Write-Host "`n════════════════════════════════════════" -ForegroundColor Cyan
    Write-Host "Puntaje de Seguridad: $score/$maxScore" -ForegroundColor $(
        if ($score -eq $maxScore) { "Green" } 
        elseif ($score -ge 3) { "Yellow" } 
        else { "Red" }
    )

    if ($score -ge 4 -and $rules.Bypass -notlike "*AzureServices*") {
        Write-Host "🎉 CONFIGURACIÓN ÓPTIMA" -ForegroundColor Green
    } else {
        Write-Host "⚠️  Revisar configuración según recomendaciones" -ForegroundColor Yellow
    }
}

# Uso
Test-StorageAccountSecurityConfig -ResourceGroupName "myRG" -StorageAccountName "mystorageaccount"

Mejores Prácticas

✅ Recomendaciones de Seguridad

  1. Usa Resource Instances en lugar de Trusted Services
  2. Mayor control y trazabilidad
  3. Cumple con Zero Trust
  4. Mejor para compliance

  5. Siempre habilita Logging y Metrics

  6. Necesario para troubleshooting
  7. No expone tus datos
  8. Bajo riesgo de seguridad

  9. Aplica el principio de menor privilegio

  10. Firewall: Solo recursos que realmente necesitan acceso
  11. RBAC: Solo los permisos mínimos necesarios

  12. Documenta tus Resource Instances

  13. Mantén un registro de qué recurso accede y por qué
  14. Facilita auditorías y compliance

  15. Revisa periódicamente las reglas

  16. Elimina recursos que ya no existen
  17. Verifica que las reglas siguen siendo necesarias

⚠️ Errores Comunes a Evitar

No hagas esto

  • ❌ Dejar DefaultAction: Allow en producción
  • ❌ Usar solo Trusted Services por conveniencia
  • ❌ Olvidar asignar roles RBAC después de crear Resource Instance
  • ❌ No documentar para qué sirve cada regla
  • ❌ Deshabilitar Logging y Metrics

Casos Especiales: Servicios que Requieren Trusted Services

Algunos servicios de Azure NO soportan Resource Instances y requieren que tengas habilitado Bypass: AzureServices. Es importante conocer estos casos para planificar tu estrategia de seguridad.

Azure Backup

Azure Backup es uno de los servicios más importantes que requiere Trusted Services para ciertos escenarios:

Azure Backup y Trusted Services

Azure Backup necesita Bypass: AzureServices habilitado para:

  • Backup de discos no administrados (unmanaged disks) en VMs
  • Restore de VMs con discos no administrados
  • Algunos escenarios de backup de Azure Files

NO necesita Trusted Services para:

  • Backup de discos administrados (managed disks) - Azure los gestiona automáticamente
Configuración para Azure Backup

Si usas Azure Backup, tienes dos opciones:

# Habilitar Trusted Services para Azure Backup
Update-AzStorageAccountNetworkRuleSet `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -DefaultAction Deny `
    -Bypass AzureServices,Logging,Metrics

# ⚠️ Esto permite acceso a TODOS los servicios trusted
# No solo Azure Backup
# Combinar Trusted Services + Resource Instances
Update-AzStorageAccountNetworkRuleSet `
    -ResourceGroupName "myRG" `
    -Name "mystorageaccount" `
    -DefaultAction Deny `
    -Bypass AzureServices,Logging,Metrics  # Para Azure Backup

# Agregar Resource Instances para otros servicios
Add-AzStorageAccountNetworkRule `
    -TenantId "xxx" `
    -ResourceId "/subscriptions/xxx/.../Microsoft.Synapse/workspaces/prod-synapse"

# Resultado:
# ✅ Azure Backup funciona (via Trusted Services)
# ✅ Synapse tiene acceso controlado (via Resource Instance)
# ⚠️ Otros servicios trusted también tienen acceso

Otros Servicios que Pueden Requerir Trusted Services

Servicio ¿Soporta Resource Instances? Notas
Azure Backup ❌ Solo vía Trusted Services Para discos no administrados
Azure Site Recovery ❌ Solo vía Trusted Services Replicación y DR
Azure Import/Export ❌ Solo vía Trusted Services Transferencia masiva de datos
Azure DevTest Labs ❌ Solo vía Trusted Services Creación de imágenes
Azure Event Grid ⚠️ Depende del escenario Algunos casos necesitan Trusted Services
Azure Synapse ✅ Soporta Resource Instances Recomendado usar Resource Instances
Azure Data Factory ✅ Soporta Resource Instances Recomendado usar Resource Instances
Azure Databricks ✅ Soporta Resource Instances Recomendado usar Resource Instances
Azure SQL Database ✅ Soporta Resource Instances Recomendado usar Resource Instances
Azure Stream Analytics ✅ Soporta Resource Instances Recomendado usar Resource Instances

Estrategia Recomendada con Azure Backup

Si necesitas usar Azure Backup pero quieres mantener la máxima seguridad:

  1. Evalúa si realmente necesitas Trusted Services

    # ¿Usas discos no administrados?
    Get-AzVM | Where-Object {$_.StorageProfile.OsDisk.ManagedDisk -eq $null}
    
    # Si el resultado está vacío, NO necesitas Trusted Services para Backup
    

  2. Migra a Managed Disks si es posible

  3. Los managed disks NO requieren Trusted Services
  4. Mejor rendimiento y gestión
  5. Recomendado por Microsoft

  6. Si DEBES usar Trusted Services, documéntalo

    Storage Account: mystorageaccount
    Bypass: AzureServices
    Motivo: Azure Backup de VMs con discos no administrados
    VMs afectadas: 
      - vm-legacy-01
      - vm-legacy-02
    Plan de migración: Q2 2026
    

  7. Usa Resource Instances para todo lo demás

  8. Synapse, Data Factory, Databricks → Resource Instances
  9. Solo Azure Backup usa Trusted Services
  10. Documenta qué servicios usan cada método

Ejemplo de Configuración Real con Azure Backup

# Escenario: Necesitas Azure Backup + Synapse + Data Factory

$rgName = "myResourceGroup"
$storageAccount = "mystorageaccount"
$tenantId = "your-tenant-id"

# 1. Configurar con Trusted Services (requerido para Azure Backup)
Update-AzStorageAccountNetworkRuleSet `
    -ResourceGroupName $rgName `
    -Name $storageAccount `
    -DefaultAction Deny `
    -Bypass AzureServices,Logging,Metrics

Write-Host "✅ Trusted Services habilitado (Azure Backup)" -ForegroundColor Yellow

# 2. Agregar Resource Instances para control granular de otros servicios
# Aunque Trusted Services está habilitado, esto añade trazabilidad
$resources = @(
    "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.Synapse/workspaces/prod-synapse",
    "/subscriptions/xxx/resourceGroups/rg1/providers/Microsoft.DataFactory/factories/prod-adf"
)

foreach ($resourceId in $resources) {
    Add-AzStorageAccountNetworkRule `
        -ResourceGroupName $rgName `
        -Name $storageAccount `
        -TenantId $tenantId `
        -ResourceId $resourceId

    Write-Host "✅ Resource Instance agregada: $($resourceId.Split('/')[-1])" -ForegroundColor Green
}

# 3. Documentar en tags
$tags = @{
    "FirewallConfig" = "TrustedServices+ResourceInstances"
    "TrustedServicesReason" = "Azure Backup - Unmanaged Disks"
    "MigrationPlan" = "Move to Managed Disks by Q2-2026"
}

Update-AzStorageAccount `
    -ResourceGroupName $rgName `
    -Name $storageAccount `
    -Tag $tags

Write-Host "✅ Configuración documentada en tags" -ForegroundColor Green

Mejora Continua

Planifica la eliminación de Trusted Services:

  1. Identifica VMs con discos no administrados
  2. Crea un plan de migración a managed disks
  3. Una vez migrado, deshabilita Trusted Services
  4. Usa solo Resource Instances para máxima seguridad

Troubleshooting

Error 403: Acceso Denegado

Si recibes errores 403, verifica en este orden:

  1. Firewall: ¿El recurso tiene una Resource Instance Rule?

    (Get-AzStorageAccountNetworkRuleSet -ResourceGroupName "rg" -Name "sa").ResourceAccessRules
    

  2. RBAC: ¿La Managed Identity tiene roles asignados?

    Get-AzRoleAssignment -ObjectId $principalId -Scope $storageScope
    

  3. Managed Identity: ¿Está habilitada?

    $workspace = Get-AzSynapseWorkspace -Name "myworkspace"
    $workspace.Identity.Type
    

  4. Tenant: ¿Ambos recursos están en el mismo tenant?

    (Get-AzResource -ResourceId $resourceId).TenantId
    

Verificar Acceso por Servicio

$ctx = New-AzStorageContext -StorageAccountName "sa" -UseConnectedAccount

# Probar Blob
try {
    Get-AzStorageContainer -Context $ctx -MaxCount 1
    Write-Host "✅ Blob: Accesible"
} catch {
    Write-Host "❌ Blob: $($_.Exception.Message)"
}

# Probar Queue
try {
    Get-AzStorageQueue -Context $ctx | Select-Object -First 1
    Write-Host "✅ Queue: Accesible"
} catch {
    Write-Host "❌ Queue: $($_.Exception.Message)"
}

Cuándo Usar Private Endpoints

Considera usar Private Endpoints en lugar de o además de las configuraciones de firewall cuando:

  • ✅ Necesitas cumplimiento estricto de compliance
  • ✅ No quieres exponer endpoints públicos en absoluto
  • ✅ Requieres conectividad desde On-Premises vía ExpressRoute
  • ✅ La latencia es crítica y necesitas tráfico privado
  • ✅ Presupuesto disponible (hay costos adicionales)

La configuración con Resource Instances es suficiente cuando:

  • ✅ Los recursos están en Azure (no on-premises)
  • ✅ El endpoint público con firewall es aceptable
  • ✅ Quieres balancear seguridad y costos
  • ✅ No hay requisitos de red privada obligatorios

Conclusión

La seguridad de Azure Storage Account requiere una configuración cuidadosa del firewall. Las principales conclusiones son:

  1. Resource Instances > Trusted Services para control granular
  2. Siempre habilita Logging y Metrics para observabilidad
  3. Combina Firewall + RBAC para defensa en profundidad
  4. Un firewall protege todos los servicios (Blob, Files, Queue, Table)
  5. Sin Private Endpoints, usa Resource Instances como mejor práctica
  6. Azure Backup requiere Trusted Services para discos no administrados (considera migrar a managed disks)

Configuración Resumida Óptima

# La configuración perfecta para producción sin Private Endpoints
Update-AzStorageAccountNetworkRuleSet `
    -DefaultAction Deny `
    -Bypass Logging,Metrics  # NO AzureServices

# Agregar solo recursos específicos necesarios
Add-AzStorageAccountNetworkRule -ResourceId $specificResourceId

# Asignar roles RBAC mínimos necesarios
New-AzRoleAssignment -ObjectId $principalId -RoleDefinitionName "Storage Blob Data Reader"
# Si necesitas Azure Backup para discos no administrados
Update-AzStorageAccountNetworkRuleSet `
    -DefaultAction Deny `
    -Bypass AzureServices,Logging,Metrics  # Requerido para Azure Backup

# Agregar Resource Instances para trazabilidad de otros servicios
Add-AzStorageAccountNetworkRule -ResourceId $specificResourceId

# Asignar roles RBAC
New-AzRoleAssignment -ObjectId $principalId -RoleDefinitionName "Storage Blob Data Reader"

# Documentar y planificar migración a Managed Disks

Referencias


¿Necesitas ayuda?

Si tienes dudas sobre la configuración de seguridad de tu Storage Account, revisa la documentación oficial o abre un caso de soporte con Microsoft Azure.