Este documento forma parte de una serie de 3 que intentaran describir la creacion de paquetes debian firmados con gpg ademas de el montaje de un repositorio personalizado construido con reprepro e igualmente firmado para evitar mensajes de error en apt .Este repositorio contendra software distinto al que existe en los repositorios oficiales de debian, por lo tanto este no sera un mirror (copia fiel de un repositorio debian)
En este howto se tocara el punto de la generacion de las llaves gpg necesarias para firma los paquetes y el repositorio.Como ya es costumbre hare las acotaciones necesarias para seguir correctamente el proceso.
Como regla general se estableceran durante el desarrollo de este documento la sigueinetes directivas
1-Todos los comando ejecutados como usuario normal estaran precedidos por un simbolo "$" el cual no forma parte del comando y solo se usara como referencia , por ejemplo :
$ mkdir -p /home/loquesea
2-Todos los comandos ejecutados com root (administardor) estaran precedidos por el simbolo "#" el cual no forma parte del coamdo y solo se usara comor eferencia , por ejemplo:
# mkdir -p /etc/loquesea
3-En caso de que un comando no presente ninguno de los 2 sombolos anterirores , es entonces un indicativo de que puede ser ejecutado indistintamente ya sea como root o como user , como ejemplo
mkdir -p /loquesea
4-Para crear archivos de configuracion nuevos se usuara un comando del tipo
cat > /etc/vsftpd.conf << EOF
aca va el contenido
EOF
El ejemplo anteriror ilustra el funcionamiento del comando , es decir , dicho comando solicita al sistema la creacion de un archivo llamado "vsftp.conf" en la ruta /etc con el contenido "aca va el contenido" .Es recomendable si no se tiene mucha experiencia en linux , hacer copy & paste de estos comandos.
Si vas a hacer "copy & paste" asegurate de omitir los simbolos "$" "#" en el comandno
GENERACION DE LA LLAVE GPG
Para generar nuestra llave sera necesario hacer uso del programa gnupg , el cual dbera estar correctamente instalado en el sistema .Para comprobar esto podemos ejecutar en terminal:
- Código: Seleccionar todo
$ which gpg
lo cual devolvera la ruta del ejecutable :
- Código: Seleccionar todo
/usr/bin/gpg
Si no es asi , entonces habra que instalar el programa
- Código: Seleccionar todo
# apt-get install gnupg
acto seguido generamos la llave necesaria
- Código: Seleccionar todo
gpg --gen-key
lo cual creara un directorio oculto en nuestro home llamado ".gnupg" (~/.gnupg) y durante el proceso se haran varias preguntas , la primera de estas se refiere al tipo de llave deseada a lo que reponderemos con la opcion 1
- Código: Seleccionar todo
Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection?
Despues se no cuestionara acerca del nivel de encriptacion deseasdo, he de mencionar que a mayor nivel de encriptacion obiamente se gana mayor seguridad per tambien se obtiene mayor lentitud durante el proceso de firmado , un buen nivel de segurirdad y rapidez seri 1024 , asi pues elegimos ensta cantidad.
- Código: Seleccionar todo
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 1024
Despues se nos pedira elegir el tiempo de vida de nuestra llave.Si solo vas a testear el funcionamiento de esto y/o apenas te esta familiarizando con estos procesos entonces elije un tiempo de validez pequeño ,tal vez una semana seria suficiente.Sin embargo si deseas usar permanentemente esta llave de hoy en adelante podrias elegir la primera opcion " 0 = key does not espire " lo cual hara tu clave permanente y sin caducidad, de cualquier forma si tu clave se viera comprometida por alguna situacion , mas adelante sera generado un certificado de revocacion el cual puede ser usado para inhabilitar dicha clave . A manera de ejmplo elegire en este documento 1 semana
- Código: Seleccionar todo
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1w
Se nos pedira configrmacion respecto al tiempo de vida de la llave
- Código: Seleccionar todo
Key expires at jue 07 feb 2008 13:00:32 CST
Is this correct? (y/N) y
Ahora se nos solicitaran algunos datos personales para genera la clave
- Código: Seleccionar todo
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: Miguel Angel Reynosso Reyes
Email address: miguex@ikimlinux.org
Comment: miguex key
Una vez insertados los datos necesario se nos pedira confirmacion nuevamente
- Código: Seleccionar todo
You selected this USER-ID:
"Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
Si todo es correcto , entonces escribimos la letra "O" , lo cual nos pedira el passpharse o sea la contraseña de la llave. Esta contraseña nos sera solicitada cada vez que firmemos algo , por ejmplo un paquete deb o un archivo release o lo que sea, entonces hay que asegurarse de recordar dicho passspharse.
- Código: Seleccionar todo
Enter passphrase:
Repeat passphrase:
y damos enter para comenzar la generacion de la llave. En este punto es altamente recomendable que duarante el proceso de encriptacion se use el teclado o se realiza una busqueda grande con locate para generar suficiente "entropy"
- Código: Seleccionar todo
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++.+++++.+++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
+++++.++++++++++.+++++++++++++++>++++++++++.....................................>+++++...........<+++++....................
.........................<..+++++.......>+++++.......<.+++++..>+++++...+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++++++++++++++++++++++.++++++++++.+++++++++++++++++++++++++++++++++++.++++++++++.++++++++++..++++++++
++++++++++++++++++++++++++++++++>+++++..............................+++++^^^^
Y al terminar el proceso deberiamos ver alg como esto
- Código: Seleccionar todo
gpg: /home/miguel/.gnupg/trustdb.gpg: trustdb created
gpg: key 41000068 marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2008-02-07
pub 1024D/41000068 2008-01-31 [expires: 2008-02-07]
Key fingerprint = 3509 22FE AF54 C3DB 84C4 A07A 40C2 BD6A 4100 0068
uid Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>
sub 1024g/637E41B3 2008-01-31 [expires: 2008-02-07]
En este caso las llaves estan listas y el ID de usuario es "41000068" el cual esta claramente en el renglon
pub 1024D/41000068 2008-01-31 [expires: 2008-02-07]
Ademas la huella es "3509 22FE AF54 C3DB 84C4 A07A 40C2 BD6A 4100 0068"
y esta en el renglon
Key fingerprint = 3509 22FE AF54 C3DB 84C4 A07A 40C2 BD6A 4100 0068
El ID de usuario sirve para identificar las claves y/o poder localizarlas en los servidores de llaves. La Huella sirve para comprovar la validez e integridad de una clave.
Estos datos pueden ser consultados cada vez que sea necesario con el comando en un terminal
- Código: Seleccionar todo
gpg --fingerprint
lo cual devolvera
- Código: Seleccionar todo
/home/miguel/.gnupg/pubring.gpg
-------------------------------
pub 1024D/41000068 2008-01-31 [expires: 2008-02-07]
Key fingerprint = 3509 22FE AF54 C3DB 84C4 A07A 40C2 BD6A 4100 0068
uid Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>
sub 1024g/637E41B3 2008-01-31 [expires: 2008-02-07]
Adicionalmente podriamos querer listar la llaves en la base de datos
- Código: Seleccionar todo
gpg --key-list
- Código: Seleccionar todo
-------------------------------
pub 1024D/41000068 2008-01-31 [revoked: 2008-01-31]
uid Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>
Esto nos mostrara las llaves que tenemos en nuestro circulo de confianza , en este caso solo esta una pero si tienes varias deberian aparecer todas , absolutamente todas las que tu sabes que haz importado.
ENVIO DE LA CLAVE A UN SERVDOR DE LLAVES.
Para que cualquier persona pueda consultar nuestra clave para por ejemplo importarla con apt-key o comprobar un documento o correo electronico firmado por nosotros sera entoces necesario enviar dicha clave a un servidor de llaves publico , par esto primero exportamos nuestra clave a formato de texto plano para poder usarla por ejemplo en nuestro blog o pagina web
- Código: Seleccionar todo
gpg --export -a [ID de usuario] > publica.asc
esto esportara nuestra llave en un texto plano , si deseamos esportarla en formato binario bastara con omitir la opcion "-a" en el comando anteriror.
Bien , para enviar nuestra llave a un servidor publico bastara con ejecutar
- Código: Seleccionar todo
gpg --keyserver pgp.rediris.es --send-keys [ID de usuario]
CERTIFICADO DE REVOCACION.
La generacion de un certificado de revocacion puede no ser un punto critico si es que la clave que se esta generando sera usada solo para fines de ensayo .Sin embargo ,si planeas usar esta clave definitivamente y para todo lo que sea necesario , entonces si que te recomiendo genera un certificado de revocacion valido ,pues esto te permitira anular inediatamente la validez de la clave en caso de que alguien usurpe tu identidad o se te presente cualquier otro problema de seguridad que comprometa dicha clave.
A manera de practia generaremos el certificado de revocacion para la clave anteriormente creada con el comando :
- Código: Seleccionar todo
$ gpg -o ~/.gnupg/revoke.asc --gen-revoque [ID de usuario]
donde el [ID de usuario] debe ser reemplazado por el propio , en este caso 41000068 , esto nos preguntara algunas cosas extras , como :el motivo prar revocar la validez de la clave , una breve descripcio para este certificado y el phassparse o contraseña de la clave de usuario..
- Código: Seleccionar todo
sec 1024D/41000068 2008-01-31 Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>
Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
0 = No reason specified
1 = Key has been compromised
2 = Key is superseded
3 = Key is no longer used
Q = Cancel
(Probably you want to select 1 here)
Your decision? 0
Enter an optional description; end it with an empty line:
>Revoke cert for miguex
>
Reason for revocation: No reason specified
Revoke cert for miguex
Is this okay? (y/N) y
Se nos pedira el passpharse
- Código: Seleccionar todo
You need a passphrase to unlock the secret key for
user: "Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>"
1024-bit DSA key, ID 41000068, created 2008-01-31
Enter passphrase:
Despues parecera un texto informativo
- Código: Seleccionar todo
ASCII armored output forced.
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system of
your machine might store the data and make it available to others!
y listo , el certificado de revocacion estara en ~/.gnupg , para comprobarlo listamos dicho directorio
- Código: Seleccionar todo
ls -la ~/.gnupg
lo cual deberia devolvernos
- Código: Seleccionar todo
pubring.gpg pubring.gpg~ random_seed revoke.asc secring.gpg trustdb.gpg
si no es asi entonces algo anda maly habara que regresa para resolver el problema.
REVOCANDO LA CLAVE
En caso de ser neceasario hacer uso de este recurso solo bastara con ejecutar:
- Código: Seleccionar todo
gpg --import ~/.gnupg/revoke.asc
Esto inutilizara nuetra clave y no avisara de esto
- Código: Seleccionar todo
gpg: key 41000068: "Miguel Angel Reynosso Reyes (miguex key) <miguex@ikimlinux.org>" revocation certificate imported
gpg: Total number processed: 1
gpg: new key revocations: 1
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2008-02-07
Despues habara que actualizar el servidor publico de llves a donde se subio la clave (en caso de haberla subido a alguno)
- Código: Seleccionar todo
gpg --keyserver pgp.rediris.es --send-keys [ID de usuario]
Como medida de seguridad y poniendonos un poco paranoicos podrias guardar tus claves en un floppy dentro de un directorio llamdo gnupg y despues crear crear un enlace simbolico desde tu home llamado .gnupg a el directorio contenido en el floppy gnupg , la forma de hacer esto seria:
introducimos un floppy de preferencia nuevo en la unida y checamos que nos aseguramos de que no se monte al insertarlo
- Código: Seleccionar todo
$ umount -l /dev/fd0
luego creamos el sistema de archivo vfat
- Código: Seleccionar todo
# mkfs.vfat /dev/fd0
montamos el floppy
- Código: Seleccionar todo
$ mount /dev/fd0
creamos la carpeta necesaria gnupg en el floppy
- Código: Seleccionar todo
$ mkdir -p /media/floppy/gnupg
Copiamo el contenido de la carpeta ~/.gnupg a la carpeta /media/floppy/gnupg
- Código: Seleccionar todo
$ cp -avf ~/.gnupg/* /media/floppy/gnupg
Removemos el directorio ~/.gnupg
- Código: Seleccionar todo
$ rm -rf ~/.gnupg
Despues enlazamos el directorio /media/floppy/gnupg a ~/.gnupg
- Código: Seleccionar todo
$ ln -s /media/floppy/gnupg ~/.gnupg
De esta forma las llaves solo estaran disponibles cuando se inserte el floppy en la unidad ya que el idrectorio donde deberian estar las claves es un enlace a la ubicacion real en el floppy . Esto sin duda hara que ganemos en segurirdad al tener siempe en un lugar seguro nuestras claves aunque a costa del riesgo de que el floppy se estropee o se extraviee
Listo ya tenemos la llave para firmar nuestros paquetes y nuestro repo , en los siguientes capitulos me dirigire a esta llave unicamente con [ID de usuario]

Documento escrito por Miguel A. Reynosso (miguex) bajo liencia Creative Commons.

