{
  "schemaVersion": 1,
  "id": "vault-kv-access-revocation-expiry-20260913",
  "title": "Comprobación propia: acceso y revocación en Vault KV",
  "productId": "vault",
  "product": "HashiCorp Vault",
  "version": "Vault v1.21.3 (f4f0f4eb7f467bbc99ec89121e1d1ad9c3d78558)",
  "observedAt": "2026-09-13T03:10:04.090798+00:00",
  "status": "observed_own_lab",
  "summary": "En un laboratorio local de Vault 1.21.3, una política limitada permitió leer un secreto KV autorizado y rechazó otra ruta y la escritura. Tras revocar el token, y tras dejar caducar otro con TTL solicitado de dos segundos, nuevas lecturas devolvieron HTTP 403. Eso describe este ensayo, no Vault en producción.",
  "caution": "Revocar o dejar caducar el token impidió nuevas lecturas KV con ese token. No retiró el valor sintético ya leído ni prueba qué ocurre con una credencial en el sistema destino o con una sesión que ya estaba abierta.",
  "environment": {
    "mode": "Servidor de desarrollo aislado, ligado a loopback y en memoria",
    "operatingSystem": "Linux",
    "architecture": "aarch64",
    "data": "Dos valores sintéticos sin credenciales ni sistemas de producción"
  },
  "reproduction": {
    "scriptPath": "reproducir-vault-kv.py",
    "scriptSha256": "62f37110001460f6fbe192499cf7ee6f55935879b9c3943c14ba3332b565fda9",
    "binarySha256": "6cd5bd62dfd52bd54e79e0c6afa683a4e38d899524fd6d28dd1c88f89effddd7",
    "distributorArchiveUrl": "https://releases.hashicorp.com/vault/1.21.3/vault_1.21.3_linux_arm64.zip",
    "distributorArchiveSha256": "9aa275c7de486413a414f62201090762245723f9ec8620a3ad1c49699a9c35a2",
    "provenanceLimit": "La suma del archivo se contrastó con SHA256SUMS obtenido por HTTPS; la firma no se verificó de forma independiente.",
    "command": "python3 reproducir-vault-kv.py --vault-binary /ruta/al/binario/vault --output resultado.json"
  },
  "runs": [
    {
      "observedAt": "2026-09-06T21:31:40.095526+00:00",
      "reportSha256": "c35d42803ada0070747f79d83d5ec3bb8c8708c1cff6f96e377f57fc886f21a0",
      "checksPassed": 12,
      "checksTotal": 12,
      "scriptSha256Recorded": null
    },
    {
      "observedAt": "2026-09-06T21:41:30.080912+00:00",
      "reportSha256": "c90ec178c7fbd659ca3ace62a6d6677a10508dbb39c5752f66467764324ae40a",
      "checksPassed": 12,
      "checksTotal": 12,
      "scriptSha256Recorded": "62f37110001460f6fbe192499cf7ee6f55935879b9c3943c14ba3332b565fda9"
    },
    {
      "observedAt": "2026-09-13T03:10:04.090798+00:00",
      "reportSha256": "ac6c7ca1a499eedc710612561705747269be0c48c81e5da0fc41a202f516fc3c",
      "checksPassed": 12,
      "checksTotal": 12,
      "scriptSha256Recorded": "62f37110001460f6fbe192499cf7ee6f55935879b9c3943c14ba3332b565fda9"
    }
  ],
  "expiryObservation": {
    "requestedTtlSeconds": 2,
    "issuedTtlSeconds": 2,
    "secondsFromIssueResponseToDeniedRead": 3.001954,
    "limit": "El intervalo acota cuándo se observó el rechazo; no establece el instante exacto de caducidad."
  },
  "checks": [
    {
      "id": "seed_allowed",
      "label": "Preparar la ruta KV permitida",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "seed_other",
      "label": "Preparar otra ruta KV",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "install_scoped_policy",
      "label": "Instalar la política limitada",
      "expectedHttpStatus": 204,
      "observedHttpStatus": 204,
      "passed": true
    },
    {
      "id": "issue_reader",
      "label": "Emitir un token lector no renovable",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "allowed_read",
      "label": "Leer la ruta permitida",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "other_path_denied",
      "label": "Intentar leer otra ruta",
      "expectedHttpStatus": 403,
      "observedHttpStatus": 403,
      "passed": true
    },
    {
      "id": "write_denied",
      "label": "Intentar escribir en la ruta permitida",
      "expectedHttpStatus": 403,
      "observedHttpStatus": 403,
      "passed": true
    },
    {
      "id": "revoke_reader",
      "label": "Revocar el token lector",
      "expectedHttpStatus": 204,
      "observedHttpStatus": 204,
      "passed": true
    },
    {
      "id": "read_after_revocation_denied",
      "label": "Leer con el token ya revocado",
      "expectedHttpStatus": 403,
      "observedHttpStatus": 403,
      "passed": true
    },
    {
      "id": "issue_short_lived_reader",
      "label": "Emitir un token con TTL solicitado de 2 segundos",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "read_before_expiry",
      "label": "Leer antes del vencimiento",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "read_after_expiry_denied",
      "label": "Leer después del intervalo de caducidad",
      "expectedHttpStatus": 403,
      "observedHttpStatus": 403,
      "passed": true
    }
  ],
  "relatedOperationIds": [
    "stored-secret"
  ],
  "relatedCriterionIds": [
    "access",
    "lifetime",
    "permissions"
  ],
  "limits": [
    "Es una única configuración local en modo de desarrollo; no es un despliegue de producción ni una certificación de seguridad.",
    "Prueba acceso, caducidad y revocación de tokens frente a secretos KV almacenados; no prueba generación de credenciales dinámicas de base de datos, AppRole ni WIF de plugins.",
    "No mide auditoría, disponibilidad, rendimiento, integración cloud, licencias ni soporte.",
    "No compara Vault con otras alternativas y no demuestra superioridad, compatibilidad o idoneidad para un caso real."
  ]
}
