Seguridad. Smartcarcards
1. OpenPGP Smartcards
Estas tarjetas pueden almacenar varias claves, y se gestionan como un accesorio por parte de la infraestructura PGP. El sentido de la tarjeta es almacenar las claves privadas de forma que, dado que el trabajo criptográfico se hace dentro de la propia tarjeta, éstas no resultan comprometidas si el ordenador resulta comprometido.
La idea es utilizar subclaves de la clave principal PGP, de forma que la clave principal no se pierda si la tarjeta sufre algún percance: con la clave principal, se pueden revocar las subclaves si fuera necesario.
Es recomendable leer información básica sobre el funcionamiento de estas tarjetas. Por ejemplo, es imprescindible saber que si se introduce erróneamente el pin administrativo 3 veces, la tarjeta queda inutilizada irremisiblemente.
La tarjeta puede albergar, en general, 3 claves. Para PGP se necesita una para firmar y otra para cifrar y la tercera usualmente se utiliza para autenticación, por ejemplo, para SSH.
1.1. Paquetes
Hablando de debian, necesitamos gnupg2, scdaemon y pcscd.
1.2. Preparación de la tarjeta
1.2.1. Creación de claves
- Si no se tiene ya una clave ppal, gpg2 --gen-key
- gpg2 --edit-key XXXXXXX para añadir subclaves a la clave ppal; XXXXXXX es el identificador de la clave mostrado con gpg2 --list-keys (si aparece un par TTTTTTT/XXXXXXXX, la primera parte es el tipo de clave y la segunda el identificador de la clave).
- En el shell que se abre con --edit-key, utilizar el comando addkey para añadir las dos primeras subclaves: una solo para firmar y otra solo para cifrar. Antes de salir, comando save.
- Si se quiere utilizar la tarjeta para autenticación, hay que generar una tercera subclave, esta vez de forma un pelín especial: el comando es gpg2 --expert --edit-key XXXXXXXX. El modo experto permite escoger libremente las capacidades con que se crea la subclave (cuidado porque inicialmente tendrá activadas cifrado y firma que hay que desactivar). Con ello, se puede crear la tercera subclave solo para autenticación, opción que no aparece en el menú cuando no se ejecuta en modo experto. Por lo demas, el procedimiento es el mismo: comando addkey y de nuevo antes de salir, comando save.
1.2.2. Salvaguarda de claves
Una vez creadas las subclaves, y antes de pasarlas a la tarjeta, es recomendable hacer una copia del directorio ~/.gnupg a un medio externo, dado que posteriormente las claves privadas se van a eliminar del ordenador.
Además, posteriormente necesitaremos las claves públicas, por lo que es conveniente realizar un backup interno de las claves públicas:
cp ~/.gnupg/pubring.gpg ~/.gnupg/pubring.gpg.backup
1.2.3. Paso de las subclaves a la tarjeta
Esta operación pasa las subclaves privadas a la tarjeta, dejando en el ordenador únicamente marcas que indican al software que las claves se encuentran en la tarjeta, que es quien realmente realizará las operaciones de cifrado, firmado o autenticación.
Con gpg2 --edit-key XXXXXX, donde XXXXXX es el identificador de la clave principal, se entra al shell gpg y se realizan las siguientes operaciones:
- list y, quizá un copia-pega del resultado en algún editor, para tenerlo a mano para consulta, porque después no será visible el propósito de cada clave y al pasarla a la tarjeta hay que indicar cual es su propósito, así es que mejor poder consultarlo que hacerlo de memoria.
- toggle para operar sobre las claves privadas. A partir de aquí ya no es visible el propósito de las subclaves.
- key 1 para seleccionar la primera subclave.
- keytocard para pasarla a la tarjeta; preguntará para qué propósito se va a utilizar y hay que poner el mismo que para el que se creó inicialmente, que ya no es visible a causa de toggle.
- key 1 de nuevo para de-seleccionar la primera clave.
- se repiten los últimos tres pasos para las claves restantes
- finalmente, si todo ha ido bien, se ejecuta save.
1.2.4. Exportación de subclaves privadas
gpg2 --export-secret-subkeys XXXXXX > gpgsubs.secring, donde XXXXXX es el identificador de la clave principal. El producto de esto es un fichero binario, así es que no examinar para no perder la vista.
1.2.5. Eliminación de la clave principal
CUIDADO: conviene asegurarse de tener la copia de las claves públicas antes de hacer esto: hicimos una en medio externo de todo y otra de las claves públicas dentro del propio directorio .gnupg en pasos anteriores.
Para eliminar la clave principal:
gpg --delete-secret-keys XXXXXXXX, donde de nuevo XXXXXXX es el identificador de la clave principal.
1.2.6. Recuperar las claves públicas
gpg --import < gpgsubs.secring
gpg --import < ~/.gnupg/pubring.gpg.backup
... y ahora se puede prescindir del backup de claves públicas:
rm gpgsubs.secring
rm ~/.gnupg/pubring.gpg.backup
... y ¡¡¡ listo !!!
1.3. Configuración PGP
1.3.1. gpg-agent
Es necesario si se va a utilizar PGP y se quiere evitar introducir la passphrase cada vez que se realiza una acción PGP. También si se va a utilizar la subclave de autenticación para SSH.
Para habilitarlo, se edita ~/.gnupg/gpg.conf y se habilita una línea con use-agent. En debian eso hace que al arrancar la sesión X se arranque también el agente.
Si además se va a utilizar para autenticación con SSH, hay que habilitar otra línea en el mismo ~/.gnupg/gpg.conf con enable-ssh-support.
1.3.2. Cifrado.
Si se va a usar la subclave de cifrado, es importante poder leer lo que se ha cifrado para otros (por ejemplo, el correo de enviado). Para ello, hay que indicarle a gnupg que por defecto cifre también para un@ mism@, editando ~/.gnupg/gpg.conf y habilitando estas entradas:
hidden-encrypt-to 0xXXXXXX!
default-recipient 0xXXXXXX!
... donde XXXXXXX es el identificador de la subclave utilizada para cifrar.
1.4. Uso con SSH
1.5. Otras operaciones con la tarjeta
- gpg2 --card-status muestra el contenido de la tarjeta
- gpg2 --edit-card entra en un shell para editar los datos de la tarjeta; hay un comando admin que habilita la ejecución de otros comandos potencialmente dañinos y, recuerda, help es tu amig@.