Este laboratorio reproduce en vídeo la guía cómo instalar OpenBao con Docker y almacenamiento Raft: la misma imagen openbao/openbao:2.6.2, la misma configuración y las mismas órdenes, ejecutadas de verdad en un contenedor desechable. Si buscas montar OpenBao en Docker para guardar las credenciales de tus servicios, aquí ves cada salida real, del primer bao status sellado al snapshot de Raft.
Qué es OpenBao y por qué Raft
OpenBao es la bifurcación de HashiCorp Vault que conserva la licencia MPL 2.0 y mantiene su API, así que los conceptos del artículo sobre Vault de HashiCorp para gestión de secretos se aplican igual. El almacenamiento Raft va integrado en el binario: escribe los datos cifrados en un directorio y no necesita una base de datos externa. La documentación del backend Raft exige cluster_addr incluso con un solo nodo.
El propietario del volumen de datos
La imagen se ejecuta con el usuario sin privilegios openbao, y Docker solo copia ese propietario a un volumen nuevo cuando la ruta ya existe en la imagen. Por eso el volumen va en /openbao/file: en /openbao/data el directorio queda de root y el lab muestra el Permission denied. Los detalles de cómo se inicializa un volumen están en la documentación de volúmenes de Docker y en el laboratorio sobre cómo persisten los datos en Docker.
Inicializar y desellar sin enseñar las claves
bao operator init genera 5 claves de desellado y el token raíz, y el lab las vuelca con jq a ficheros con permisos 600 para no imprimirlas. Después desella con 3 de ellas. En el lab las claves se pasan como argumento porque no hay teclado; en tu servidor ejecuta bao operator unseal sin argumento, que pide la clave oculta y la deja fuera del historial. La referencia completa está en la documentación de bao operator init.
Qué cambia respecto a la guía
El compose.yaml del lab omite mem_limit y memswap_limit: el contenedor anidado donde se graba no delega el controlador de memoria de cgroup v2, y Docker rechaza cualquier límite de memoria. En tu servidor mantén esas dos líneas con el mismo valor, como explica la guía, para que el swap del contenedor quede en 0 y los secretos no acaben en disco. El token raíz tampoco se revoca aquí, porque el contenedor se destruye al terminar.
Para el resto de opciones de secretos en contenedores tienes el laboratorio de gestión de secretos en Docker, y para mandar los snapshots fuera del servidor, la guía de restic para copias cifradas. La imagen y sus etiquetas están en openbao/openbao en Docker Hub, y el código en el repositorio de OpenBao.
Preguntas frecuentes
¿Por qué OpenBao arranca sellado después de cada reinicio?
Porque con desellado Shamir la clave que descifra los datos no se guarda en disco: se reconstruye en memoria con 3 de las 5 claves de desellado. Hasta entonces bao status muestra Sealed true y Unseal Progress 0/3, como en el lab, y los secretos siguen cifrados.
¿En qué ruta monto el volumen de Raft de OpenBao en Docker?
En /openbao/file. La imagen se ejecuta con el usuario openbao y Docker solo copia ese propietario a un volumen nuevo cuando la ruta ya existe en la imagen. En una ruta como /openbao/data el directorio queda de root y escribir falla con Permission denied, como muestra el lab.
¿Un snapshot de Raft guarda los secretos en claro?
No. El fichero es un tar.gz con meta.json, state.bin, SHA256SUMS y SHA256SUMS.sealed, y state.bin conserva los datos cifrados con la clave de OpenBao. Por eso solo se restaura con las claves de desellado originales, que deben guardarse en un sitio distinto al snapshot.
¿Por qué falla el primer kv put justo después de activar KV v2?
Al activar kv-v2, OpenBao prepara el almacenamiento versionado y durante un momento responde Upgrading from non-versioned to versioned data. La guía lo encontró en una de sus instalaciones: espera un segundo y repite la orden. El lab lo resuelve con un bucle de hasta 10 intentos.