<?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>Cryptsetup on inetshell</title><link>https://inet.sh/es/tags/cryptsetup/</link><description>Recent content in Cryptsetup 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/cryptsetup/index.xml" rel="self" type="application/rss+xml"/><item><title>LUKS: respaldar y restaurar el header, y añadir, cambiar o quitar llaves</title><link>https://inet.sh/es/posts/linux/luks-respaldar-header-llaves/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/linux/luks-respaldar-header-llaves/</guid><description>Los comandos de cryptsetup que evitan perder un disco cifrado con LUKS: luksHeaderBackup y luksHeaderRestore, luksAddKey, luksChangeKey, luksRemoveKey y luksKillSlot, luksDump para ver los slots, keyfiles en crypttab. Y el aviso que casi nadie lee: un backup del header resucita las passphrases que ya quitaste.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<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><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</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"><span class="c1"># Respaldo del header (no hace falta abrir el volumen)</span>
</span></span><span class="line"><span class="cl">cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /root/sdb-luks-header.img
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Slots en uso</span>
</span></span><span class="line"><span class="cl">cryptsetup luksDump /dev/sdb
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Llaves</span>
</span></span><span class="line"><span class="cl">cryptsetup luksAddKey /dev/sdb                      <span class="c1"># otra passphrase (pide una existente)</span>
</span></span><span class="line"><span class="cl">cryptsetup luksAddKey /dev/sdb /root/keyfile.bin    <span class="c1"># un keyfile en un slot nuevo</span>
</span></span><span class="line"><span class="cl">cryptsetup luksChangeKey /dev/sdb                   <span class="c1"># sustituir una passphrase por otra, mismo slot</span>
</span></span><span class="line"><span class="cl">cryptsetup luksRemoveKey /dev/sdb                   <span class="c1"># quitar la passphrase que escribas</span>
</span></span><span class="line"><span class="cl">cryptsetup luksKillSlot /dev/sdb <span class="m">2</span>                  <span class="c1"># quitar el slot 2 sin conocer su passphrase (pide otra)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restaurar el header</span>
</span></span><span class="line"><span class="cl">cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /root/sdb-luks-header.img
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Después de cualquier cambio de llaves, respalda el header otra vez y destruye el backup anterior.</strong> Restaurar un backup viejo reactiva todas las passphrases que tenía en ese momento, incluidas las que quitaste.</p>
<h2 id="por-qué-el-header-lo-es-todo">Por qué el header lo es todo</h2>
<p>LUKS no cifra los datos con tu passphrase: los cifra con una <strong>master key</strong> aleatoria, y esa master key va cifrada dentro del header, una copia por slot, cada una protegida por una passphrase o keyfile. El header ocupa los primeros <strong>16 MiB</strong> del dispositivo en LUKS2 (2 MiB en LUKS1).</p>
<p>Si esos megabytes se dañan (un <code>dd</code> equivocado, un <code>mkfs</code> sobre el disco crudo, sectores muertos justo ahí), la master key desaparece y los datos se vuelven ruido irrecuperable, aunque sepas la passphrase. Un backup del header, guardado en otro sitio, es la única póliza. El archivo pesa lo mismo que el header y <strong>no contiene datos</strong>, solo la master key cifrada.</p>
<h2 id="respaldar-y-restaurar">Respaldar y restaurar</h2>
<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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /root/sdb-luks-header.img
</span></span><span class="line"><span class="cl">cryptsetup luksDump /root/sdb-luks-header.img         <span class="c1"># el backup se puede inspeccionar como un dispositivo</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Guárdalo fuera de la máquina, cifrado (un <code>gpg -c</code> basta) y con nombre que diga de qué disco es. Restaurar:</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">cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /root/sdb-luks-header.img
</span></span></code></pre></td></tr></table>
</div>
</div><p>Solo repara el header. Si el accidente pasó más allá de los primeros 16 MiB, lo que hubiera ahí sigue perdido.</p>
<h2 id="slots-y-llaves">Slots y llaves</h2>
<p>LUKS2 tiene 32 slots (0–31); LUKS1, 8. Todos abren la misma master key, así que da igual con cuál entres:</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">cryptsetup luksDump /dev/sdb <span class="p">|</span> sed -n <span class="s1">&#39;/^Keyslots:/,/^Tokens:/p&#39;</span>
</span></span><span class="line"><span class="cl">cryptsetup open --test-passphrase -v /dev/sdb         <span class="c1"># &#34;Key slot 0 unlocked&#34;: qué slot usa tu passphrase</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Keyfile para abrir sin teclear (típico en un disco de datos que arranca con el sistema):</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">dd <span class="k">if</span><span class="o">=</span>/dev/urandom <span class="nv">bs</span><span class="o">=</span><span class="m">32</span> <span class="nv">count</span><span class="o">=</span><span class="m">1</span> <span class="nv">of</span><span class="o">=</span>/root/keyfile.bin
</span></span><span class="line"><span class="cl">chmod <span class="m">0400</span> /root/keyfile.bin
</span></span><span class="line"><span class="cl">cryptsetup luksAddKey /dev/sdb /root/keyfile.bin
</span></span></code></pre></td></tr></table>
</div>
</div><p>Y en <code>/etc/crypttab</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-text" data-lang="text"><span class="line"><span class="cl">datos  UUID=&lt;uuid-del-luks&gt;  /root/keyfile.bin  luks
</span></span></code></pre></td></tr></table>
</div>
</div><p>Prueba sin reiniciar: <code>systemctl daemon-reload &amp;&amp; systemctl start systemd-cryptsetup@datos.service</code>. El keyfile en <code>/root</code> solo tiene sentido si <code>/</code> también está cifrado o el disco es de una máquina que confías físicamente.</p>
<p>Quitar llaves:</p>
<ul>
<li><code>luksRemoveKey</code> pide la passphrase que quieres eliminar.</li>
<li><code>luksKillSlot &lt;n&gt;</code> elimina un slot concreto y pide <strong>otra</strong> passphrase válida; sirve cuando la del slot ya nadie la recuerda.</li>
<li><code>luksChangeKey</code> cambia una passphrase por otra en el mismo slot.</li>
</ul>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>El backup del header conserva las llaves viejas.</strong> Quitaste la passphrase de un ex compañero y el backup de antes sigue en un USB: ese USB abre el disco. Re-respalda tras cada cambio y destruye los anteriores (<code>shred -u</code>).</li>
<li><strong><code>luksErase</code> no es borrado seguro si existe un backup del header.</strong> Destruye todos los slots del disco, pero un <code>luksHeaderRestore</code> los devuelve. Para un borrado definitivo, además, destruye los backups.</li>
<li><strong>No mates el último slot.</strong> <code>cryptsetup</code> avisa de que el dispositivo quedará inutilizable; si aceptas, ya está.</li>
<li><strong>El backup en el mismo disco no es backup.</strong> Ni en el mismo servidor si lo que temes es perder el servidor.</li>
<li><strong>Header separado</strong> (<code>--header /ruta/header.img</code> al formatear y al abrir) mueve el header fuera del disco por completo; entonces el &ldquo;backup&rdquo; es el propio header y perderlo equivale a perder los datos.</li>
<li><strong>LUKS1 vs LUKS2</strong>: los comandos son los mismos; <code>cryptsetup convert --type luks2</code> migra un LUKS1 (con backup antes, claro).</li>
</ul>
<p>Referencia: <code>man 8 cryptsetup</code>, secciones <em>luksHeaderBackup</em>, <em>luksHeaderRestore</em> y <em>luksKillSlot</em>.</p>
]]></content:encoded></item></channel></rss>