{
  "schemaVersion": 1,
  "id": "vault-approle-bootstrap-secret-id-token-revocation-20260919",
  "title": "Comprobación propia: arranque y revocación con Vault AppRole",
  "productId": "vault",
  "product": "HashiCorp Vault",
  "version": "Vault v1.21.3 (f4f0f4eb7f467bbc99ec89121e1d1ad9c3d78558)",
  "observedAt": "2026-09-19T09:32:44.349952+00:00",
  "status": "observed_own_lab",
  "summary": "En tres ejecuciones locales de Vault 1.21.3, RoleID y SecretID permitieron obtener un token limitado a una política de lectura. Destruir el SecretID hizo fallar un login nuevo con HTTP 400, pero el token ya emitido siguió leyendo. Tras revocarlo, la misma lectura devolvió HTTP 403. Es una observación de laboratorio, no una garantía de producción.",
  "caution": "Destruir el SecretID no revocó el token ya emitido. Esa distinción exige gobernar por separado la entrega y retirada del SecretID y la vida y revocación del token. El ensayo no prueba cómo transportar el SecretID ni retira valores ya leídos.",
  "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",
    "role": "AppRole local con token sin política default y una política de lectura para una sola ruta KV"
  },
  "documentation": [
    {
      "title": "HashiCorp Developer: AppRole auth method",
      "url": "https://developer.hashicorp.com/vault/docs/auth/approle",
      "scope": "Modelo RoleID/SecretID, propiedades de SecretID y autenticación de máquinas o aplicaciones"
    },
    {
      "title": "HashiCorp Developer: AppRole API",
      "url": "https://developer.hashicorp.com/vault/api-docs/auth/approle",
      "scope": "Endpoints de login, generación y destrucción de SecretID por accessor"
    },
    {
      "title": "HashiCorp Developer: AppRole tutorial",
      "url": "https://developer.hashicorp.com/vault/tutorials/auth-methods/approle",
      "scope": "Flujo de RoleID, SecretID, login y token sujeto a políticas"
    }
  ],
  "reproduction": {
    "scriptPath": "reproducir-vault-approle.py",
    "scriptSha256": "e6c7faf76475db9a9c7b14e7eab3d57fcd1b65b5ba4c1b2585f7c0b5c985937a",
    "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 coincide con la procedencia ya custodiada del laboratorio Vault KV; la firma no se verificó de forma independiente.",
    "command": "python3 reproducir-vault-approle.py --vault-binary /ruta/al/binario/vault --output resultado.json"
  },
  "runs": [
    {
      "observedAt": "2026-09-19T09:32:42.046453+00:00",
      "reportSha256": "6916b7cd217a41c3a6edcdfaf96248298950b72bc9e060087ebcdd7b7ef7c79b",
      "checksPassed": 15,
      "checksTotal": 15,
      "scriptSha256Recorded": "e6c7faf76475db9a9c7b14e7eab3d57fcd1b65b5ba4c1b2585f7c0b5c985937a"
    },
    {
      "observedAt": "2026-09-19T09:32:43.202209+00:00",
      "reportSha256": "794a4a7458c539b18fe7498d28ac0f1c85cc30f2c70391f5c48dc5c2f03d1e4a",
      "checksPassed": 15,
      "checksTotal": 15,
      "scriptSha256Recorded": "e6c7faf76475db9a9c7b14e7eab3d57fcd1b65b5ba4c1b2585f7c0b5c985937a"
    },
    {
      "observedAt": "2026-09-19T09:32:44.349952+00:00",
      "reportSha256": "be1ff92d34e8bc5f77e1d6dc3cb50da110ab78389d2de92099039b59e311f21e",
      "checksPassed": 15,
      "checksTotal": 15,
      "scriptSha256Recorded": "e6c7faf76475db9a9c7b14e7eab3d57fcd1b65b5ba4c1b2585f7c0b5c985937a"
    }
  ],
  "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": "enable_approle",
      "label": "Habilitar el método AppRole",
      "expectedHttpStatus": 204,
      "observedHttpStatus": 204,
      "passed": true
    },
    {
      "id": "configure_approle",
      "label": "Configurar el AppRole sin política default",
      "expectedHttpStatus": 204,
      "observedHttpStatus": 204,
      "passed": true
    },
    {
      "id": "read_role_id",
      "label": "Obtener el RoleID del rol",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "issue_secret_id",
      "label": "Generar un SecretID",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "login_with_approle",
      "label": "Iniciar sesión con RoleID y SecretID",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "allowed_read",
      "label": "Leer la ruta autorizada con el token emitido",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "other_path_denied",
      "label": "Intentar leer una ruta fuera de la política",
      "expectedHttpStatus": 403,
      "observedHttpStatus": 403,
      "passed": true
    },
    {
      "id": "destroy_secret_id",
      "label": "Destruir el SecretID por accessor",
      "expectedHttpStatus": 204,
      "observedHttpStatus": 204,
      "passed": true
    },
    {
      "id": "login_after_secret_id_destroyed_denied",
      "label": "Reintentar el login con el SecretID destruido",
      "expectedHttpStatus": 400,
      "observedHttpStatus": 400,
      "passed": true
    },
    {
      "id": "issued_token_still_reads",
      "label": "Leer con el token ya emitido después de destruir el SecretID",
      "expectedHttpStatus": 200,
      "observedHttpStatus": 200,
      "passed": true
    },
    {
      "id": "revoke_issued_token",
      "label": "Revocar el token ya emitido",
      "expectedHttpStatus": 204,
      "observedHttpStatus": 204,
      "passed": true
    },
    {
      "id": "read_after_token_revocation_denied",
      "label": "Leer con el token revocado",
      "expectedHttpStatus": 403,
      "observedHttpStatus": 403,
      "passed": true
    }
  ],
  "relatedOperationIds": [
    "stored-secret"
  ],
  "relatedCriterionIds": [
    "access",
    "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.",
    "No prueba la entrega protegida del SecretID, response wrapping, SecretID de usos limitados ni la renovación del token.",
    "Revocar el token impidió nuevas llamadas con ese token; no retiró valores ya leídos ni prueba qué ocurre con una sesión abierta en otro sistema.",
    "No prueba TLS, alta disponibilidad, namespaces, dispositivos de auditoría, rendimiento, disponibilidad, integración cloud, licencias ni soporte.",
    "No compara Vault con otras alternativas ni demuestra superioridad, compatibilidad o idoneidad para un caso real."
  ]
}
