Comandos y protocolos de firmado y encriptación

Qué software se utiliza

Actualmente se utiliza gpg para la encriptación y cifrado.

La clave maestra está en un USB blanco con capucha de 16 GB, inscrita en una pegatina.

El anillo de claves completo se encuentra en la máquina virtual cripto.

El acceso se detalla en Brocoli.Cripto

Dónde se guardan y cómo funciona

General

  • Sobre la llave principal (clave raíz):
    • La parte privada sólo está en el tails. A la hora de exportar a otros dispositivos no seguros, se capa.
    • No caduca nunca.
    • Debe estar bien guardada.
    • Será sólo para firmar las subllaves en 4096 bits.
    • El certificado de revocación se guarda junto a la parte privada de la llave.
  • Se diferencia el tratamiento de las claves personales y técnicas.
  • Se usa el algoritmo RSA.
  • La parte publica de la llave principal y la subllaves completas son las que se reparten en los diferentes dispositivos.
  • A modo de backup, el keyring completo se encuentra en una subcarpeta del USB seguro con el nombre “gpg_keyring”.

Claves red lechuga

  • Son claves para la encriptación y firmado de todo tipo de archivos o datos.
  • No se publican a ningún servidor de llaves.
  • El keyring en cada máquina se guarda en /etc/gnupg, con acceso sólo para root.
  • Se suple con un script gpglechuga como wrapper para que utilice el keyring de /etc/gnupg.
  • La contraseña de la clave privada se guardará en el archivo de claves. (Averiguar qué conviene)

Claves personales

  • Las claves personales están asociadas a la dirección de correo eléctronico.

Uso de las claves

La contraseña de la clave personal está en la etiqueta del usb seguro que la contiene

si se ejecuta en un contenedor lxc, usar la opción --pinentry-mode loopback

Obtener el key fingerprint
gpg --fingerprint hugo@hugo.cat

Actualizar claves públicas hacia el servidor de llaves (sólo llaves personales) Por defecto es keys.gnupg.net
gpg --send-keys [key-id]

Firmar un archivo
gpg --recipient hugo@hugo.cat --clearsign [archivo]

Verificar una firma
gpg --verify [archivo de firma (.sig|.asc)]

Importar una clave pública
gpg --recv [KEY ID]

Encriptar un archivo, -a para salida ascii
gpg --recipient hugo@hugo.cat --encrypt -a [--sign] [archivo]

Desencriptar
gpg --decrypt [archivo]

Generación de una nueva clave raíz

gpg -‐gen-key

  • Selección Opción 1, para firmar y encriptar
  • Selección de longitud de clave de 2048 bits.
  • Caducidad:
    • Personales: 1 año
    • Técnicos: Sin caducidad.
  • Como nombre y apellidos:
    • Para la red lechuga, Máquina y Red. Por ejemplo "Brocoli Lechuga"
    • Para personal, nombre y apellidos.
  • Como correo:
    • Para la red lechuga, adminlechuga@lechuga.eu.
    • Para personal, el correo electronico personal.
  • Como comentario:
    • Para la red lechuga, el uso intencionado.

En el caso de creación de una nueva clave de red lechuga, hay que actualizar el fichero /etc/gnupg/last-id que contiene la clave actual a usar

Generación de una nueva subpareja a partir de la clave raíz.

Siguiendo los pasos de https://alexcabal.com/creating-the-perfect-gpg-keypair/

  • La clave raíz únicamente debe usarse para generar subllaves.
  • Para el uso regular sólo se utilizan subllaves. Así, si se comprometen, no hay que hacer una confianza desde cero.
  • Sólo ha de haber una pareja activa en cada momento, siempre se revoca la anterior al hacer una nueva.

1.Generar la nueva pareja

  1. Entrar en el modo línea de comandos de GPG
    • gpg --edit-key hugo@hugo.cat
  2. Para generar una clave de firma y/o encriptación:
    1. addkey (Una vez para la clave de firma y otra para la de encriptación)
    2. Seleccionar RSA (cifrar o firmar)
    3. Seleccionar la intensidad de cifrado o firmado por defecto (4096)
    4. Seleccionar caducidad de un año si es personal, sin caducidad si es técnica.
    5. save

2. Generar un archivo de revocación de la clave anterior (TODO)

Identificar y el número la clave a revocar (Hay que revocar las dos anteriores de firma y encriptado)

TODO: hacer un mkdir ~/.gnupg/revocaciones

ID=E382285 
gpg --gen-revoke $ID > ~.gnupg/revocaciones/$ID.rev

3. Hacer un backup en el dispositivo Antipatia (usb)

Ir a Backup del anillo de llaves

3. Si es una subclave personal, publicar la clave completa en key Server

Ir a Comando para publicar

4. Preparar keyring capado para sacar del medio seguro

A continuación, para usar las nuevas claves en otros dispositivos, ejecutar los pasos de Exportación

Exportación del keyring para el uso fuera del dispositivo seguro

Hacer un script en el directorio de persistencia automatizando esto

Si se ejecuta en un contenedor lxc, usar la opción --pinentry-mode loopback

Después de generar una nueva pareja de claves, hay que exportar el keyring capado (sin la parte privada de la raíz) a fuera del entorno seguro.

Versión lxc cripto

Este script:

  1. Exporta las subkeys a un archivo armor,
  2. Exporta los trusts
  3. Los sube al directorio Antipatia de nuestra nuve.
KEY_RENOVAR=hugo@hugo.cat
gpg --pinentry-mode loopback --armor --output ~/sec_export.asc --export-secret-subkeys $KEY_RENOVAR
gpg --export-ownertrust > ~/trustdb.txt
mkdir ~/temp
gpg --pinentry-mode loopback --homedir ~/temp --import sec_export.asc
gpg --pinentry-mode loopback --homedir ~/temp --import-ownertrust trustdb.txt
shred -u ~/sec_export.asc
shred -u ~/trustdb.txt
gpg --pinentry-mode loopback --homedir ~/temp --edit-key hugo@hugo.cat

# usar el comando passwd y save para cambiar la clave actual a la externa
gpg --homedir ~/temp --pinentry-mode loopback --armor --output ~/sec_export.asc --export-secret-subkeys $KEY_RENOVAR
gpg --homedir ~/temp --export-ownertrust > ~/trustdb.txt

# Este punto sólo si la llave es hugo@hugo.cat
lftp -u hugo srv-internet.lechuga.eu -p 990 -e "set ssl:verify-certificate false; cd hugo/Antipatia/gpg; put sec_export.asc; put trustdb.txt; exit"
shred -u ~/sec_export.asc
shred -u ~/trustdb.txt

Importación del keyring capado en diferentes dispositivos

GPG no permite incorporar subkeys. Para ello hay que eliminar el key completo y reimportarlo (sin el secret de la master key)

En un host linux

KEY_RENOVAR=hugo@hugo.cat
cd ~
lftp -u hugo srv-internet.lechuga.eu -p 990 -e "set ssl:verify-certificate false; cd hugo/Antipatia/gpg; get sec_export.asc; get trustdb.txt;exit"
gpg --delete-secret-keys $KEY_RENOVAR
gpg --import sec_export.asc 
gpg --import-ownertrust trustdb.txt
shred --remove=wipesync sec_export.asc
shred --remove=wipesync trustdb.txt

En windows

en línea de comandos ejecutar gpg --import [archivo secring.pgp] [archivo pubring.gpg]

Thunderbird utiliza Enigmail, que ya reconoce dónde está instalado el keyring.

En Android

Utilizar el programa OpenKeychain, importando el secring.gpg y el pubring.gpg.

Uso temporal de un directorio con keyrings

Se cambia el directorio de trabajo para que el command line de gnupg trabaje con otro keyring.

Usar la opcion de línea de comandos
--homedir [Directorio del keyring alternativo]

Establecer un directorio temporal
export GNUPGHOME=[directorio donde está el keyring]

Reestablecer el directorio original
export GNUPGHOME=~/.gnupg

Servidores de llaves

Llaves personales

https://pgp.mit.edu/
https://gnupg.pub/

Llaves técnicas

Se publican (la parte pública) en la dirección: https://srv-internet.lechuga.eu/nubes/publico/[KEY_ID]

Usar previamente el comando:
KEY_ID=E5634823 && gpg --export --armor $KEY_ID > $KEY_ID.asc

Hacer un push de este archivo al directorio de publicación de claves:
pushconfig $KEYID.asc

Gestión del keyring

Archivo de opciones
vim ~/.gnupg/gpg.conf

Listar las claves secretas guardadas en el keyring
gpg --list-secret-keys

Listar la claves públicas del keyring
gpg --list-keys

Listar la claves públicas del keyring y firmas de las mismas
gpg --list-sigs

Generar un certificado de revocación
gpg --output revoke.asc --gen-revoke hugo@hugo.cat

Editar una clave
gpg --edit-key hugo@hugo.cat

Exportar la clave raíz (parte privada)
gpg --export-secret-keys --armor hugo@hugo.cat > private.gpg-key-hugo@hugo.cat

Exportar la clave raíz (parte pública)
gpg --export --armor hugo@hugo.cat > public.gpg-key-hugo@hugo.cat

Importar la clave pública de alguien
gpg --import [fichero con la clave pública] gpg --keyserver keyserver.ubuntu.com --recv 2807AC92

Cambiar el trust de una clave

gpg --edit-key 'hugo@hugo.cat'
trust
(elegir el nivel de trust)
save
quit

Comandos de edición gpg

gpg tiene un modo de edicion en línea, con una serie de comandos.

Para hacer ediciones de la clave raíz, la parte privada ha de estar incorporada a la misma.

Una vez hemos entrado a editar la clave raíz con el parámetro edit-key, accedemos a la línea de comandos del gpg.

https://www.gnupg.org/gph/en/manual/r590.html

key     - Toggle selection of subkey with index n. Use 0 to deselect all.
trust   - Change the owner trust value
addkey	- Añadir subclave
delkey	- Borrar subclave
expire  - Change a key expiration time
save	- Guardar cambios
addui	- Añadir información de contacto
deluid	- Eliminar información de contacto
revkey	- Revocar clave
revsig  - Revoke a signature
sign-key - Sign a public key with a private key
help	- Listado de comandos

Backup revisar

Copia del anillo completo (tails)

  1. Montar el dispositivo USB de exportación en un directorio
    DESTINO=/mnt/pendriv
    sudo bash
    mkdir $DESTINO
    mount /dev/sd?? $DESTINO
  2. Del dispositivo USB borrar el contenido del directorio de cosa de seguridad
    rm $DESTINO/gpg_keyring_backup/* -rf
  3. Hacer una copia del anillo actual
    cp $DESTINO/gpg_keyring/* $DESTINO/gpg_keyring_backup/* --recursive
    rm $DESTINO/gpg_keyring/* -rf
  4. Copiar el anillo al usb
    cp ~./.gnupg/* $DESTINO/gpg_keyring --recursive
    gpg --export-ownertrust > $DESTINO/gpg_keyring/trustdb.txt

Restitución del anillo completo

ORIGEN=/mnt/pendriv
cp $ORIGEN/* ~/.gnupg/ --recursive
gpg --import-ownertrust $ORIGEN/trustdb.txt

De una clave privada con paperkey

Exportación:

KEY_ID=E8459573
gpg --export-secret-key $KEY_ID > $KEY_ID.gpg
paperkey --secret-key=$KEY_ID.gpg --output=$KEY_ID.gpg.paperkey

Importación:

paperkey --pubring ~/.gnupg/pubring.gpg --secrets 75295EE8.gpg.paperkey --output nuevo-secring.gpg
gpg --import nuevo-secring.gpg

Significado de los flags en --list-keys

0x01	“C”	Key Certification
0x02	“S”	Sign Data
0x04	“E”	Encrypt Communications
0x08	“E”	Encrypt Storage
0x20	“A”	Authentication

Encriptación y copia a tar

Encriptación de un directorio con clave pública

tar --create --bzip2 --exclude='Foto_Replica' /home/hugo/ | gpg --encrypt --recipient hugo@hugo.cat --output home_hugo.gpg

Desencriptación de un fichero gpg de un tar bzip

gpg --decrypt home_hugo.gpg | tar -xz