{"id":1620,"date":"2026-09-14T10:20:55","date_gmt":"2026-09-14T13:20:55","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1620"},"modified":"2026-09-14T10:24:54","modified_gmt":"2026-09-14T13:24:54","slug":"api-do-virtualbox-parte-1-soap-sessoes-e-seguranca","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/api-do-virtualbox-parte-1-soap-sessoes-e-seguranca\/","title":{"rendered":"API de VirtualBox \u2014 parte 1: SOAP, sesiones y seguridad"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/virtualbox-api-soap-sessoes-v1.webp\" alt=\"Mascote LinuxPro explica a comunica\u00e7\u00e3o protegida com m\u00e1quinas virtuais em um painel, acompanhado do cachorro caramelo cyborg e do logo VirtualBox.\" width=\"1486\" height=\"856\" \/><\/p>\n<p>La API de VirtualBox permite integrar el hipervisor en inventarios, herramientas de automatizaci\u00f3n y paneles propios. Antes de escribir c\u00f3digo, conviene comprender el papel del servicio SOAP, c\u00f3mo se identifican los objetos y por qu\u00e9 la autenticaci\u00f3n, las sesiones y la seguridad forman parte de la integraci\u00f3n.<\/p>\n<p>Esta es la <strong>parte 1<\/strong>: los fundamentos de la API, con foco en el acceso remoto mediante el servicio web. En la <a href=\"\/es\/2026\/09\/api-do-virtualbox-em-go-liste-vms-com-soap\/\">parte 2, implementamos un cliente en Go para listar m\u00e1quinas virtuales<\/a>.<\/p>\n<h2>API, VBoxManage y panel web no son lo mismo<\/h2>\n<p>O <code data-no-translation=\"\">VBoxManage<\/code> ofrece administraci\u00f3n mediante l\u00ednea de comandos. El servicio web expone interfaces de VirtualBox mediante SOAP, permitiendo llamadas HTTP con XML estructurado. Un panel como el <a href=\"\/es\/2026\/09\/phpvirtualbox-gerencie-o-virtualbox-pelo-navegador\/\">phpVirtualBox<\/a> se sit\u00faa por encima de esa integraci\u00f3n.<\/p>\n<p>El servicio <code data-no-translation=\"\">vboxwebsrv<\/code> recibe llamadas SOAP. No debe confundirse con una API REST que recibe JSON. Una aplicaci\u00f3n puede ofrecer REST a sus propios consumidores y traducir esas solicitudes en llamadas SOAP en el backend.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-text\" data-no-translation=\"\">Cliente \u2192 SOAP\/HTTP \u2192 vboxwebsrv \u2192 API do VirtualBox \u2192 VMs\n     \u2193\nSa\u00edda definida pela aplica\u00e7\u00e3o<\/code><\/pre>\n<h2>El SDK y el contrato WSDL<\/h2>\n<p>El WSDL describe operaciones, par\u00e1metros, espacios de nombres y respuestas del servicio web. Es ese contrato el que gu\u00eda la implementaci\u00f3n del cliente; los nombres de m\u00e9todos y campos no deben deducirse de una API REST imaginada.<\/p>\n<p>Las operaciones y sus par\u00e1metros se han revisado en el WSDL incluido en el <a href=\"https:\/\/download.virtualbox.org\/virtualbox\/7.2.0\/\">SDK oficial 7.2.0<\/a>, utilizado como referencia documental de la l\u00ednea 7.2. Esto no es una recomendaci\u00f3n para instalar un parche antiguo: usa una versi\u00f3n mantenida de VirtualBox y consulta el SDK correspondiente a tu entorno.<\/p>\n<h2>Preparar el servicio con acceso restringido<\/h2>\n<p>Necesitas VirtualBox con <code data-no-translation=\"\">vboxwebsrv<\/code> disponible en el host y autenticaci\u00f3n del servicio configurada. El ejecutable del servicio pertenece al paquete de VirtualBox; descargar solo el SDK no instala el servidor. La <a href=\"https:\/\/download.virtualbox.org\/virtualbox\/7.2.0\/SDKRef.pdf\">referencia oficial del SDK<\/a> describe sus opciones y autenticaci\u00f3n.<\/p>\n<p>En el host de laboratorio, ejec\u00fatalo como el usuario responsable del entorno, no como root. Si el servicio a\u00fan no est\u00e1 activo, un inicio en primer plano y solo en loopback es:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">vboxwebsrv --host 127.0.0.1 --port 18083<\/code><\/pre>\n<p>No deshabilites la autenticaci\u00f3n para que el ejemplo funcione. El usuario y la contrase\u00f1a usados en el inicio de sesi\u00f3n SOAP deben coincidir con el mecanismo de autenticaci\u00f3n configurado en el servicio, que no es necesariamente id\u00e9ntico en todas las instalaciones.<\/p>\n<p>El servicio web utiliza HTTP sin cifrado por defecto y normalmente se vincula al localhost. Para acceso entre m\u00e1quinas, utiliza TLS configurado correctamente o un t\u00fanel protegido; no publiques el puerto directamente en internet. Oracle tambi\u00e9n recomienda ejecutar el servicio como un usuario normal. <a href=\"https:\/\/docs.oracle.com\/en\/virtualization\/virtualbox\/7.2\/user\/Security.html\">Gu\u00eda de seguridad<\/a>.<\/p>\n<p>Una opci\u00f3n de laboratorio es abrir este t\u00fanel en el equipo en el que se ejecutar\u00e1 el cliente:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">ssh -N -L 18083:127.0.0.1:18083 usuario@host-virtualbox<\/code><\/pre>\n<p>Sustituye usuario y host. El cliente seguir\u00e1 usando <code data-no-translation=\"\">http:\/\/127.0.0.1:18083\/<\/code>, pero el transporte entre equipos permanecer\u00e1 dentro de SSH. Si el puerto local ya est\u00e1 ocupado, elige otro y aj\u00fastalo <code data-no-translation=\"\">VBOX_URL<\/code>.<\/p>\n<h2>Entender referencias, UUIDs y sesiones<\/h2>\n<p>Una referencia SOAP es un identificador de objeto utilizado por el servicio durante la sesi\u00f3n; no es necesariamente el UUID de la VM. Un flujo de inventario de solo lectura es:<\/p>\n<table>\n<thead>\n<tr>\n<th>Operaci\u00f3n<\/th>\n<th>Uso en el cliente<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code data-no-translation=\"\">IWebsessionManager_logon<\/code><\/td>\n<td>Autenticar y obtener la referencia ra\u00edz.<\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">IVirtualBox_getMachines<\/code><\/td>\n<td>Consultar las referencias de las m\u00e1quinas.<\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">IMachine_getId<\/code><\/td>\n<td>Obtener el UUID.<\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">IMachine_getName<\/code><\/td>\n<td>Obtener el nombre.<\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">IMachine_getState<\/code><\/td>\n<td>Obtener el estado.<\/td>\n<\/tr>\n<tr>\n<td><code data-no-translation=\"\">IWebsessionManager_logoff<\/code><\/td>\n<td>Cerrar la sesi\u00f3n.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>No persistas referencias SOAP como si fueran ID permanentes. Para relacionar datos en un inventario, utiliza el UUID devuelto. Para la pr\u00f3xima ejecuci\u00f3n, abre una nueva sesi\u00f3n y obt\u00e9n referencias v\u00e1lidas de nuevo.<\/p>\n<h2>\u00bfY para iniciar VMs, crear instant\u00e1neas o cambiar la configuraci\u00f3n?<\/h2>\n<p>Este es el siguiente nivel de integraci\u00f3n, no un simple cambio del nombre del m\u00e9todo. Las operaciones de escritura deben respetar estados, bloqueos, sesiones de m\u00e1quina y seguimiento de progreso definidos por la API. El inicio de sesi\u00f3n del servicio web y una sesi\u00f3n utilizada para bloquear una m\u00e1quina no deben tratarse como el mismo concepto.<\/p>\n<p>Mi recomendaci\u00f3n es implementar cada operaci\u00f3n por separado, con autorizaci\u00f3n, confirmaci\u00f3n cuando sea destructiva, pruebas y reconciliaci\u00f3n tras un fallo. Una cuenta capaz de consultar tambi\u00e9n puede tener otros poderes en el servidor; el hecho de que un cliente solo consulte no reduce los privilegios de la credencial.<\/p>\n<p>Para un panel con Echo y Vue, mantenga este adaptador separado de los handlers HTTP. No permita que el navegador elija libremente endpoint, m\u00e9todo SOAP y argumentos. Defina servicios expl\u00edcitos, como listar m\u00e1quinas, y controle destinos y permisos en el backend.<\/p>\n<h2>De la teor\u00eda a una integraci\u00f3n verificable<\/h2>\n<p>Comience con una operaci\u00f3n peque\u00f1a: autenticar, obtener las m\u00e1quinas, consultar sus atributos y cerrar la sesi\u00f3n. Valide el contrato, gestione los fallos SOAP y evite registrar credenciales. Solo despu\u00e9s a\u00f1ada comandos que modifiquen el estado de las VMs.<\/p>\n<p>En la <a href=\"\/es\/2026\/09\/api-do-virtualbox-em-go-liste-vms-com-soap\/\">parte 2: API de VirtualBox en Go<\/a>, encontrar\u00e1s los archivos completos del cliente, la salida JSON, los timeouts y las pruebas automatizadas. Para conocer un panel que utiliza esta integraci\u00f3n, consulta tambi\u00e9n el <a href=\"\/es\/2026\/09\/phpvirtualbox-gerencie-o-virtualbox-pelo-navegador\/\">art\u00edculo sobre phpVirtualBox<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Entiende el servicio web de VirtualBox: contrato WSDL, autenticaci\u00f3n, referencias a objetos, sesiones y seguridad antes de implementar un cliente.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45,2,120],"tags":[31],"class_list":["post-1620","post","type-post","status-publish","format-standard","hentry","category-desenv","category-linux","category-servidores","tag-golang"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=1620"}],"version-history":[{"count":2,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1620\/revisions"}],"predecessor-version":[{"id":1624,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1620\/revisions\/1624"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}