Clave GPG

De HackLab
Saltar a: navegación, buscar


GNU Privacy Guard (GPG) es una herramienta de cifrado de datos y firmas digitales, es software libre licenciado bajo la GPL.

Utilizado correctamente, GPG puede proporcionar un gran nivel de seguridad y puede utilizarse para proteger tanto datos para almacenamiento propio como mensajes a otros.

Que son las llaves y como funcionan

Cada llave está compuesta por dos mitades, la llave pública (public key) y la privada (private key).

GPG gestiona un llavero (keyring) donde tenés tus llaves privadas y las llaves públicas de tus contactos.

  • Con tu llave privada firmas tus mensajes para que tus contactos puedan verificar tu identidad.
  • Con la llave publica de tus contactos cifrás el mensaje para que solo tu contacto pueda descifrarlo.


El cifrado por par de llaves públicas/privadas se llama cifrado asimétrico, ya que se necesita de una llave para cifrar y una llave distinta para descifrar.

La llave privada es privada, la publica la publicamos.

Crear clave GPG

Idealmente, se deberá generar una Llave maestra y dos subkeys una para Firmar y otra para cifrar. Aunque también podes usar una llave para ambos casos. Todas las llaves conviene sean claves RSA de 4096 bits para mayor seguridad.

Crear Llave

Abrí una terminal y corré con tu usuario corriente (osea sin sudo) este comando

$ gpg --gen-key

Esto te irá haciendo preguntas, respondé con el teclado y luego dale "Enter".

  1. Tipo de llave, selecciona la opción (1) RSA y RSA.
  2. Tamaño de la llave (en bits), ponemos 4096.
  3. Opciones de caducidad, si no querés que caduque nunca ponele "0" y a continuación "S"

Puede que después te diga que necesita generar entropía, no es un chiste, simplemente seguí haciendo otra cosa en la computadora y volvé cada tanto a ver si ya terminó.

Como resultado nos da algo así como:

pub   4096R/0x18893E37090D6ADD 2014-03-29
     Huella de clave = B436 2ABB D1DF 44C7 458D  F5EF 1889 3E37 090D 6ADD
uid              [  absoluta ] ganesh <aelevadoan@riseup.net>
sub   4096R/0x373B117E07E541AE 2014-03-29

Tengo dos formas de identificar mi llave pública. La "Huella de clave" o fingerprint >> B436 2ABB... y la versión corta en pub tras el 0x >> E3709... Un contacto puede obtener la huella desde la llave publica y compararla con la que le hemos dado y saber efectivamente que esa llave es la nuestra.

Configuración en cliente de correo Thunderbird

Instalar Thunderbird

Si aún no tenés el Thunderbird instalado se puede instalar así:

$ sudo apt-get install thunderbird

En debian el paquete se llama Icedove.

Instalar el plugin Enigmail

Una vez instalado y configurado el Thunderbird, hay que instalarse el plugin Enigmail.

Podes hacerlo desde el Thunderbird yendo a Herramientas -> Complementos y buscando "enigmail" o desde la terminal con:

$ sudo apt-get install enigmail

Luego de instalarlo te llevara al "Asistente de Configuración", sino podes buscarlo en el menú de Enigmail en Thunderbird

Gpg-paso1.png


Continúo con la siguiente opción:

Gpg-paso2.png


Seleccionar la opción Encriptar por default, hará que si tenemos la clave de algún mail ingresada en el Enigmail, al enviarle un correo a esa persona se lo hará de manera encriptada por default.

Gpg-paso3.png


También elegimos firmar por default:

Gpg-paso4.png


Y elegimos el cambiar otras configuraciones:

Gpg-paso5.png


Ahí nos va a detectar automáticamente la clave GPG que generamos previamente:

Gpg-paso6.png

Compartir llaves

Se pueden compartir llaves de diferente manera: subirlas al servidor o adjuntarlas directamente en un mail (sin necesidad de subirlas a un servidor)

Subir llaves al servidor

Tengo mi versión larga de la llave pública>> "Huella de clave" y la versión corta en pub tras el Ox >> E3709...etc.

Ahora envío mi clave al servidor para que los demás me puedan buscar:

$ gpg --send-keys llavepúblicaversióncorta

//nota: si no te anda el servidor usa $ gpg2 --send-keys llavepúblicaversióncorta

Buscar llaves en el servidor

Así, sólo conociendo nuestro mail, nos podrán buscar ( podremos buscar a otros) de la siguiente manera:

$ gpg --search-keys nuestromail

También puedo hacer esto via "Seahorse" :

(Nota: no me funcionaba gpg2, pero pude hacerlo con el Seahorse, en Debian)

Menu: Remota > Buscar llave remota Ahí nos pide el mail de la persona que buscamos

Menu: Ver> Mostrar cualquiera Ahí filtramos la persona que buscamos y luego con botón derecho Propiedades sobre el contacto y clickeamos en la solapa de Confianza, ahí podemos Certificar Firma, también elegir si querés o no que los servidores sepan que tenés certificaste a ese contacto.

Adjuntar llaves vía mail

Con Thunderbird + Enigmail instalado, antes de enviar el mail con el adjunto se deberá tildar la opción:

Adjuntar-llave.png

Aunque no parezca que se adjunta, una vez que enviemos el mail el adjunto aparecerá, si es que tildamos esa opción previamente.

Abrir llaves adjuntadas vía mail

Cuando nos envian un mail con una clave GPG, hay que desplegar la flechita hacía abajo que nos muestra el .asc (la llave pública adjuntada).

Abrir-adjunto.png

Le damos doble click y elegimos importarla:

Importar-gpg.png

Como funciona la firma de un mensaje

La firma de un mensaje se usa para asegurar la autoría del mismo y que el contenido es fiel y no ha sufrido alteraciones por el camino.

Para entender como funciona la firma, primero necesitamos entender lo que es un hash o checksum.

El hash es un código alfanumérico resultante de una serie de cálculos matemáticos que se le hacen a un mensaje. Si cambiase algún caracter del mensaje el nuevo hash seria diferente.

De esta forma, al recibir un mensaje, si uno calcula el hash y resulta coincidente con el hash que calculó el autor, se puede asegurar que el contenido no ha sido modificado.

Ahora, como hace el autor del mensaje para pasarte el hash que calculo sobre aquello que escribió de forma tal de que podamos ambos estar seguros de que el hash no pueda ser alterado por un tercero? Simple, lo cifra con su llave privada. Así, quien reciba el hash cifrado sólo podrá descifrarlo con la llave pública del autor, asegurandose que proviene de quien dice enviarlo.

Llamamos firma, al hash calculado sobre el contenido del mensaje y cifrado con la llave privada del autor.

Al recibir un mensaje firmado, desciframos el contenido de la firma, lo que nos devuelve el hash calculado por el autor. Calculamos nosotras el hash sobre el contenido del mensaje que recibimos y lo comparamos con el que obtuvimos de la firma. Si son coincidentes, entonces sabemos que el mensaje es fiel a lo escrito y que proviene de quien dice enviarlo. Si lo hashes no coinciden, entonces, o bien el mensaje no proviene de quien dice enviarlo, o bien ha cambiado el contenido del mensaje por el camino ... en cualquier caso, descartamos el mensaje.

Firmar y encriptar

Al firmar un mensaje, aseguro que proviene de mi persona y que el contenido no ha sido alterado ... pero cualqueira puede leer el contenido del mismo.

Al cifrar un mensaje usando la llave pública de la destinataria, aseguro que sólo ella pueda leerlo ... pero no puedo asegurar que haya sido yo quien lo escribió, ni que el mensaje no haya sufrido alteraciones por el camino (cualquiera podría cambiarlo por otro mensaje diferente cifrado también con la llave pública de la destinataria).

Entonces, para asegurar que el mensaje es fiel, que proviene de quien dice ser la autora, y que sea sólo leído por la destinataria debemos firmar (con nuestra llave privada) y cifrar (con la llave pública de la destinataria) el mismo mensaje.

Gestores de gpg

Todo esto suena muy complejo y engorroso para hacer de forma manual cada vez que enviemos un mensaje. Y más aún si estamos intercambiando mensajes con varias personas a la vez, lo que obligaria a enviar varios mensajes con el mismo contenido, una para cada destinataria cifrados con su llave publica.

Por suerte, alguien ya pensó en esto y hoy contamos con complementos para los distintos clientes de correo que nos ayudan a hacer de toda la gestión de llaves, firmas, cifrados y verificaciones mucho más simple y casi transparente.

Más abajo describimos algunos de estos complementos para los clientes de correo que más utilizamos.

Llaves Maestras y Sub-llaves

Existen en gpg dos tipos de llaves, las maestras y las sub-llaves. A cada llave en nuestro llavero le asignamos un nivel de confianza. En gpg, la confianza es transitiva. Esto quiere decir que, por propiedad transitiva, confiamos en quienes confían las llaves en que elegimos confiar.

Las llaves maestras, son las llaves de mayor nível de una usuaria. Estas llaves maestras pueden tener vinculadas sub-llaves. Si confiamos en una llave maestra, automáticamente vamos a confiar también en las sub-llaves que cuentan con la confianza de la llave maestra.

Entonces, cuando contactamos con una par, le pasamos nuestra llave maestra pública para que confíe en ella. Si luego creamos sub-llaves y les asignamos la plena confianza de nuestra la llave maestra. Nuestra par va a confiar automáticamente en estas nuevas sub-llaves.

Y esto para que se usa? Se utiliza para agregar una capa más de seguridad. Al haber establecido confianza al nivel de llave maestra, pero usar de diario sub-llaves que cuenten con la plena confianza de la llave maestra, podemos rotar o renovar las sub-llaves periódicamente sin tener que volver a establecer el vínculo de confianza.

Simplemente, revocamos la confianza de nuestra llave maestra sobre las sub-llaves que queremos dejar de usar y le asignamos plena confianza a un nuevo par de sub-llaves que reemplazan a las anteriores. Para todas las pares que confían en nuestra llave maestra, este cambio de sub-llaves es transparente y no hace falta reestablecer un nuevo vínculo de confianza.

Si utilizacemos sólo las llaves maestras, en lugar de sub-llaves, al dar de baja la llave perderíamos la confianza de nuestras pares y tendríamos que volver a establecerla.

Una vuelta más

Las más paranóicas, además, guardamos nuestra llave maestra fuera de los equipos que usamos diariamente, e idealmente en un lugar seguro sin acceso a ningún tipo de red (ej: en un llavero usb, un papel impreso). Así, si algún día perdemos nuestro equipo, o pensamos que alguien comprometió nuestro llavero, nuestra llave maestra, aquella en la que confían nuestras pares, está segura en otro sitio y, en el peor de los escenarios, sólo tendríamos que utilizar la llave maestra para cancelar las sub-llaves que veniamos usando y crear un nuevo par de sub-llaves.

Otra medida más de seguridad es generar un código de revocación de la llave maestra. Con el podremos revocar en cualquier momento nuestra llave maestra, aún sin tener acceso a ella. Esto se utilizaría en un escenario aún más extremo, en el cual o en perdamos la llave maestra o pensemos que ha sido comprometida (a pesar de no usarla más que para crear y revocar sub-llaves). En este caso, nuestro codigo de revocación nos permite avisar a la comunidad gpg que nuestra llave maestra, y todas sus sub-llaves, han dejado de ser validas.

Si vas a exportar tu llave maestra y generar un código de revocación, demás está decir que no deberías guardarlos en el mismo lugar ;p

Configuración previa (opcional)

  • configura los parametros necesarios para la generación de llaves muy seguras, gpg.conf
  • nos permite establecer una conexión segura con el servidor de llaves, sks-keyservers.netCA.pem
  • acelera la generación de llaves, haveged


Voy a copiar el contenido de dos archivos de http://github.com/fauno/duraskel Esto se puede hacer desde la terminal usando Git (no como root, sino desde tu usuario):

$ git clone http://github.com/fauno/duraskel
Nota: asegúrate que no estés en terminal como "root"

Para ver los archivos que se copiaron y que nos interesan:

$ cd ~/duraskel/src/.gnupg
$ ls

Allí deberán estar listados estos archivos: gpg.conf sks-keyservers.netCA.pem

Por un lado, vamos a crear, en el directorio Home, en la subcarpeta .gnupg, el archivo txt de configuración gpg.conf (uno de los que bajamos con el git)

Después, guardamos en esa misma carpeta el certificado del servidor de llaves para que siempre se conecte con ese servidor de forma segura para obtener/mandar llaves sks-keyservers.netCA.pem (el segundo archivo que bajamos con el git)

Instalamos el paquete Haveged, un generador de números aleatorios.

$ sudo apt-get install haveged
$ sudo service haveged start
$ sudo service haveged enable

En Arch Linux

$ sudo pacman -Sy haveged
$ sudo systemctl start haveged
$ sudo systemctl enable haveged
Nota: Si tu sistema no tiene este programa podes seguir la guiá, solo va a tardar más en generar la llave.

Crear subkeys

Crear Subkey para Firmar

$ gpg --edit (version corta después del Ox, en el ejemplo: 18893E37090D6ADD)
$ addkey
  • En la primera opción, selecciona la opción (4) RSA (sólo firmar).
  • En la segunda opción, escoge la clave de 4096bi = + seguridad
  • En la tercera opción, selecciona que no caduque nunca la clave (opción 0) y S (sí), a continuación.

Guardamos los cambios:

$ save

Crear Subkey para Cifrar

$ gpg --edit (version corta después del Ox, en el ejemplo: 18893E37090D6ADD)
$ addkey
  • En la primera opción, selecciona la opción (6) RSA (sólo cifrar).
  • En la segunda opción, escoge la clave de 4096bi = + seguridad
  • En la tercera opción, selecciona que no caduque nunca la clave (opción 0) y S (sí), a continuación.

Guardamos los cambios:

$ save


Otorgar confianza a llaves

Desde el servidor

Una vez importada la llave de la persona, vamos a editarla para cambiarle el "nivel de confianza" que le tenemos.

$ gpg --edit-key mail

trust>>sign>>save

Cada tanto hagan un gpg --refresh-keys así se traen las firmas nuevas y las llaves que ya no sirven se limpian.

Nota: esta firma de llaves es pública, por lo que otorgar confianza a través del servidor puede poner en evidencia nuestra red de confianza. Para evitarlo es posible firmar las claves localmente.

Localmente

Si se firma una llave localmente no estamos evidenciando nuestros lazos de confianza.

$ gpg --lsign-key mail

Configuración en cliente de correo Claws

ver>> fuente de mensaje

Nota: por si acaso, reinicia claws ahora

para que no esté todo el rato pidiéndome la contraseña menú de aplicaciones >> config >> sesión e inicio añadir>> gpg gpg-agent --daemon

Referencias