Comment gérer l’obsolescence de apt-key et add-apt-repository en utilisant gpg pour ajouter des dépôts externes sur Ubuntu 22.04

Introduction

apt-key est un utilitaire utilisé pour gérer les clés que APT utilise pour authentifier les paquets. Il est étroitement lié à l’utilitaire add-apt-repository, qui ajoute des dépôts externes à une installation APT en utilisant des serveurs de clés pour une liste de sources de confiance. Cependant, les clés ajoutées à l’aide de apt-key et de add-apt-repository sont globalement considérées comme de confiance par apt. Ces clés ne se limitent pas à autoriser le dépôt unique pour lequel elles étaient destinées. Toute clé ajoutée de cette manière peut être utilisée pour autoriser l’ajout de tout autre dépôt externe, ce qui présente un problème de sécurité important.

À partir d’Ubuntu 20.10, l’utilisation de apt-key génère un avertissement indiquant que l’outil sera bientôt obsolète ; de même, add-apt-repository sera également bientôt obsolète. Bien que ces avertissements d’obsolescence n’empêchent pas strictement l’utilisation de apt-key et de add-apt-repository avec Ubuntu 22.04, il n’est pas conseillé de les ignorer.

La meilleure pratique actuelle est d’utiliser gpg à la place de apt-key et add-apt-repository, et dans les futures versions d’Ubuntu, ce sera la seule option. apt-key et add-apt-repository ont toujours agi comme des enveloppes, appelant gpg en arrière-plan. Utiliser gpg directement supprime l’intermédiaire. Pour cette raison, la méthode gpg est rétrocompatible avec les anciennes versions d’Ubuntu et peut être utilisée comme remplacement direct de apt-key.

Ce tutoriel va présenter deux procédures qui utilisent des alternatives à apt-key et add-apt-repository, respectivement. Tout d’abord, nous ajouterons un référentiel externe en utilisant une clé publique avec gpg au lieu d’utiliser apt-key. Ensuite, en complément, ce tutoriel couvrira l’ajout d’un référentiel externe en utilisant un serveur de clés avec gpg comme alternative à l’utilisation de add-apt-repository.

Prérequis

Pour terminer ce tutoriel, vous aurez besoin d’un serveur Ubuntu 22.04. Assurez-vous de le configurer selon notre guide de configuration de serveur initial pour Ubuntu 22.04, avec un utilisateur non-root avec des privilèges sudo et un pare-feu activé.

Étape 1 — Identification des composants et du format clé

PGP, ou Pretty Good Privacy, est un programme de chiffrement propriétaire utilisé pour signer, chiffrer et déchiffrer des fichiers et répertoires. Les fichiers PGP sont des fichiers de clé publique, utilisés dans ce processus pour authentifier les référentiels en tant que sources valides dans apt. GPG, ou GNU Privacy Guard, est une alternative open source à PGP. Les fichiers GPG sont généralement des trousseaux de clés, qui sont des fichiers contenant plusieurs clés. Ces deux types de fichiers sont couramment utilisés pour signer et chiffrer des fichiers.

gpg est l’outil en ligne de commande de GPG qui peut être utilisé pour autoriser les référentiels externes à être utilisés avec apt. Cependant, gpg n’accepte que les fichiers GPG. Pour utiliser cet outil en ligne de commande avec des fichiers PGP, vous devez les convertir.

Elasticsearch présente un scénario courant de conversion de clé et sera utilisé comme exemple pour cette section. Vous téléchargerez une clé formatée pour PGP et la convertirez dans un format compatible avec apt en utilisant une extension de fichier .gpg. Vous ferez cela en exécutant la commande gpg avec le drapeau --dearmor. Ensuite, vous ajouterez le lien du référentiel à la liste des sources de paquets, tout en attachant une référence directe à votre clé convertie. Enfin, vous vérifierez ce processus en installant le paquet Elasticsearch.

Projects nécessitant l’ajout de référentiels avec vérification de clé vous fournira toujours une clé publique et une URI de référentiel représentant son emplacement exact. Pour notre exemple Elasticsearch, la documentation donne ces composants sur leur page d’installation.

Voici les composants donnés pour Elasticsearch:

  • Clé: https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • Référentiel: https://artifacts.elastic.co/packages/7.x/apt stable main

Ensuite, vous devez déterminer si un fichier PGP ou GPG vous est fourni. Vous pouvez inspecter le fichier clé en ouvrant l’URL avec curl:

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

Cela affichera le contenu du fichier clé, qui commence par ce qui suit:

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

Malgré la présence de GPG dans l’URL, la première ligne indique qu’il s’agit en réalité d’un fichier clé PGP. Notez ceci, car apt n’accepte que le format GPG. À l’origine, apt-key détectait les fichiers PGP et les convertissait automatiquement en GPG en appelant gpg en arrière-plan. Étape 2 couvrira à la fois la conversion manuelle de PGP à GPG, et aussi que faire lorsque la conversion n’est pas nécessaire.

Étape 2 — Téléchargement de la clé et conversion en un type de fichier compatible avec apt

Avec la méthode gpg, vous devez toujours télécharger la clé avant de l’ajouter à la liste des sources de paquets. Auparavant, avec apt-key, cet ordre n’était pas toujours imposé. Maintenant, vous devez indiquer le chemin vers le fichier de clé téléchargé dans votre liste de sources. Si vous n’avez pas téléchargé la clé, vous ne pouvez évidemment pas faire référence à un chemin existant.

Avec Elasticsearch, vous travaillez avec un fichier PGP, que vous convertirez en format de fichier GPG après le téléchargement. L’exemple suivant utilise curl pour télécharger la clé, avec le téléchargement transmis à une commande gpg. gpg est appelé avec le drapeau --dearmor pour convertir la clé PGP en format de fichier GPG, avec -o utilisé pour indiquer le fichier de sortie.

Sous Ubuntu, le répertoire /usr/share/keyrings est l’emplacement recommandé pour vos fichiers GPG convertis, car c’est l’emplacement par défaut où Ubuntu stocke ses trousseaux. Le fichier est nommé elastic-7.x.gpg dans cet exemple, mais n’importe quel nom fonctionne:

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

Cela convertit le fichier PGP dans le format GPG correct, le rendant prêt à être ajouté à la liste des sources pour apt.

Note: Si le fichier téléchargé était déjà au format GPG, vous pourriez plutôt le télécharger directement dans /usr/share/keyrings sans le convertir à l’aide d’une commande comme l’exemple suivant:

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

Dans ce cas, la sortie de la commande curl serait transmise à tee pour enregistrer le fichier à l’emplacement correct.

Étape 3 — Ajouter le référentiel à votre liste de sources de packages

Avec la clé téléchargée et dans le bon format de fichier GPG, vous pouvez ajouter le référentiel à la source de packages apt tout en le liant explicitement à la clé que vous avez obtenue. Il existe trois méthodes pour y parvenir, toutes liées à la façon dont apt trouve les sources. apt extrait les sources d’un fichier central sources.list, de fichiers .list dans le répertoire sources.list.d et de fichiers .source également dans le répertoire sources.list.d. Bien qu’il n’y ait aucune différence fonctionnelle entre les trois options, il est recommandé de considérer les trois options et de choisir la méthode qui correspond le mieux à vos besoins.

Option 1 — Ajout direct à sources.list

La première méthode consiste à insérer une ligne représentant la source directement dans /etc/apt/sources.list, le fichier principal contenant les sources apt. Il y a plusieurs sources dans ce fichier, y compris les sources par défaut fournies avec Ubuntu. Il est tout à fait acceptable de modifier ce fichier directement, bien que l’Option 2 et l’Option 3 présentent une solution plus modulaire qui peut être plus facile à modifier et à maintenir.

Ouvrez /etc/apt/sources.list avec nano ou votre éditeur de texte préféré :

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

Ensuite, ajoutez le dépôt externe en bas du fichier :

/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

Cette ligne contient les informations suivantes sur la source :

  • deb : Cela spécifie que la source utilise une architecture Debian régulière.
  • arch=amd64,arm64 spécifie les architectures vers lesquelles les données APT seront téléchargées. Ici, il s’agit de amd64 et arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg : Cela spécifie la clé utilisée pour autoriser cette source, et ici elle pointe vers votre fichier .gpg stocké dans /usr/share/keyrings. Cette partie de la ligne doit être incluse, alors qu’elle n’était pas requise précédemment dans la méthode apt-key. Cette addition est le changement le plus critique dans le passage de apt-key, car elle lie la clé à un référentiel singulier qu’elle est autorisée à autoriser et corrige la faille de sécurité originale dans apt-key.
  • https://artifacts.elastic.co/packages/7.x/apt stable main : C’est l’URI représentant l’emplacement exact où les données du référentiel peuvent être trouvées.
  • /etc/apt/sources.list.d/elastic-7.x.list: C’est l’emplacement et le nom du nouveau fichier à créer.
  • /dev/null: Ceci est utilisé lorsque la sortie d’une commande n’est pas nécessaire. En redirigeant la sortie vers cet emplacement, on exclut la sortie de la commande tee.

Enregistrez et quittez en appuyant sur CTRL+O puis CTRL+X.

Option 2 — Créer un Nouveau Fichier .list dans sources.list.d

Avec cette option, vous allez plutôt créer un nouveau fichier dans le répertoire sources.list.d. apt analyse à la fois ce répertoire et sources.list pour les ajouts de dépôts. Cette méthode vous permet d’isoler physiquement les ajouts de dépôts dans des fichiers distincts. Si vous devez ultérieurement supprimer cet ajout ou apporter des modifications, vous pouvez supprimer ce fichier au lieu de modifier le fichier central sources.list. Garder vos ajouts séparés facilite la maintenance, et éditer sources.list peut être plus sujet aux erreurs d’une manière qui affecte d’autres dépôts dans le fichier.

Pour ce faire, redirigez une commande echo vers une commande tee pour créer ce nouveau fichier et insérer la ligne appropriée. Le fichier est nommé elastic-7.x.list dans l’exemple suivant, mais n’importe quel nom fonctionne tant que c’est un nom de fichier unique dans le répertoire.

  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

Cette commande est identique à la création manuelle du fichier et à l’insertion de la ligne de texte appropriée.

Option 3 — Création d’un fichier .sources dans sources.list.d

La troisième méthode écrit dans un fichier .sources plutôt que dans un fichier .list. Cette méthode est relativement nouvelle et utilise le format multiligne deb822 qui est moins ambigu que la déclaration deb . . ., bien qu’elle soit fonctionnellement identique. Créez un nouveau fichier :

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

Ensuite, ajoutez le dépôt externe en utilisant le format 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

Enregistrez et quittez une fois que vous avez inséré le texte.

Ceci est analogue au format d’une ligne, et une comparaison ligne par ligne montre que les informations dans les deux sont identiques, simplement organisées différemment. À noter que ce format n’utilise pas de virgules lorsqu’il y a plusieurs arguments (comme avec amd64,arm64), et utilise plutôt des espaces.

Ensuite, vous vérifierez ce processus en effectuant une installation de test.

Étape 4 — Installation du paquet depuis le dépôt externe

Vous devez appeler apt update pour inciter apt à parcourir le fichier principal sources.list, ainsi que tous les fichiers .list et .sources dans sources.list.d. Appeler apt install sans mise à jour préalable entraînera un échec de l’installation, ou une installation d’un package par défaut obsolète à partir de apt.

Mettez à jour vos dépôts:

  1. sudo apt update

Ensuite, installez votre package:

  1. sudo apt install elasticsearch

Il n’y a aucun changement à cette étape par rapport à la méthode apt-key. Une fois cette commande terminée, vous aurez terminé l’installation.

Annexe – Ajout d’un dépôt externe en utilisant un serveur de clés

Cette section passera brièvement en revue l’utilisation de gpg avec un serveur de clés au lieu d’une clé publique pour ajouter un dépôt externe. Le processus est presque identique à la méthode de la clé publique, la différence étant la manière dont gpg est appelé.

add-apt-repository est le pendant basé sur le serveur de clés de apt-key, et les deux sont en passe d’être obsolètes. Ce scénario utilise des composants différents. Au lieu d’une clé et d’un référentiel, vous disposez d’une URL de serveur de clés et d’un identifiant de clé. Dans ce cas, vous pouvez télécharger directement depuis le serveur de clés dans le format .gpg approprié sans avoir à convertir quoi que ce soit. Parce que add-apt-repository sera bientôt obsolète, vous utiliserez plutôt gpg pour télécharger dans un fichier tout en remplaçant le comportement par défaut de gpg qui consiste à importer dans un trousseau de clés existant.

En utilisant le langage de programmation open-source R comme exemple, voici les composants donnés, qui peuvent également être trouvés dans les instructions d’installation sur le site officiel du projet:

  • Serveur de clés : keyserver.ubuntu.com
  • Identifiant de clé : E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Référentiel : https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

Tout d’abord, téléchargez directement depuis le serveur de clés en utilisant gpg. Notez que selon le trafic de téléchargement, cette commande de téléchargement peut prendre un certain temps pour s’achever :

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

Cette commande inclut les indicateurs suivants, qui diffèrent de l’utilisation de gpg avec une clé publique :

  • --no-default-keyring combiné avec --keyring permet de produire une sortie vers un nouveau fichier au lieu d’importer dans un trousseau de clés existant, ce qui est le comportement par défaut de gpg dans ce scénario.
  • --keyserver combiné avec --recv-keys fournit la clé spécifique et l’emplacement à partir duquel vous téléchargez.
  • --homedir est utilisé pour remplacer l’emplacement par défaut de gpg pour la création de fichiers temporaires. gpg doit créer ces fichiers pour exécuter la commande, sinon gpg tentera d’écrire dans /root, ce qui provoque une erreur de permission. Au lieu de cela, cette commande place les fichiers temporaires dans le répertoire approprié /tmp.

Ensuite, ajoutez le dépôt à un fichier .list. Cela se fait de la même manière que l’ajout d’un dépôt externe en utilisant une clé publique en redirigeant une commande echo vers une commande 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

Ensuite, mettez à jour votre liste de dépôts:

  1. sudo apt update

Enfin, vous pouvez installer le paquet:

  1. sudo apt install r-base

L’utilisation de gpg pour ajouter des dépôts externes est similaire entre les clés publiques et les serveurs de clés, la différence étant la manière dont vous appelez gpg.

Conclusion

Ajouter un dépôt externe à l’aide d’une clé publique ou d’un serveur de clés peut être réalisé via gpg, sans utiliser apt-key ou add-apt-repository comme intermédiaire. Utilisez cette méthode pour garantir que votre processus ne devienne pas obsolète dans les futures versions d’Ubuntu, car apt-key et add-apt-repository sont dépréciés et seront supprimés dans une version future. Ajouter des dépôts externes en utilisant gpg garantit qu’une clé ne sera utilisée que pour autoriser un seul dépôt, comme vous l’avez prévu.

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