<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Keycloak on inetshell</title><link>https://inet.sh/es/tags/keycloak/</link><description>Recent content in Keycloak on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/keycloak/index.xml" rel="self" type="application/rss+xml"/><item><title>Proxmox VE con Keycloak: login por OpenID Connect (realm openid)</title><link>https://inet.sh/es/posts/proxmox/keycloak-openid-connect/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/keycloak-openid-connect/</guid><description>Autenticar en Proxmox VE con Keycloak usando un realm de tipo OpenID Connect: cliente confidencial en Keycloak 26, pveum realm add con issuer-url, client-id, client-key y username-claim preferred_username, usuarios autocreados, permisos y grupos. Sin mappers extra ni /auth/ en la URL.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>En Keycloak: <strong>Clients → Create client</strong> → OpenID Connect, Client ID <code>proxmox</code>, <em>Client authentication</em> <strong>On</strong>, <em>Standard flow</em> <strong>On</strong>, <em>Valid redirect URIs</em> <code>https://pve.example.local:8006</code> y <code>https://pve.example.local:8006/*</code>. Copia el secret de la pestaña <strong>Credentials</strong>.</p>
<p>En un nodo Proxmox:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">pveum realm add keycloak --type openid <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --issuer-url https://id.example.local/realms/lab <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --client-id proxmox <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --client-key <span class="s1">&#39;&lt;client-secret&gt;&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --username-claim preferred_username <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --autocreate <span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --comment <span class="s1">&#39;Keycloak&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Los usuarios entran como <code>alice@keycloak</code>. Se crean solos al primer login, <strong>sin permisos</strong>; los permisos siguen siendo ACLs de Proxmox:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">pveum group add sso-admins
</span></span><span class="line"><span class="cl">pveum acl modify / --groups sso-admins --roles Administrator
</span></span><span class="line"><span class="cl">pveum user modify alice@keycloak --groups sso-admins     <span class="c1"># después de su primer login</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="cómo-funciona">Cómo funciona</h2>
<p>Proxmox soporta realms <code>openid</code> desde PVE 7. Con <code>issuer-url</code> descarga <code>/.well-known/openid-configuration</code> y de ahí saca los endpoints; en la pantalla de login aparece el realm en el desplegable y el botón <strong>Login</strong> redirige a Keycloak. Al volver, el valor del claim que elegiste en <code>username-claim</code> se convierte en el usuario <code>&lt;claim&gt;@&lt;realm&gt;</code>.</p>
<p><code>username-claim</code> acepta cualquier nombre de claim. Keycloak manda <code>preferred_username</code> por defecto (viene del mapper <em>username</em> del client scope <code>profile</code>), así que <strong>no hace falta el mapper adicional</strong> que traían las guías antiguas para exponer un claim llamado <code>username</code>. Si prefieres el correo, <code>--username-claim email</code>.</p>
<h2 id="keycloak-paso-a-paso-26">Keycloak, paso a paso (26)</h2>
<ol>
<li><strong>Realm.</strong> Usa el que tengas (<code>lab</code> en el ejemplo). El issuer es <code>https://id.example.local/realms/lab</code>. Desde Keycloak 17 ya no hay <code>/auth/</code> en la ruta; si copias <code>/auth/realms/...</code> de una guía vieja, el discovery falla.</li>
<li><strong>Clients → Create client.</strong>
<ul>
<li><em>Client type</em>: OpenID Connect. <em>Client ID</em>: <code>proxmox</code>. <em>Name</em>: lo que quieras.</li>
<li><em>Capability config</em>: <strong>Client authentication On</strong> (cliente confidencial, con secret). <strong>Standard flow On</strong>. Todo lo demás Off: <em>Direct access grants</em>, <em>Implicit flow</em>, <em>Service accounts</em>, <em>Authorization</em>.</li>
<li><em>Login settings</em>: <em>Root URL</em> <code>https://pve.example.local:8006</code>; <em>Valid redirect URIs</em> <code>https://pve.example.local:8006</code> y <code>https://pve.example.local:8006/*</code>. <em>Web origins</em> vacío: es un flujo de redirección, no hay CORS.</li>
</ul>
</li>
<li><strong>Credentials</strong> → <em>Client secret</em>. Es el <code>--client-key</code>.</li>
<li><strong>Grupos (opcional).</strong> Clients → <code>proxmox</code> → <em>Client scopes</em> → <code>proxmox-dedicated</code> → <em>Add mapper</em> → <em>By configuration</em> → <strong>Group Membership</strong>: <em>Name</em> <code>groups</code>, <em>Token Claim Name</em> <code>groups</code>, <em>Full group path</em> Off, <em>Add to ID token</em> y <em>Add to userinfo</em> On.</li>
</ol>
<h2 id="proxmox-paso-a-paso">Proxmox, paso a paso</h2>
<p>Por GUI: <strong>Datacenter → Permissions → Realms → Add → OpenID Connect Server</strong>: <em>Issuer URL</em>, <em>Realm</em> (el nombre corto, <code>keycloak</code>), <em>Client ID</em>, <em>Client Key</em>, <em>Username Claim</em> <code>preferred_username</code>, <em>Autocreate Users</em>. O el <code>pveum realm add</code> del En corto; la configuración queda en <code>/etc/pve/domains.cfg</code> y se replica al clúster.</p>
<p>Con grupos desde Keycloak, en versiones recientes de PVE 8 y en PVE 9 (<code>pveum realm add --help</code> te dice si tu versión tiene <code>--groups-claim</code>):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">pveum realm modify keycloak --groups-claim groups --groups-autocreate <span class="m">1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Cada grupo del claim se crea como <code>&lt;grupo&gt;-keycloak</code> y el usuario entra en ellos en cada login; los ACLs los asignas a esos grupos.</p>
<p>Prueba antes de tocar nada más: pantalla de login → Realm <strong>Keycloak</strong> → <strong>Login</strong> → vuelves autenticado y <code>pveum user list</code> muestra <code>alice@keycloak</code>.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong><code>Invalid parameter: redirect_uri</code></strong> en Keycloak: la URL con la que entras al navegador (nombre, puerto <code>8006</code>, <code>https</code>) no está en <em>Valid redirect URIs</em>. Si usas la IP y el FQDN, agrega las dos.</li>
<li><strong>El certificado de Keycloak lo tiene que aceptar el nodo</strong>, no solo tu navegador. Con una CA interna: copia el <code>.crt</code> a <code>/usr/local/share/ca-certificates/</code> y <code>update-ca-certificates</code>.</li>
<li><strong><code>issuer-url</code> tiene que coincidir exactamente</strong> con el <code>iss</code> de los tokens: <code>https</code>, sin barra final, <code>/realms/&lt;realm&gt;</code>.</li>
<li><strong>Hora.</strong> Un reloj desfasado invalida los tokens; <code>chrony</code> en los nodos.</li>
<li><strong>No dejes que el usuario edite su propio username</strong> en Keycloak (aviso de la propia documentación de Proxmox): cambiarse el nombre a <code>root</code> es cambiarse de cuenta en Proxmox.</li>
<li><strong>No pongas <code>--default 1</code> hasta que funcione</strong>, y deja <code>root@pam</code> como puerta de emergencia: si Keycloak cae, el realm <code>openid</code> no puede autenticar a nadie.</li>
<li><strong>API y CLI.</strong> Los usuarios OIDC no tienen contraseña en Proxmox; para Terraform, Ansible o <code>pvesh</code> desde fuera crea un token: <code>pveum user token add alice@keycloak automation --privsep 0</code>.</li>
</ul>
<p>Referencia: <a href="https://pve.proxmox.com/pve-docs/chapter-pveum.html#user-realms-oidc">User Management — OpenID Connect</a> en la guía de Proxmox y la <a href="https://www.keycloak.org/docs/latest/server_admin/index.html#_oidc_clients">creación de clientes</a> en la documentación de Keycloak.</p>
]]></content:encoded></item></channel></rss>