Llaves, repositorios y Secure APT

Solapas principales

Indice

1. Introducció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.

2. Como funciona:

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.

3. Como APT utiliza Release.gpg:

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 haciend

  # 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) 

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.

4. Como añadir una llave pública:

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

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

NOTA 2: El paquete deb-multimedia-keyring ya no se encuentra en repositorios hace tiempo. Para instalarlo podemos hacer lo siguiente:

wget http://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.8.1_all.deb
 sudo dpkg -i deb-multimedia-keyring_2016.8.1_all.deb

Podemos verificar la integridad del paquete:

sha256sum deb-multimedia-keyring_2016.8.1_all.deb
 9faa6f6cba80aeb69c9bac139b74a3d61596d4486e2458c2c65efe9e21ff3c7d deb-multimedia-keyring_2016.8.1_all.deb

5.Caso: Repositorios oficiales de Debian

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.

6. Referencias y más información

http://wiki.debian.org/SecureApt (inglés)

http://www.esdebian.org/articulos/23869/secure-apt (traducción al español)

https://deb-multimedia.org/

man apt-secure

man apt-key

man gpg