Cómo manejar la depreciación de apt-key y add-apt-repository utilizando gpg para agregar repositorios externos en Ubuntu 22.04

Introducción

apt-key es una utilidad utilizada para gestionar las claves que APT utiliza para autenticar paquetes. Está estrechamente relacionada con la utilidad add-apt-repository, que agrega repositorios externos utilizando servidores de claves a la lista de fuentes confiables de una instalación de APT. Sin embargo, las claves agregadas con apt-key y add-apt-repository son confiables globalmente por apt. Estas claves no se limitan a autorizar el único repositorio para el que fueron destinadas. Cualquier clave agregada de esta manera puede usarse para autorizar la adición de cualquier otro repositorio externo, lo que representa una preocupación de seguridad importante.

A partir de Ubuntu 20.10, el uso de apt-key genera una advertencia de que la herramienta será obsoleta en el futuro cercano; de manera similar, add-apt-repository también será obsoleta pronto. Aunque estas advertencias de obsolescencia no impiden estrictamente el uso de apt-key y add-apt-repository con Ubuntu 22.04, no es recomendable ignorarlas.

La mejor práctica actual es usar gpg en lugar de apt-key y add-apt-repository, y en futuras versiones de Ubuntu será la única opción. apt-key y add-apt-repository siempre han actuado como envoltorios, llamando a gpg en el fondo. Usar gpg directamente elimina al intermediario. Por esta razón, el método gpg es compatible con versiones anteriores de Ubuntu y se puede usar como un reemplazo directo de apt-key.

Este tutorial describirá dos procedimientos que utilizan alternativas a apt-key y add-apt-repository, respectivamente. Primero será agregar un repositorio externo usando una clave pública con gpg en lugar de usar apt-key. Segundo, como un añadido, este tutorial cubrirá la adición de un repositorio externo usando un servidor de claves con gpg como una alternativa a usar add-apt-repository.

Prerrequisitos

Para completar este tutorial, necesitarás un servidor Ubuntu 22.04. Asegúrate de configurarlo de acuerdo a nuestra guía de configuración inicial de servidor para Ubuntu 22.04, con un usuario no root con privilegios de sudo y un firewall habilitado.

Paso 1: Identificar los Componentes y el Formato Clave

PGP, o Pretty Good Privacy, es un programa de cifrado propietario utilizado para firmar, cifrar y descifrar archivos y directorios. Los archivos PGP son archivos de clave pública, que se utilizan en este proceso para autenticar repositorios como fuentes válidas dentro de apt. GPG, o GNU Privacy Guard, es una alternativa de código abierto a PGP. Los archivos GPG suelen ser anillos de claves, que son archivos que contienen múltiples claves. Ambos tipos de archivo se utilizan comúnmente para firmar y cifrar archivos.

gpg es la herramienta de línea de comandos de GPG que se puede utilizar para autorizar repositorios externos para su uso con apt. Sin embargo, gpg solo acepta archivos GPG. Para utilizar esta herramienta de línea de comandos con archivos PGP, debes convertirlos.

Elasticsearch presenta un escenario común para la conversión de claves, y se utilizará como ejemplo para esta sección. Descargarás una clave formateada para PGP y la convertirás en un formato compatible con apt con una extensión de archivo .gpg. Esto lo harás ejecutando el comando gpg con la bandera --dearmor. A continuación, agregarás el enlace del repositorio a la lista de fuentes de paquetes, mientras adjuntas una referencia directa a tu clave convertida. Finalmente, verificarás este proceso instalando el paquete Elasticsearch.

Proyectos que requieren agregar repositorios con verificación de clave siempre te proporcionarán una clave pública y una URI del repositorio que representa su ubicación exacta. Para nuestro ejemplo de Elasticsearch, la documentación proporciona estos componentes en su página de instalación.

Aquí están los componentes dados para Elasticsearch:

  • Clave: https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • Repositorio: https://artifacts.elastic.co/packages/7.x/apt stable main

A continuación, tienes que determinar si te han dado un archivo PGP o GPG para trabajar. Puedes inspeccionar el archivo de clave abriendo la URL con curl:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch

Esto mostrará el contenido del archivo de clave, que comienza con lo siguiente:

Output
-----BEGIN PGP PUBLIC KEY BLOCK----- . . .

A pesar de tener GPG en la URL, la primera línea indica que en realidad es un archivo de clave PGP. Toma nota de esto, porque apt solo acepta el formato GPG. Originalmente, apt-key detectaba archivos PGP y los convertía automáticamente a GPG llamando a gpg en segundo plano. El paso 2 cubrirá tanto la conversión manual de PGP a GPG, como lo que se debe hacer cuando no se necesita la conversión.

Paso 2 — Descargar la clave y convertirla a un tipo de archivo compatible con apt

Con el método gpg, siempre debes descargar la clave antes de agregarla a la lista de fuentes de paquetes. Anteriormente, con apt-key, este orden no siempre se cumplía. Ahora, se requiere que hagas referencia a la ruta del archivo de clave descargado en tu lista de fuentes. Si no has descargado la clave, obviamente no puedes hacer referencia a una ruta existente.

Con Elasticsearch estás trabajando con un archivo PGP, así que lo convertirás a formato de archivo GPG después de descargarlo. El siguiente ejemplo usa curl para descargar la clave, con la descarga dirigida a un comando gpg. Se llama a gpg con la bandera --dearmor para convertir la clave PGP en un archivo GPG, con -o usado para indicar la salida del archivo.

En Ubuntu, el directorio /usr/share/keyrings es la ubicación recomendada para tus archivos GPG convertidos, ya que es la ubicación predeterminada donde Ubuntu almacena sus anillos de claves. El archivo se llama elastic-7.x.gpg en este ejemplo, pero cualquier nombre funciona:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg

Esto convierte el archivo PGP al formato GPG correcto, haciéndolo listo para ser agregado a la lista de fuentes para apt.

Nota: Si el archivo descargado ya estaba en formato GPG, podrías en su lugar descargar el archivo directamente a /usr/share/keyrings sin convertirlo usando un comando como el siguiente ejemplo:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

En este caso, la salida del comando curl se dirigiría a tee para guardar el archivo en la ubicación correcta.

Step 3 – Agregando el Repositorio a tu Lista de Fuentes de Paquetes

Con la clave descargada y en el formato de archivo GPG correcto, puedes agregar el repositorio a las fuentes de paquetes apt mientras lo vinculas explícitamente con la clave que obtuviste. Hay tres métodos para lograr esto, todos ellos relacionados con la forma en que apt encuentra las fuentes. apt extrae las fuentes de un archivo central sources.list, archivos .list en el directorio sources.list.d, y archivos .source en el directorio sources.list.d. Aunque no hay una diferencia funcional entre las tres opciones, se recomienda considerar las tres opciones y elegir el método que mejor se adapte a tus necesidades.

Opción 1 – Agregar Directamente a sources.list

El primer método implica insertar una línea que represente la fuente directamente en /etc/apt/sources.list, el archivo principal que contiene las fuentes de apt. Hay múltiples fuentes en este archivo, incluidas las fuentes predeterminadas que vienen con Ubuntu. Es perfectamente aceptable editar este archivo directamente, aunque la Opción 2 y la Opción 3 presentarán una solución más modular que puede ser más fácil de editar y mantener.

Abre /etc/apt/sources.list con nano o tu editor de texto preferido:

  1. sudo nano /etc/apt/sources.list

Luego agrega el repositorio externo al final del archivo:

/etc/apt/sources.list
. . .
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main

Esta línea contiene la siguiente información sobre la fuente:

  • deb: Esto especifica que la fuente utiliza una arquitectura regular de Debian.
  • arch=amd64,arm64 especifica las arquitecturas a las que se descargarán los datos de APT. Aquí son amd64 y arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: Esto especifica la clave utilizada para autorizar esta fuente, y aquí apunta hacia tu archivo .gpg almacenado en /usr/share/keyrings. Esta parte de la línea debe incluirse, aunque anteriormente no era necesario en el método apt-key. Esta adición es el cambio más crítico al alejarse de apt-key, ya que vincula la clave a un repositorio singular que está autorizado para autorizar y soluciona la falla de seguridad original en apt-key.
  • https://artifacts.elastic.co/packages/7.x/apt stable main: Esta es la URI que representa la ubicación exacta donde se puede encontrar los datos dentro del repositorio.
  • /etc/apt/sources.list.d/elastic-7.x.list: Este es el lugar y el nombre del nuevo archivo que se creará.
  • /dev/null: Se utiliza cuando la salida de un comando no es necesaria. Apuntar tee a esta ubicación omite la salida.

Guardar y salir presionando CTRL+O y luego CTRL+X.

Opción 2 — Crear un Nuevo Archivo .list en sources.list.d

Con esta opción, en lugar de eso, se creará un nuevo archivo en el directorio sources.list.d. apt analiza tanto este directorio como sources.list en busca de adiciones de repositorios. Este método le permite aislar físicamente las adiciones de repositorios en archivos separados. Si alguna vez necesita eliminar esta adición o hacer ediciones, puede eliminar este archivo en lugar de editar el archivo central sources.list. Mantener sus adiciones separadas facilita el mantenimiento y editar sources.list puede ser más propenso a errores que afecten a otros repositorios en el archivo.

Para hacer esto, dirija la salida de un comando echo a un comando tee para crear este nuevo archivo e insertar la línea correspondiente. En el siguiente ejemplo, el archivo se llama elastic-7.x.list, pero cualquier nombre funciona siempre que sea un nombre de archivo único en el directorio:

  1. echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null

Este comando es idéntico a crear el archivo manualmente e insertar la línea de texto adecuada.

Opción 3 — Crear un archivo .sources en sources.list.d

El tercer método escribe en un archivo .sources en lugar de un archivo .list. Este método es relativamente nuevo y utiliza el formato multilineal deb822, que es menos ambiguo en comparación con la declaración deb . . ., aunque es funcionalmente idéntico. Cree un archivo nuevo:

  1. sudo nano /etc/apt/sources.list.d/elastic-7.x.sources

Luego agregue el repositorio externo utilizando el formato deb822:

/etc/apt/sources.list.d/elastic-7.x.sources
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main

Guarde y salga después de haber insertado el texto.

Esto es análogo al formato de una sola línea, y haciendo una comparación línea por línea se muestra que la información en ambos es idéntica, solo organizada de manera diferente. Una cosa a tener en cuenta es que este formato no utiliza comas cuando hay múltiples argumentos (como con amd64,arm64), y en su lugar utiliza espacios.

A continuación, verificará este proceso realizando una instalación de prueba.

Paso 4 — Instalando el paquete desde el repositorio externo

Debe llamar a apt update para solicitar a apt que examine el archivo principal sources.list, así como todos los archivos .list y .sources en sources.list.d. Llamar a apt install sin hacer primero una actualización causará una instalación fallida o la instalación de un paquete predeterminado desactualizado desde apt.

Actualice sus repositorios:

  1. sudo apt update

Luego instale su paquete:

  1. sudo apt install elasticsearch

Nada cambia en este paso en comparación con el método apt-key. Una vez que este comando termine, habrá completado la instalación.

Agregado – Agregar un Repositorio Externo Usando un Servidor de Claves

Esta sección describirá brevemente cómo utilizar gpg con un servidor de claves en lugar de una clave pública para agregar un repositorio externo. El proceso es casi idéntico al método de clave pública, con la diferencia de cómo se llama a gpg.

add-apt-repository es el equivalente basado en keyserver de apt-key, y ambos están en proceso de ser obsoletos. Este escenario utiliza componentes diferentes. En lugar de una clave y un repositorio, se proporciona una URL del keyserver y un ID de clave. En este caso, puedes descargar desde el keyserver directamente en el formato .gpg apropiado sin necesidad de convertir nada. Debido a que add-apt-repository pronto quedará obsoleto, en su lugar usarás gpg para descargar a un archivo, sobrescribiendo el comportamiento predeterminado de gpg de importar a un keyring existente.

Usando el lenguaje de programación de código abierto R como ejemplo, aquí están los componentes dados, que también se pueden encontrar en las instrucciones de instalación en el sitio del proyecto oficial:

  • Keyserver: keyserver.ubuntu.com
  • ID de Clave: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Repositorio: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

Primero, descarga directamente desde el keyserver usando gpg. Ten en cuenta que dependiendo del tráfico de descargas, este comando de descarga puede tardar un tiempo en completarse:

  1. sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

Este comando incluye las siguientes banderas, que son diferentes de usar gpg con una clave pública:

  • --no-default-keyring combinado con --keyring permite la salida a un archivo nuevo en lugar de importar a un keyring existente, que es el comportamiento predeterminado de gpg en este escenario.
  • --keyserver combinado con --recv-keys proporciona la clave específica y la ubicación desde la que estás descargando.
  • --homedir se utiliza para sobrescribir la ubicación predeterminada de gpg para crear archivos temporales. gpg necesita crear estos archivos para completar el comando, de lo contrario, gpg intentará escribir en /root, lo que causa un error de permiso. En cambio, este comando coloca los archivos temporales en el directorio /tmp apropiado.

A continuación, añade el repositorio a un archivo .list. Esto se hace de la misma manera exacta que agregar un repositorio externo usando una clave pública mediante el uso de un comando echo en un comando tee:

  1. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null

A continuación, actualiza tu lista de repositorios:

  1. sudo apt update

Luego puedes instalar el paquete:

  1. sudo apt install r-base

Usar gpg para agregar repositorios externos es similar entre claves públicas y servidores de claves, con la diferencia de cómo llamas a gpg.

Conclusión

Añadir un repositorio externo usando una clave pública o un servidor de claves se puede hacer a través de gpg, sin necesidad de usar apt-key o add-apt-repository como intermediario. Utiliza este método para asegurarte de que tu proceso no se vuelva obsoleto en futuras versiones de Ubuntu, ya que apt-key y add-apt-repository están obsoletos y serán eliminados en una versión futura. Añadir repositorios externos usando gpg asegura que una clave solo se usará para autorizar un único repositorio según tu intención.

Source:
https://www.digitalocean.com/community/tutorials/how-to-handle-apt-key-and-add-apt-repository-deprecation-using-gpg-to-add-external-repositories-on-ubuntu-22-04