Skip to content

2026/03

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

Defender for Storage: remediación automática de malware en GA y escaneo bajo demanda para Azure Files

Resumen

El 31 de marzo de 2026, Defender for Storage alcanza GA en dos funcionalidades de alto impacto: automated malware remediation (eliminación automática de blobs infectados en Blob Storage) y on-demand malware scanning para Azure Files en preview. Si tienes flujos de upload de ficheros de usuario o compartición de ficheros en Azure, estas novedades reducen el tiempo de exposición ante ficheros maliciosos de horas a minutos.

¿Qué es Defender for Storage?

Defender for Storage analiza el contenido subido a cuentas de Azure Storage en busca de malware, datos sensibles y anomalías de acceso. Hasta ahora, cuando detectaba malware, generaba una alerta pero no tomaba acción automática: el blob infectado permanecía en el storage hasta que alguien lo eliminaba manualmente.

Automated Malware Remediation (GA)

Con esta funcionalidad en GA, cuando se detecta un blob infectado:

  1. Defender for Storage genera la alerta habitual
  2. Automáticamente mueve o elimina el blob infectado según la configuración
  3. Escribe un log del evento con hash del fichero, contenedor de origen y acción tomada
sequenceDiagram
    participant U as Usuario/App
    participant S as Azure Blob Storage
    participant D as Defender for Storage
    participant Q as Quarantine Container

    U->>S: Upload fichero
    S->>D: Notificación de nuevo blob
    D->>D: Análisis antimalware
    alt Limpio
        D-->>S: OK - blob queda disponible
    else Infectado
        D->>Q: Mover blob a cuarentena
        D-->>S: Blob eliminado del contenedor original
        D->>D: Alerta + log de evento
    end

Configurar automated remediation

Desde el portal: Defender for Cloud → Environment settings → [Storage account] → Malware scanning → Remediation action

O vía ARM/Bicep:

resource storageDefender 'Microsoft.Security/defenderForStorageSettings@2022-12-01-preview' = {
  name: 'current'
  scope: storageAccount
  properties: {
    isEnabled: true
    malwareScanning: {
      onUploadIsEnabled: true
      sensitiveDataDiscovery: {
        isEnabled: true
      }
    }
    overrideSubscriptionLevelSettings: true
  }
}

Para la acción de remediación automática, configura la Event Grid subscription que Defender for Storage usa internamente:

# La acción de remediación se configura en el portal de Defender for Cloud
# Settings > Malware scanning > On detection: Delete / Move to quarantine

Note

El contenedor de cuarentena se crea automáticamente si no existe. Por defecto se llama malware-scan-results en la misma cuenta de storage.

On-demand Malware Scanning para Azure Files (Preview)

Azure Files (SMB y NFS) ahora puede analizarse bajo demanda. Esto cubre el caso de uso de:

  • Comparticiones de ficheros legados que ya tenían contenido antes de habilitar Defender
  • Auditorías periódicas de storage compartido
  • Respuesta a incidentes para escanear una compartición sospechosa

Iniciar un escaneo bajo demanda

# Via Azure CLI (preview extension)
az security storage malware-scan trigger \
  --resource-group myRG \
  --storage-account myStorageAccount \
  --share-name myFileShare

O desde el portal: Storage account → Microsoft Defender for Cloud → Scan now

Revisar resultados

# Los resultados aparecen en Log Analytics si tienes Diagnostic Settings configurado
# Query KQL
AzureDiagnostics
| where Category == "StorageMalwareScan"
| where OperationName == "ScanCompleted"
| project TimeGenerated, ResourceId, ResultType, FilePath, ThreatName
| sort by TimeGenerated desc

Consideraciones de coste

Defender for Storage cobra por:

  • Transacciones analizadas (on-upload scanning): tarifa por millón de transacciones
  • GB escaneados (on-demand scan): tarifa por GB analizado

Warning

Para cuentas de storage con alto volumen de uploads (por ejemplo, pipelines de datos o ingestas masivas), revisa el coste estimado antes de habilitar on-upload scanning en todas las cuentas. Considera habilitarlo solo en las cuentas que reciben ficheros de origen externo o no confiable.

Buenas prácticas

  • Configura el contenedor de cuarentena con acceso restringido: solo los admins de seguridad deben poder acceder a los ficheros en cuarentena para análisis forense.
  • Integra las alertas de Defender for Storage con Microsoft Sentinel para correlacionar con otros eventos de seguridad.
  • Para Azure Files, programa escaneos bajo demanda periódicos en comparticiones de acceso externo o compartido entre equipos.

Referencias

Defender for Cloud: Code to Runtime, visibilidad de la cadena SDLC hasta producción

Resumen

El 10 de marzo de 2026, Defender for Cloud lanzó en preview Code to Runtime enrichment, una funcionalidad que conecta una vulnerabilidad encontrada en código fuente o imagen de contenedor con su radio de explosión en producción: qué recursos del cluster están expuestos, qué identidades pueden acceder a ellos y qué flujos de red están activos. Está diseñada para que los equipos de seguridad prioricen remediaciones no por criticidad CVSS, sino por impacto real.

¿Qué problema resuelve?

Un scanner de imágenes puede generar cientos de CVEs por semana. Sin contexto de producción, es imposible decidir cuáles parchear primero.

Code to Runtime enrichment responde a:

  • ¿Este CVE está en un contenedor que está realmente corriendo en producción?
  • ¿Ese pod tiene permisos de RBAC para acceder a secrets o APIs críticas?
  • ¿Hay tráfico de red real hacia ese pod desde internet?
flowchart LR
    A["Repositorio
    de código"] -->|Scan SAST| B["CVE en librería"]
    B -->|Enriquecimiento| C["¿Imagen desplegada
    en producción?"]
    C -->|Sí| D["Pod en AKS"]
    D --> E["Permisos RBAC
    del pod"]
    D --> F["Tráfico de red
    hacia el pod"]
    D --> G["Datos accesibles
    desde el pod"]
    E & F & G --> H["Blast radius score"]
    H --> I["Prioridad de remediación"]

Fuentes de datos que correlaciona

Fuente Qué aporta
GitHub Advanced Security / Azure DevOps CVEs en código fuente, SAST findings
Defender for Containers CVEs en imágenes, configuraciones en runtime
AKS RBAC Permisos del service account del pod
Network policies / NSG flow logs Tráfico real hacia/desde el pod
Azure Resource Graph Recursos accesibles desde el namespace

Requisitos para habilitar la funcionalidad

  • Defender for Containers habilitado (plan Standard)
  • Defender for DevOps conectado a al menos un repositorio (GitHub o Azure DevOps)
  • AKS con el agente de Defender instalado
# Verificar que el agente de Defender está instalado en AKS
kubectl get daemonset -n kube-system | grep defender

# Habilitar Defender for DevOps (requiere conexión al repositorio desde el portal)
az security connector create \
  --name my-github-connector \
  --resource-group myRG \
  --hierarchy-identifier <github-org-id> \
  --environment-name GitHub

Cómo usar Code to Runtime en la práctica

Desde Defender for Cloud → Recommendations → Code to Runtime insights:

  1. Selecciona un CVE de alta criticidad
  2. Observa el panel Runtime context: te muestra si hay pods afectados en producción
  3. Revisa Blast radius: identidades, secretos y endpoints accesibles desde el pod vulnerable
  4. Exporta el path completo para el equipo de desarrollo con contexto de priorización

Consulta KQL en Microsoft Sentinel (si integrado)

SecurityRecommendation
| where RecommendationName contains "Code to Runtime"
| extend BlastRadius = tostring(Properties["blastRadiusScore"])
| where toint(BlastRadius) > 70
| project TimeGenerated, AffectedResourceId, RecommendationName, BlastRadius
| sort by BlastRadius desc

Limitaciones en preview

  • Actualmente cubre AKS únicamente (no otros runtimes de contenedores)
  • La correlación con código fuente requiere que el repositorio esté conectado a Defender for DevOps
  • No hay SLA de latencia para la actualización del blast radius cuando cambia el estado del cluster

Warning

En preview, los datos de blast radius pueden tener un retraso de hasta 4 horas respecto al estado actual del cluster. No uses estos datos para decisiones de respuesta a incidentes en tiempo real; úsalos para priorización de remediaciones planificadas.

Buenas prácticas

  • Integra Code to Runtime en tu proceso de revisión de vulnerabilidades semanal o quincenal; no como alerta en tiempo real.
  • Combina el blast radius score con el SLA de parches de tu organización para crear una matriz de priorización: CVE crítico + blast radius alto → parche urgente.
  • Usa los datos de permisos RBAC del pod para aplicar el principio de mínimo privilegio: si un pod tiene acceso a secrets que no necesita, es el momento de reducirlo.

Referencias

Azure Key Vault API 2026-02-01: RBAC como modelo de autorización por defecto

Resumen

Con la versión de API 2026-02-01 de Azure Key Vault, RBAC se convierte en el modelo de autorización por defecto para nuevas vaults. Las vaults creadas sin especificar explícitamente el modelo de acceso ya no usarán Vault Access Policies; usarán RBAC de Azure. Este cambio alinea Key Vault con el resto de servicios de Azure y simplifica la gestión de accesos, pero requiere atención si tienes scripts o plantillas de IaC que asumen el comportamiento anterior.

Vault Access Policies vs. RBAC: la diferencia clave

Aspecto Vault Access Policies Azure RBAC
Scope de asignación Solo a nivel de vault Vault, secret, key, certificate individual
Auditoría Limitada Azure Activity Log completo
Integración con Entra ID Manual Nativa (grupos, conditional access)
Compatibilidad con PIM No
Separación de responsabilidades Difícil Simple con roles built-in

Roles built-in relevantes para Key Vault

Key Vault Administrator         → Acceso completo (gestión + datos)
Key Vault Certificates Officer  → Gestión de certificados
Key Vault Crypto Officer        → Gestión de claves
Key Vault Secrets Officer       → Gestión de secrets
Key Vault Reader                → Lectura de metadatos (sin leer valores)
Key Vault Secrets User          → Leer valores de secrets
Key Vault Crypto User           → Usar claves (encrypt, decrypt, sign)

Crear una vault con RBAC (nueva API)

Con la API 2026-02-01, RBAC es el default. No es necesario especificar el parámetro enableRbacAuthorization:

az keyvault create \
  --name myVault \
  --resource-group myRG \
  --location westeurope
  # enableRbacAuthorization = true por defecto

Para crear una vault con Access Policies (modelo anterior) hay que ser explícito:

az keyvault create \
  --name myVault \
  --resource-group myRG \
  --location westeurope \
  --enable-rbac-authorization false

Migrar una vault existente de Access Policies a RBAC

flowchart LR
    A["Vault con
    Access Policies"] --> B["Inventariar
    permisos actuales"]
    B --> C["Crear role assignments
    equivalentes en RBAC"]
    C --> D["Validar acceso
    de aplicaciones"]
    D --> E["Activar RBAC
    en la vault"]
    E --> F["Vault con
    Azure RBAC"]

Paso 1: Inventariar Access Policies actuales

az keyvault show \
  --name myVault \
  --query "properties.accessPolicies[].{Object:objectId, Permissions:permissions}" \
  --output table

Paso 2: Crear role assignments equivalentes

VAULT_ID=$(az keyvault show --name myVault --query id -o tsv)

# Dar acceso a secrets a una Managed Identity
az role assignment create \
  --assignee <principal-id> \
  --role "Key Vault Secrets User" \
  --scope "$VAULT_ID"

# Acceso más restrictivo: solo a un secret específico
az role assignment create \
  --assignee <principal-id> \
  --role "Key Vault Secrets User" \
  --scope "$VAULT_ID/secrets/myDatabasePassword"

Paso 3: Activar RBAC

az keyvault update \
  --name myVault \
  --enable-rbac-authorization true

Warning

Al activar RBAC en una vault, las Access Policies existentes dejan de ser evaluadas inmediatamente. Cualquier identity que no tenga un role assignment de RBAC perderá el acceso. Realiza la migración en una ventana de mantenimiento y prueba primero en un entorno no productivo.

Actualizar templates Bicep/Terraform

Bicep

resource keyVault 'Microsoft.KeyVault/vaults@2026-02-01' = {
  name: vaultName
  location: location
  properties: {
    sku: {
      family: 'A'
      name: 'standard'
    }
    tenantId: subscription().tenantId
    enableRbacAuthorization: true  // explícito por claridad
    enableSoftDelete: true
    softDeleteRetentionInDays: 90
  }
}

Terraform

resource "azurerm_key_vault" "main" {
  name                       = var.vault_name
  resource_group_name        = var.resource_group_name
  location                   = var.location
  tenant_id                  = data.azurerm_client_config.current.tenant_id
  sku_name                   = "standard"
  enable_rbac_authorization  = true  # default en API 2026-02-01, pero explícito aquí
  soft_delete_retention_days = 90
  purge_protection_enabled   = true
}

Buenas prácticas

  • Usa el scope más restrictivo posible para los role assignments: un secret específico en lugar de toda la vault cuando sea posible.
  • Activa Privileged Identity Management (PIM) para roles con acceso a datos (Secrets Officer, Crypto Officer) y exige justificación y aprobación para activarlos.
  • Revisa periódicamente los role assignments con Microsoft Entra ID Access Reviews.

Note

Si usas Terraform con el provider azurerm y versiones anteriores a la que soporta API 2026-02-01, el parámetro enable_rbac_authorization puede seguir siendo necesario de forma explícita. Actualiza el provider a la versión más reciente.

Referencias