He creado un conjunto de claves PGP que consta de lo siguiente:
- Una clave maestra RSA con solo capacidades de firma, almacenada fuera de línea.
- Múltiples tarjetas OpenPGP, cada una con tres claves RSA:
- Una clave de cifrado
- Una clave de firma
- Una clave de autenticación para SSH
- Múltiples tarjetas OpenPGP, cada una con tres claves RSA:
Mi razonamiento detrás de hacerlo de esta manera es que si una tarjeta de hardware se roba, puedo revocar todos sus certificados de una manera que no "dañe" mi infraestructura restante. (Excepto, por supuesto, que ahora necesito volver a cifrar mis datos cifrados para excluir esta clave y que debo recrear firmas de larga duración con una subclave de firma diferente, pero estas cosas no dañan mi identidad: son Simplemente realmente inconveniente.)
Por supuesto, las claves de cifrado múltiples no son la mejor idea, pero estoy particularmente preocupado por cifrar y descifrar los archivos de copia de seguridad y no tanto los correos electrónicos. No estoy seguro si hay una manera para que un usuario de correo electrónico tenga sus correos electrónicos cifrados a las tres claves de cifrado a la vez, pero no es el fin del mundo (aunque es realmente inconveniente) si solo está cifrado a una clave de cifrado.
El problema al que me enfrento actualmente implica tratar de configurar un arranque LUKS con un archivo de clave cifrado GPG. Mi configuración actual funciona, pero solo permite descifrar con una de las tarjetas. Mis llaveros públicos y secretos se ven bien, el llavero secreto contiene talones de todas las tarjetas inteligentes. Si intento descifrar con otra de las tarjetas, se ahoga y falla, y me pide que inserte la tarjeta "correcta".
Mi archivo de clave está cifrado de esta manera:
gpg --output /keyfile.gpg --encrypt --recipient $MASTER_KEY_ID \
--encrypt-to $ENC_SUBKEY_1! --encrypt-to $ENC_SUBKEY_2! \
--encrypt-to $ENC_SUBKEY_3!
Observe cómo estoy usando !
para forzarlo a cifrar específicamente para estas subclaves. Al iniciar con cryptsetup, veo el siguiente mensaje si tengo una tarjeta diferente insertada:
gpg: error reading application data
gpg: decryption failed: secret key not available
cryptsetup: cryptsetup failed, bad password or options?
Si uso la tarjeta que contiene $ENC_SUBKEY_1
, el descifrado funciona y el sistema operativo se inicia.
Mi script de claves es bastante similar al que proporciona cryptsetup:
if ! /lib/cryptsetup/askpass "Enter passphrase for key $1: " \
/usr/bin/gpg -q --batch --no-random-seed-file --homedir /lib/cryptsetup/gpg \
--ignore-valid-from --ignore-time-conflict --passphrase-fd 0 --decrypt $1; then
return 1
fi
return 0
Si hago el mismo tipo de cifrado en un archivo en mi sistema operativo en ejecución, obtendré una salida interesante cuando intente descifrar con una clave diferente a la primera pasada como --encrypt-to
:
Please remove the current card and insert the one with serial number:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Hit return when ready or enter 'c' to cancel
Si presiono c hasta dos veces, eventualmente "encontrará" la clave correcta y descifrará el archivo. Presumiblemente, debido a que está en modo --batch
en el inicio, no lo indicará y en su lugar solo fallará.
¿Hay alguna manera de evitar este problema? ¿Hay alguna manera de que le diga a GPG que siga intentando hasta que nada funcione? es decir: la clave para la tarjeta 1 puede descifrar; tarjeta 1 no presente; Clave para tarjeta 2 puede descifrar; tarjeta no presente; La clave para la tarjeta 3 puede descifrar; tarjeta presente descifrar.