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
:
- 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:
- 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:
- 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:
- sudo nano /etc/apt/sources.list
Luego agrega el repositorio externo al final del archivo:
. . .
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í sonamd64
yarm64
.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étodoapt-key
. Esta adición es el cambio más crítico al alejarse deapt-key
, ya que vincula la clave a un repositorio singular que está autorizado para autorizar y soluciona la falla de seguridad original enapt-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. Apuntartee
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:
- 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:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
Luego agregue el repositorio externo utilizando el formato deb822
:
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:
- sudo apt update
Luego instale su paquete:
- 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:
- 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 degpg
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 degpg
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
:
- 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:
- sudo apt update
Luego puedes instalar el paquete:
- 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.