Índice
1. Introducción
2. Como funciona
3. Como APT utiliza Release.gpg
4. Como añadir una llave pública
5. Caso: Repositorios oficiales de Debian
6. Referencias y más información
A partir de la versión 0.6, apt comenzó a usar criptografía para
validar los paquetes descargados, a esto se le llama comúnmente “
Secure Apt” (o “apt-secure”).
La
criptografía de llave (o clave) pública se basa en el par de llaves:
una llave pública y
una privada.
Si bien la llave pública se da a todo el mundo, la llave privada debe
permanecer en secreto, así es posible usar una llave privada para firmar
un archivo (no para encriptarlo) y cualquiera que tenga la llave
pública puede comprobar que el archivo fue firmado por esa llave, esto
nos asegura que nadie que no tenga esa llave puede falsificar la firma.
GPG (
GNU Privacy Guard)
es la herramienta que se utiliza en Secure-Apt para firmar los ficheros
y comprobar sus firmas. GPG cifra los mensajes usando pares de claves
individuales asimétricas generadas por los usuarios. Las claves públicas
pueden ser compartidas con otros usuarios de muchas maneras, un ejemplo
de ello es depositándolas en los
servidores de claves.
Apt-key es un programa que se usa para gestionar el
anillo de llaves de gpg para asegurar Apt. El anillo de llaves se guarda
en el archivo
/etc/apt/trusted.gpg (no confundir con el archivo
/etc/apt/trustdb.gpg
con el que está relacionado). Apt-key puede ser usado para mostrar las
llaves en el anillo de llaves, y para añadir o remover una llave.
Así si un paquete viene de un archivo sin firma o con una firma de la
que apt no tiene una clave, se considerará como no confiable y se nos
mostrará la correspondiente advertencia, es decir, apt-get (actualmente)
sólo nos advierte de los archivos sin firmar pero no impide su descarga
y posterior instalación. Sin embargo para los paquetes que vienen
firmados, APT utiliza este sistema de criptografía GPG para validar los
.deb descargados y asegurarse de que no han sido alterados en modo
alguno.
1. Un archivo de Debian contiene un archivo llamado
Release, el cual se actualiza cada vez que cualquiera de los paquetes en el archivo cambian. Entre otras cosas, el fichero
Release contiene algunos md5sums por cada paquete listado en él.
2. Al realizar un update, APT descarga los archivos
Packages.gz,
Release y
Release.gpg.
3. Al descargar un paquete .deb, APT comprueba que su md5sum coincide con la que figura en
Packages.
4. APT se asegura la no alteración del archivo
Packages comprobándo que su md5sum coincide con el que figura en el archivo
Release.
5. Ahora para asegurarse de que el archivo
Release no ha sido alterado, APT comprueba su firma a través del archivo
Release.pgp, es decir Secure-Apt añade una firma gpg para el fichero
Release en el fichero
Release.gpg (que se envía junto al fichero
Release) y para poder realizar esta comprobación APT necesita conocer la llave pública del que firma el archivo.
Secure Apt siempre descarga los ficheros
Release.gpg cuando está descargando los ficheros Release, y si no puede descargar el archivo
Release.gpg, o si la firma está mal, lo advertirá, y nos dirá que el fichero
Packages al cual apunta el fichero
Release, y todos los paquetes enumerados dentro, son de una fuente sin autentificar. Por este motivo, durante un
apt-get update, apararece el famoso:
W: GPG error: http://ftp.us.debian.org testing Release: The following signatures
couldn't be verified because the public key is not available: NO_PUBKEY 010908312D230C5F
(Aquí el inciso de que si tenemos sospechas de que se debe a una
actualización de la base de claves de Debian -usual cuando se lanza una
nueva versión- basta con instalar el paquete debian-archive-keyring
actualizado para resolverlo.) Como ya hemos mencionado, podemos ignorar
ese aviso e intentar instalar un paquete, al hacerlo Apt nos advertirá
de nuevo:
WARNING: The following packages cannot be authenticated!
libglib-perl libgtk2-perl
Install these packages without verification [y/N]?
Como vemos APT nos permite aceptar la instalación de paquetes sin
verificar, pero el problema (peligro) es que no podríamos saber si ese
paquete es el paquete que realmente queremos instalar, o si es otro
distinto al que queremos y lleva dentro una desagradable sorpresa.
NOTA: podemos deshabilitar esas comprobaciones ejecutando apt con –allow-unauthenticated.
Como vemos la seguridad del sistema entero depende de que haya un fichero
Release.gpg, el cual firma un fichero
Release,
y de APT comprobando que esa firma use gpg. Para comprobar la firma,
APT debe conocer la llave pública de la persona que firmó el fichero.
Esas llaves se mantienen en el anillo de llaves de APT (
/etc/apt/trusted.gpg), y administrando esas llaves es donde aparece Secure Apt.
Por defecto, los sistemas Debian vienen preconfigurados con la llave
del archivo Debian en el anillo de llaves, así a modo de ejemplo podemos
ver que llaves públicas tenemos haciendo:
# apt-key list
obtenemos
/etc/apt/trusted.gpg
--------------------
pub 1024D/6070D3A1 2006-11-20 [expires: 2009-07-01]
uid Debian Archive Automatic Signing Key (4.0/etch) <ftpmaster@debian.org>
Aquí 6070D3A1 es la identificación de la llave pública, y podemos ver
que esta llave sólo es válida por tiempo, Debian rota estas llaves como
última línea de defensa contra algunas brechas de seguridad que rompen
una llave. Con ello APT consigue certificar el archivo oficial de
Debian.
Si se añade algún otro repositorio al archivo
/etc/apt/sources.list,
tendremos que darle a APT su llave, es decir, deberemos añadir su llave
pública al anillo de llaves para que APT pueda certificar su contenido.
El proceso se divide en dos etapas:
1. Obtener la llave pública
2. Exportar esa llave y añadirla
Pongamos un ejemplo:
Si añadimos el repositorio de debian-multimedia a nuestro archivo
/etc/apt/sources.list:
deb http://www.deb-multimedia.org stable main non-free
En principio no tenemos su llave pública, por tanto al actualizar el índice de paquetes de nuestros repositorios:
# aptitude update
Se nos mostrará la siguiente advertencia:
W: GPG error: http://www.deb-multimedia.org stable main Release: The following signatures
couldn't be verified because the public key is not available: NO_PUBKEY 07DC563D1F41B907
Debemos fijarnos en el número que nos muestra: 07DC563D1F41B907
GPG tiene una forma estándar de distribuir llaves, utiliza servidores
de llaves y desde uno de ellos gpg puede descargarse la llave pública,
para elo ejecutamos:
# gpg --keyserver subkeys.pgp.net --recv-keys 07DC563D1F41B907
Una vez obtenida, sólo nos falta exportarla y añadirla:
# gpg --export --armor 07DC563D1F41B907 | apt-key add -
Y finalizamos el proceso con un:
# apt-get update
NOTA: en el caso concreto de deb-multimedia, el procedimiento se puede simplificar instalando el paquete
deb-multimedia-keyring
Disponemos de los paquetes:
debian-keyring, contiene las firmas de los desarrolladores de Debian, que es utilizada para verificar cada paquete.
debian-archive-keyring, el proyecto Debian firma digitalmente sus archivos «Release». Este paquete contiene las claves que se utilizan para ello.
Extraido: http://www.esdebian.org/wiki/llaves-repositorios-secure-apt