Azure Key Vault para IA: objetos, SDK, rotación y caché
Volver a la ruta AI-200
AI-200Capítulo 21

Preparación para la Certificación Microsoft AI-200

Azure Key Vault para IA: objetos, SDK, rotación y caché

Centraliza secretos, claves y certificados, autentica sin credenciales almacenadas, recupera y versiona secretos con el SDK de Python, rótalos sin interrupción y usa caché con actualización controlada.

Tiempo de estudio sugerido: 125 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio Python guiado

Escudo neón Microsoft Certified AI-200 para secretos de Azure Key Vault, SDK, versiones, rotación y caché

1. Escenario y objetivos de aprendizaje

Una canalización RAG crea incrustaciones con , lee vectores de y escribe documentos procesados en . Desarrollo, preproducción y producción usan credenciales distintas. Guardar cadenas de conexión y claves de en archivos incorporados al repositorio expone los valores, mientras que rotar mediante una nueva implementación dificulta responder a un compromiso en cuatro horas sin interrupción.

  • Elegir el objeto correcto de para un secreto, una clave criptográfica o un certificado.
  • Autenticar con y autorizar con de y privilegio mínimo.
  • Recuperar valores y con clientes síncronos o asíncronos del de Python.
  • Usar versiones, rotación, reintentos e invalidación de caché para transiciones seguras.
  • Reducir llamadas al almacén sin prolongar una credencial comprometida.

Resumen rápido

El diseño sustituye credenciales en código por un almacén central auditado e incorpora rotación, transición y vigencia de caché a la arquitectura.

2. Capacidades, niveles e interfaces de

almacena secretos, claves y certificados y cifra los . autentica y de autoriza. Las aplicaciones pueden usar , CLI de , portal o para Python, .NET, Java, JavaScript y Go.

Elección de protección
OpciónProtección de clavesUso recomendado
Standard y curva elíptica por software; validación 140-2 Nivel 1Secretos y cargas con claves de software
PremiumAgrega claves ; las versiones nuevas usan la plataforma 140-3 Nivel 3Políticas o cargas reguladas que exigen material en
administradoRecurso separado que solo almacena claves Administración dedicada o a gran escala; no almacena secretos ni certificados
Azure Key Vault organiza secretos, claves y certificados con protección Standard y Premium
El objeto define operaciones y ciclo de vida; el nivel define la protección del material criptográfico.

Resumen rápido

Los almacenes guardan tres objetos; Standard y Premium difieren sobre todo en la protección de claves, mientras administrado es independiente y solo para claves.

3. Secretos: valores opacos con

Un secreto es una cadena opaca de hasta 25 KB para claves de , contraseñas, , cadenas de conexión, claves SSH privadas o credenciales compuestas pequeñas. El servicio no interpreta el valor. content_type, propiedades de versión y etiquetas describen formato, propietario, entorno y rotación.

No convierta en base de configuración o contenido. Los puntos de conexión, nombres de servicio y marcas de características pertenecen a ; las cargas grandes, a con cifrado. Las etiquetas son visibles para quien lista y nunca deben contener credenciales.

Resumen rápido

Los secretos son cadenas sensibles pequeñas; los los describen, pero la configuración normal y el contenido grande se guardan en otros servicios.

4. Claves: criptografía sin exportar el material

Las claves realizan cifrado, descifrado, firma, verificación y encapsulado. Las operaciones del servidor mantienen la clave privada dentro del límite del servicio. por software admite 2048, 3072 y 4096 bits; EC admite P-256, P-384, P-521 y secp256k1/P-256K. Premium agrega variantes . Las claves simétricas oct- siguen en .

Elija una clave, no un secreto, cuando otro servicio necesite una clave administrada por el cliente, cuando la aplicación deba firmar o encapsular remotamente o cuando la directiva exija material no exportable.

Resumen rápido

Una clave ofrece operaciones criptográficas controladas sin exponer su material privado protegido.

5. Certificados y objetos de clave y secreto vinculados

Un certificado de administra y su clave privada, incluida emisión, renovación, revocación e integración con autoridades para o mutuo. Crear o importar un certificado también crea una clave y una representación de secreto, por lo que leer la clave privada exige un rol cuidadosamente elegido.

Use el objeto certificado para credenciales con ciclo de vida en lugar de almacenar un paquete como secreto arbitrario. Así conserva directiva, emisor, renovación y versiones.

Resumen rápido

Los certificados agregan ciclo de vida y crean objetos relacionados; el acceso a la clave privada debe restringirse.

6. Límites del almacén, nombres y etiquetas

Un límite práctico es un almacén por aplicación, región y entorno. Separar desarrollo, preproducción y producción reduce el y simplifica roles. Una identidad comprometida en desarrollo no debe descubrir credenciales de producción.

  • El nombre del almacén es globalmente único, tiene 3–24 caracteres, empieza con letra, termina con letra o dígito, acepta alfanuméricos y guiones y prohíbe guiones consecutivos.
  • Use nombres descriptivos como cosmosdb-connection-string y openai--key.
  • Cada secreto admite hasta 15 etiquetas; los límites actuales son 512 caracteres en nombre y 256 en valor.
  • Entorno, equipo, aplicación, rotación y clasificación son etiquetas útiles; el valor secreto nunca lo es.

Resumen rápido

Almacenes separados crean límites de seguridad; nombres coherentes y etiquetas no sensibles hacen operable el inventario.

7. de , plano de control y plano de datos

El plano de control crea y configura el recurso mediante . El plano de datos lee y cambia objetos en el punto de conexión del almacén. Contributor administra el recurso, pero no lee valores del plano de datos.

Roles integrados representativos
RolUso apropiado
Secrets UserLeer valores, incluida la parte secreta de un certificado con clave privada; para aplicaciones en ejecución
Secrets OfficerAdministrar todo el ciclo de secretos excepto permisos; para operadores o automatización controlada
ReaderLeer sin valores sensibles ni material de clave
AdministratorTodas las operaciones del plano de datos; no administra el recurso ni asignaciones
ContributorSolo administrar el recurso en el plano de control; sin acceso a datos

Prefiera de a las directivas heredadas, asigne en el ámbito del almacén, use para administración just-in-time y evite concesiones amplias. Las versiones actuales de la establecen como modelo predeterminado en almacenes nuevos.

Resumen rápido

La identidad autentica; el rol del plano de datos autoriza operaciones, y Contributor del plano de control no lee secretos.

8. y cadena actual de credenciales

Una permite autenticar , , , y otros recursos sin . Asigne Secrets User si la aplicación solo lee en tiempo de ejecución.

DefaultAzureCredential permite el mismo código local y en . La cadena actual de Python puede intentar Environment, Workload Identity, , Shared , , CLI de , , Developer CLI, navegador interactivo opcional y broker. La cadena cambia entre versiones. En producción, Microsoft recomienda comprender el requisito y considerar ManagedIdentityCredential para reducir ambigüedad y sobrecarga.

Una identidad administrada se autentica con Microsoft Entra ID y recibe un rol del plano de datos antes de leer Azure Key Vault
La identidad indica quién llama; de indica qué puede hacer en el almacén.

Resumen rápido

La elimina credenciales almacenadas; DefaultAzureCredential une entornos, pero la cadena de producción debe ser explícita y observable.

9. Eliminación temporal, protección de purga y recuperación

La eliminación temporal está habilitada de forma predeterminada y no puede desactivarse después. Los almacenes y objetos permanecen recuperables durante 7–90 días, configurados al crear el almacén, con 90 como valor predeterminado. El período no cambia después.

La protección de purga es opcional pero muy recomendada en producción. Cuando está habilitada, ni un principal privilegiado elimina permanentemente antes del de retención. Recuperar un almacén no restaura asignaciones ni suscripciones de ; el runbook debe recrearlas.

Resumen rápido

La eliminación temporal crea la ventana, la protección de purga la impone y la recuperación aún requiere reconstruir roles y suscripciones.

10. Instalar el de Python y crear SecretClient

-keyvault-secrets proporciona SecretClient y -identity las credenciales. La es ://<vault-name>.vault..net/. Cree credencial y cliente una vez y reutilícelos para conservar cachés de y conexiones .

pip install azure-identity azure-keyvault-secrets

az keyvault show --name <vault-name> --query properties.vaultUri

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

credential = DefaultAzureCredential()
client = SecretClient(
    vault_url="https://<vault-name>.vault.azure.net/",
    credential=credential,
)

client.set_secret(
    "openai-api-key",
    "<secret-value>",
    content_type="text/plain",
    tags={"environment": "production", "owner": "ai-platform"},
)

Resumen rápido

Instale identidad y secretos, cree un SecretClient reutilizable y sin contraseña y nunca registre el valor almacenado.

11. Recuperar valores, e inventarios con seguridad

get_secret(nombre) sin versión devuelve la versión habilitada más reciente. KeyVaultSecret contiene value y propiedades de versión, creación, expiración, estado, tipo y etiquetas. Registre solo nombre y versión.

list_properties_of_secrets() enumera sin recuperar valores. Es útil para inventario y validación al iniciar, antes de aceptar tráfico.

from azure.core.exceptions import (
    HttpResponseError, ResourceNotFoundError, ServiceRequestError
)

def read_secret(client: SecretClient, name: str) -> str:
    try:
        secret = client.get_secret(name)  # latest enabled version
        print(f"Loaded {name}, version={secret.properties.version}")
        return secret.value
    except ResourceNotFoundError as exc:
        raise RuntimeError(f"Missing secret: {name}") from exc
    except HttpResponseError as exc:
        raise RuntimeError(f"Key Vault rejected {name}: {exc.status_code}") from exc
    except ServiceRequestError as exc:
        raise RuntimeError("Network path to Key Vault failed") from exc

for props in client.list_properties_of_secrets():
    print(props.name, props.enabled, props.content_type, props.tags)

Resumen rápido

get_secret lee un valor; la lista de propiedades descubre y valida objetos sin revelar su contenido.

12. Excepciones, acceso asíncrono y vida del cliente

ResourceNotFoundError suele indicar nombre o almacén incorrecto. HttpResponseError cubre autenticación, autorización, limitación y otras respuestas. ServiceRequestError indica transporte, , tiempo de espera o conectividad. Clasifique antes de reintentar para no amplificar fallos permanentes.

El cliente aio evita bloquear el bucle de eventos de FastAPI o aiohttp. Cliente y credencial son administradores de contexto asíncronos. En un servicio web, créelos al iniciar, reutilice entre solicitudes y ciérrelos al detener.

from azure.identity.aio import DefaultAzureCredential
from azure.keyvault.secrets.aio import SecretClient

async def load_runtime_secret() -> str:
    async with DefaultAzureCredential() as credential:
        async with SecretClient(
            vault_url="https://<vault-name>.vault.azure.net/",
            credential=credential,
        ) as client:
            secret = await client.get_secret("openai-api-key")
            return secret.value

# In a web service, create and reuse one client during app startup,
# then close the client and credential during app shutdown.

Resumen rápido

Diferencie ausencia, rechazo y transporte; las aplicaciones asíncronas deben reutilizar un cliente y cerrarlo correctamente.

13. Versiones, expiración, auditoría y reversión

Cada set_secret con el mismo nombre crea un identificador inmutable, sin sobrescribir el anterior. La lectura sin versión devuelve la habilitada más reciente; una lectura versionada recupera el valor histórico exacto. La lista de versiones muestra creación, expiración y estado para auditoría y .

expires_on es una señal de ciclo de vida, no un bloqueo rígido: el secreto expirado aún puede recuperarse. Combine expiración, supervisión y automatización, y deshabilite la versión antigua solo cuando todas las instancias hayan migrado.

from datetime import datetime, timedelta, timezone

created = client.set_secret(
    "cosmosdb-connection-string",
    "<new-value>",
    expires_on=datetime.now(timezone.utc) + timedelta(days=90),
    tags={"rotation-policy": "90-days", "service": "cosmos-db"},
)

latest = client.get_secret("cosmosdb-connection-string")
exact = client.get_secret("cosmosdb-connection-string", created.properties.version)

for version in client.list_properties_of_secret_versions("cosmosdb-connection-string"):
    print(version.version, version.created_on, version.expires_on, version.enabled)

# Disable the previous version only after every instance has moved.
client.update_secret_properties(
    "cosmosdb-connection-string", "<old-version>", enabled=False
)

Resumen rápido

Las versiones permiten coexistencia; la expiración inicia operaciones y la deshabilitación termina el uso tras implementación o ventana de reversión.

14. Rotación manual, con y credencial doble

Estrategias
EstrategiaFlujoUso recomendado
Manual o CI/CDCrear en el servicio destino, publicar nueva versión y señalar o reiniciarCredenciales externas que cambian poco
Controlada por eventosSecretNearExpiry ocurre 30 días antes; Function o Logic App crea en destino y guarda versiónCredenciales repetibles con de rotación
Credencial dobleCrear/regenerar secundaria, publicar, esperar instancias y regenerar primaria antigua o con dos claves activas
  1. Cree la credencial en el servicio destino.
  2. Guárdela como nueva versión.
  3. Invalide cachés o notifique instancias.
  4. Confirme la adopción.
  5. Deshabilite o regenere la anterior y guarde evidencias.

Microsoft.KeyVault.SecretNewVersionCreated, SecretNearExpiry y SecretExpired son eventos actuales. La expiración o notificación no rota por sí sola una credencial externa; el controlador coordina servicio y almacén.

Resumen rápido

La capacidad del servicio destino define la estrategia; crear una versión es solo una etapa de la rotación completa.

15. Transición sin interrupción y actualización tras fallo

Durante la rotación, distintas instancias pueden conservar valores de caché diferentes. La aplicación llama con la credencial actual, interpreta un rechazo de autenticación como posible rotación, recupera la versión habilitada más reciente y reintenta una sola vez. Así evita bucles y limita la lectura adicional al período de transición.

from azure.core.exceptions import HttpResponseError

def call_with_rotation_refresh(client, cache, name, downstream_call):
    value = cache.get(name)
    try:
        return downstream_call(value)
    except AuthenticationError:
        # One refresh and one retry: do not create an infinite loop.
        fresh = client.get_secret(name).value
        cache.put(name, fresh)
        return downstream_call(fresh)
Una versión nueva invalida la caché mediante Cuadrícula de Eventos y un fallo de autenticación fuerza una actualización única
es el límite de respaldo; eventos y actualización por fallo acortan la transición sin consultar el almacén en cada solicitud.

Resumen rápido

Mantenga versiones válidas durante el despliegue, actualice una vez ante fallo, observe convergencia y revoque al final.

16. Caché temporal, ámbito y presupuesto de vigencia

Una llamada remota tarda decenas de milisegundos y la memoria local microsegundos. Leer en cada solicitud aumenta latencia y puede alcanzar límites. Un con reloj monotónico evita que ajustes del reloj alteren la edad.

import time

class SecretCache:
    def __init__(self, client: SecretClient, ttl_seconds: int = 900):
        self.client = client
        self.ttl = ttl_seconds
        self.values: dict[str, tuple[str, float]] = {}

    def get(self, name: str) -> str:
        value = self.values.get(name)
        now = time.monotonic()
        if value and now - value[1] < self.ttl:
            return value[0]
        secret = self.client.get_secret(name)
        self.values[name] = (secret.value, now)
        return secret.value

    def invalidate(self, name: str) -> None:
        self.values.pop(name, None)
Ámbito
ÁmbitoVentajaCompromiso
Por procesoSimple y rápido; inicio recomendadoLas llamadas crecen con réplicas y cada proceso tiene su ventana
Caché distribuida, como Una actualización sirve a muchas instanciasAgrega operación y otra ubicación protegida
Precarga al inicioSin lectura en solicitudes y valida nombres tempranoNecesita actualización periódica o por evento

Defina según obsolescencia admitida: 5–15 minutos más para rotación frecuente, 30–60 minutos para cambios mensuales o trimestrales y precarga con actualización cada horas para valores estáticos. Ante compromiso, invalide o reinicie inmediatamente.

Resumen rápido

Empiece con memoria, derive de la vigencia permitida y asocie un mecanismo explícito de actualización.

17. Invalidación, límites, y laboratorio guiado

Suscríbase a Microsoft.KeyVault.SecretNewVersionCreated y enrute mediante , o . Valide origen y tipo y quite solo el secreto indicado. Conserve como respaldo.

Los límites actuales por almacén, región y 10 segundos permiten 4000 transacciones restantes; CREATE secret, IMPORT certificate e IMPORT key comparten 300 escrituras. La suscripción agrega cinco veces el límite. Ante 429, use exponencial con jitter. Respuestas persistentes indican falta de caché, corto o estampida de despliegue; escalone inicios y reutilice clientes.

Laboratorio Flask guiado

  1. Cree o elija un almacén con , eliminación temporal y protección de purga; use Secrets Officer para desarrollo y Secrets User para la aplicación.
  2. Descargue o clone un proyecto inicial Flask, ábralo en , cree un entorno Python 3.12+, instale -identity, -keyvault-secrets y Flask e inicie sesión con la versión más reciente de CLI de y az login.
  3. Complete la aplicación inicial con SecretClient, guarde secretos con tipo y etiquetas e imprima solo nombres, versiones y .
  4. Ejecute las operaciones: liste propiedades, lea un valor, cree otra versión y confirme la lectura sin versión.
  5. Agregue caché de 15 minutos, lea repetidamente, rote, invalide y confirme el valor nuevo.
  6. Pruebe las tres excepciones y registros de 429 sin imprimir secretos.
  7. Elimine recursos y asignaciones del laboratorio.

Resumen rápido

Los eventos aceleran la vigencia, cubre notificaciones perdidas, los límites favorecen caché y el laboratorio valida el ciclo completo.

18. Revisión de evaluación, lista final y referencias

Decisiones de evaluación
PreguntaMejor respuestaMotivo
La aplicación solo lee valores Secrets UserLectura sin administrar el ciclo
Mismo código con CLI local e identidad en producciónDefaultAzureCredentialLa cadena une entornos
get_secret(nombre) sin versiónVersión habilitada más recienteLa sin versión sigue el valor actual
El servicio admite dos clavesRotación de credencial dobleSiempre permanece una válida
500 solicitudes/s y rotación cada 90 díasCaché en memoria con de una horaElimina lectura por solicitud y limita obsolescencia

Lista de comprobación final

  • Separe almacén por aplicación, región y entorno.
  • Elija el objeto por sus operaciones.
  • Use y mínimo.
  • Habilite protección de purga y documente recuperación.
  • Reutilice SecretClient y nunca registre valores.
  • Trate destino, versión, caché y revocación como un flujo.
  • Use , y una actualización tras fallo.
  • Supervise acceso, expiración, 429, finalización y deshabilitación.
  1. ¿Qué es ?
  2. de para
  3. Eliminación temporal de
  4. Inicio rápido del cliente Python
  5. Cadena DefaultAzureCredential
  6. Eventos de
  7. Protección de secretos
  8. Límites de
  9. Guía de limitación

Resumen rápido

La solución completa alinea objeto, identidad, , recuperación, , versiones, rotación, caché, límites y supervisión en un diseño auditable.