Hoe om te gaan met de veroudering van apt-key en add-apt-repository met gpg om externe repositories toe te voegen op Ubuntu 22.04

Introductie

apt-key is een hulpprogramma dat wordt gebruikt om de sleutels te beheren die APT gebruikt om pakketten te authenticeren. Het is nauw verwant aan het hulpprogramma add-apt-repository, dat externe repositories toevoegt met behulp van keyservers aan de lijst met vertrouwde bronnen van een APT-installatie. Echter, sleutels toegevoegd met apt-key en add-apt-repository worden wereldwijd vertrouwd door apt. Deze sleutels zijn niet beperkt tot het autoriseren van de enkele repository waarvoor ze bedoeld waren. Elke sleutel die op deze manier wordt toegevoegd, kan worden gebruikt om de toevoeging van een andere externe repository te autoriseren, wat een belangrijk beveiligingsrisico vormt.

Vanaf Ubuntu 20.10 geeft het gebruik van apt-key een waarschuwing dat het hulpprogramma in de nabije toekomst zal worden afgeschaft; evenzo zal ook add-apt-repository binnenkort worden afgeschaft. Hoewel deze afschaffingswaarschuwingen strikt genomen het gebruik van apt-key en add-apt-repository met Ubuntu 22.04 niet voorkomen, is het niet verstandig om ze te negeren.

De huidige beste praktijk is om gpg te gebruiken in plaats van apt-key en add-apt-repository, en in toekomstige versies van Ubuntu zal dit de enige optie zijn. apt-key en add-apt-repository fungeren zelf altijd al als wrappers, waarbij ze gpg op de achtergrond aanroepen. Door rechtstreeks gpg te gebruiken wordt de tussenpersoon uitgesneden. Om deze reden is de gpg-methode achterwaarts compatibel met oudere versies van Ubuntu en kan deze worden gebruikt als vervanging voor apt-key.

Deze tutorial zal twee procedures schetsen die alternatieven gebruiken voor apt-key en add-apt-repository respectievelijk. Als eerste wordt een externe repository toegevoegd met behulp van een openbare sleutel met gpg in plaats van apt-key. Ten tweede, als aanvulling, zal deze tutorial het toevoegen van een externe repository met behulp van een sleutelserver met gpg behandelen als alternatief voor het gebruik van add-apt-repository.

Vereisten

Om deze tutorial te voltooien, heb je een Ubuntu 22.04-server nodig. Zorg ervoor dat je deze instelt volgens onze handleiding voor het instellen van een server voor Ubuntu 22.04, met een niet-root-gebruiker met sudo-rechten en een ingeschakelde firewall.

Stap 1 — Identificatie van de Componenten en Belangrijk Formaat

PGP, of Pretty Good Privacy, is een gepatenteerd versleutelingsprogramma dat wordt gebruikt voor het ondertekenen, versleutelen en ontsleutelen van bestanden en mappen. PGP-bestanden zijn openbare sleutelbestanden, die in dit proces worden gebruikt om repositories te authenticeren als geldige bronnen binnen apt. GPG, of GNU Privacy Guard, is een open-source alternatief voor PGP. GPG-bestanden zijn meestal sleutelringen, dit zijn bestanden die meerdere sleutels bevatten. Beide bestandstypen worden veel gebruikt om bestanden te ondertekenen en te versleutelen.

gpg is de command-line tool van GPG die kan worden gebruikt om externe repositories te autoriseren voor gebruik met apt. Echter, gpg accepteert alleen GPG-bestanden. Om deze command-line tool met PGP-bestanden te gebruiken, moet je ze converteren.

Elasticsearch presenteert een veelvoorkomend scenario voor sleutelconversie en zal als voorbeeld worden gebruikt in dit gedeelte. Je zult een sleutel downloaden die is opgemaakt voor PGP en deze converteren naar een apt-compatibel formaat met een bestandsextensie .gpg. Dit doe je door het gpg-commando uit te voeren met de --dearmor vlag. Vervolgens voeg je de koppelingslink naar de lijst met pakketbronnen toe, terwijl je een directe verwijzing naar je geconverteerde sleutel toevoegt. Ten slotte verifieer je dit proces door het Elasticsearch-pakket te installeren.

Projecten die vereisen dat er repositories worden toegevoegd met sleutelverificatie, zullen u altijd voorzien van een openbare sleutel en een repository-URI die de exacte locatie vertegenwoordigt. Voor ons Elasticsearch-voorbeeld geeft de documentatie deze onderdelen op hun installatiepagina.

Hier zijn de onderdelen die zijn opgegeven voor Elasticsearch:

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

Vervolgens moet je bepalen of je een PGP- of GPG-bestand hebt gekregen om mee te werken. Je kunt het sleutelbestand inspecteren door de URL te openen met curl:

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

Dit zal de inhoud van het sleutelbestand weergeven, dat begint met het volgende:

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

Ondanks dat er GPG in de URL staat, geeft de eerste regel aan dat dit eigenlijk een PGP-sleutelbestand is. Let hierop, omdat apt alleen het GPG-formaat accepteert. Oorspronkelijk detecteerde apt-key PGP-bestanden en zette ze automatisch om in GPG door gpg in de achtergrond aan te roepen. Stap 2 zal zowel de handmatige conversie van PGP naar GPG behandelen, als wat te doen wanneer conversie niet nodig is.

Stap 2 — Downloaden van de sleutel en omzetten naar een apt-compatibel bestandstype

Met de gpg-methode moet je altijd de sleutel downloaden voordat je deze aan de lijst met pakketbronnen toevoegt. Voorheen, met apt-key, werd deze volgorde niet altijd afgedwongen. Nu moet je de verwijzing naar het pad naar het gedownloade sleutelbestand opnemen in je bronnenlijst. Als je de sleutel niet hebt gedownload, kun je uiteraard geen verwijzing maken naar een bestaand pad.

Met Elasticsearch werk je met een PGP-bestand, dat je na het downloaden naar het GPG-bestandsformaat zult converteren. Het volgende voorbeeld gebruikt curl om de sleutel te downloaden, waarbij de download wordt doorgegeven aan een gpg-opdracht. gpg wordt aangeroepen met de --dearmor-vlag om de PGP-sleutel om te zetten in een GPG-bestandsformaat, met -o om de bestandsuitvoer aan te geven.

Op Ubuntu is de /usr/share/keyrings-directory de aanbevolen locatie voor je geconverteerde GPG-bestanden, aangezien dit de standaardlocatie is waar Ubuntu zijn keyrings opslaat. Het bestand heeft in dit voorbeeld de naam elastic-7.x.gpg, maar elke naam werkt:

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

Dit converteert het PGP-bestand naar het juiste GPG-formaat, zodat het klaar is om aan de lijst met bronnen voor apt te worden toegevoegd.

Opmerking: Als het gedownloade bestand al in GPG-formaat was, kun je in plaats daarvan het bestand rechtstreeks naar /usr/share/keyrings downloaden zonder het te converteren met een opdracht zoals het volgende voorbeeld:

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

In dit geval zou de uitvoer van de curl-opdracht worden doorgestuurd naar tee om het bestand op de juiste locatie op te slaan.

Stap 3 — Het Toevoegen van het Repository aan Je Lijst van Pakketbronnen

Met de gedownloade sleutel in het juiste GPG-bestandsformaat, kun je het repository toevoegen aan de apt pakketbron, terwijl je het expliciet koppelt aan de verkregen sleutel. Er zijn drie methoden om dit te bereiken, allemaal gerelateerd aan hoe apt bronnen vindt. apt haalt bronnen op uit een centraal sources.list-bestand, .list-bestanden in de sources.list.d-directory, en .source-bestanden in de sources.list.d-directory. Hoewel er geen functioneel verschil is tussen de drie opties, wordt aanbevolen om de drie opties te overwegen en de methode te kiezen die het beste bij jouw behoeften past.

Optie 1 — Direct Toevoegen aan sources.list

De eerste methode houdt in dat je een regel die de bron rechtstreeks vertegenwoordigt, invoegt in `/etc/apt/sources.list`, het hoofdbestand met `apt`-bronnen. Er zijn meerdere bronnen in dit bestand, waaronder de standaardbronnen die bij Ubuntu worden geleverd. Het is volkomen acceptabel om dit bestand rechtstreeks te bewerken, hoewel Optie 2 en Optie 3 een meer modulaire oplossing bieden die gemakkelijker te bewerken en te onderhouden is.

Open `/etc/apt/sources.list` met `nano` of je favoriete teksteditor:

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

Voeg vervolgens het externe repository toe onderaan het bestand:

/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

Deze regel bevat de volgende informatie over de bron:

  • deb: Hiermee wordt aangegeven dat de bron een reguliere Debian-architectuur gebruikt.
  • arch=amd64,arm64 specificeert de architecturen waarvoor de APT-gegevens zullen worden gedownload. Hier is het amd64 en arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: Hiermee wordt de sleutel gespecificeerd die wordt gebruikt om deze bron te autoriseren, en hier wijst het naar je `.gpg`-bestand dat is opgeslagen in `/usr/share/keyrings`. Dit gedeelte van de regel moet worden opgenomen, terwijl dit voorheen niet vereist was bij de `apt-key`-methode. Deze toevoeging is de meest kritieke verandering bij het overstappen van `apt-key`, omdat het de sleutel koppelt aan een enkelvoudig repository dat het mag autoriseren en het oorspronkelijke beveiligingslek in `apt-key` oplost.
  • https://artifacts.elastic.co/packages/7.x/apt stable main: Dit is de URI die de exacte locatie vertegenwoordigt waar de gegevens binnen het repository kunnen worden gevonden.
  • /etc/apt/sources.list.d/elastic-7.x.list: Dit is de locatie en naam van het nieuwe bestand dat moet worden aangemaakt.
  • /dev/null: Dit wordt gebruikt wanneer de uitvoer van een commando niet nodig is. Door tee naar deze locatie te verwijzen, wordt de uitvoer weggelaten.

Sla op en verlaat door op CTRL+O te drukken en vervolgens op CTRL+X.

Optie 2 — Een nieuw .list-bestand maken in sources.list.d

Met deze optie maak je in plaats daarvan een nieuw bestand aan in de map sources.list.d. apt analyseert zowel deze map als sources.list voor repository toevoegingen. Deze methode stelt je in staat om repository toevoegingen fysiek te isoleren in aparte bestanden. Als je deze toevoeging later wilt verwijderen of bewerken, kun je dit bestand verwijderen in plaats van het centrale sources.list-bestand te bewerken. Het apart houden van je toevoegingen maakt het gemakkelijker om te onderhouden, en het bewerken van sources.list kan foutgevoeliger zijn op een manier die andere repositories in het bestand beïnvloedt.

Om dit te doen, leid je een echo-commando naar een tee-commando om dit nieuwe bestand aan te maken en de juiste regel in te voegen. Het bestand wordt in het volgende voorbeeld genoemd elastic-7.x.list, maar elke naam werkt zolang het een unieke bestandsnaam is in de map:

  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

Deze opdracht is identiek aan het handmatig maken van het bestand en het invoegen van de juiste regel tekst.

Optie 3 — Het maken van een .sources-bestand in sources.list.d

De derde methode schrijft naar een .sources-bestand in plaats van naar een .list-bestand. Deze methode is relatief nieuw en gebruikt het deb822 multiline-formaat dat minder ambigu is vergeleken met de deb . . . declaratie, hoewel het functioneel identiek is. Maak een nieuw bestand aan:

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

Vervolgens voeg je het externe repository toe met het deb822-formaat:

/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

Sla op en verlaat nadat je de tekst hebt ingevoegd.

Dit is analoog aan het eenregelige formaat, en een vergelijking regel voor regel laat zien dat de informatie in beide identiek is, maar anders georganiseerd. Eén ding om op te merken is dat dit formaat geen komma’s gebruikt wanneer er meerdere argumenten zijn (zoals bij amd64,arm64), en in plaats daarvan spaties gebruikt.

Vervolgens verifieer je dit proces door een testinstallatie uit te voeren.

Stap 4 — Het pakket installeren vanuit het externe repository

U moet apt update bellen om apt aan te sporen door het hoofdbestand sources.list te kijken, en alle bestanden .list en .sources in sources.list.d. Als u eerst geen update uitvoert en vervolgens apt install belt, zal dit leiden tot een mislukte installatie of de installatie van een verouderd standaardpakket van apt.

Werk uw repositories bij:

  1. sudo apt update

Installeer vervolgens uw pakket:

  1. sudo apt install elasticsearch

Er verandert niets in deze stap vergeleken met de methode met apt-key. Zodra deze opdracht is voltooid, is de installatie voltooid.

Aanvulling – Het toevoegen van een Externe Repository met behulp van een Keyserver

In dit gedeelte zal kort worden ingegaan op het gebruik van gpg met een keyserver in plaats van een openbare sleutel om een externe repository toe te voegen. Het proces is bijna identiek aan de methode met de openbare sleutel, met als enig verschil hoe gpg wordt aangeroepen.

add-apt-repository` is de sleutelserver-gebaseerde tegenhanger van `apt-key`, en beide staan op het punt om te worden afgeschaft. Dit scenario maakt gebruik van verschillende componenten. In plaats van een sleutel en repository, krijgt u een sleutelserver-URL en sleutel-ID. In dit geval kunt u rechtstreeks vanaf de sleutelserver downloaden naar het juiste .gpg-formaat zonder iets te converteren. Omdat `add-apt-repository` binnenkort wordt afgeschaft, gebruikt u in plaats daarvan `gpg` om naar een bestand te downloaden en overschrijft u het standaardgedrag van `gpg` om naar een bestaande sleutelring te importeren.

Gebruikmakend van de open-source programmeertaal R als voorbeeld, hier zijn de gegeven componenten, die ook te vinden zijn in de installatie-instructies op de officiële projectsite:

  • Sleutelserver: keyserver.ubuntu.com
  • Sleutel-ID: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • Repository: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

Ten eerste, download rechtstreeks vanaf de sleutelserver met behulp van gpg. Wees ervan bewust dat, afhankelijk van het downloadverkeer, deze downloadopdracht even kan duren om te voltooien:

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

Deze opdracht bevat de volgende vlaggen, die verschillen van het gebruik van gpg met een openbare sleutel:

  • --no-default-keyring in combinatie met --keyring maakt het mogelijk om naar een nieuw bestand uit te voeren in plaats van te importeren in een bestaande sleutelring, wat het standaardgedrag is van gpg in dit scenario.
  • --keyserver gecombineerd met --recv-keys biedt de specifieke sleutel en locatie waarvan je downloadt.
  • --homedir wordt gebruikt om de standaardlocatie van gpg voor het maken van tijdelijke bestanden te overschrijven. gpg moet deze bestanden maken om de opdracht te voltooien, anders zal gpg proberen te schrijven naar /root, wat een machtigingsfout veroorzaakt. In plaats daarvan plaatst deze opdracht de tijdelijke bestanden in de juiste /tmp-map.

Vervolgens voeg je het repository toe aan een .list-bestand. Dit gebeurt op exact dezelfde manier als het toevoegen van een extern repository met een openbare sleutel door een echo-opdracht door te voeren naar een tee-opdracht:

  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

Vervolgens update je jouw lijst met repositories:

  1. sudo apt update

Daarna kun je het pakket installeren:

  1. sudo apt install r-base

Het gebruik van gpg om externe repositories toe te voegen is vergelijkbaar tussen openbare sleutels en keyservers, met als verschil hoe je gpg aanroept.

Conclusie

Het toevoegen van een externe repository met behulp van een openbare sleutel of een sleutelserver kan worden gedaan via gpg, zonder apt-key of add-apt-repository te gebruiken als tussenpersoon. Gebruik deze methode om ervoor te zorgen dat uw proces niet verouderd raakt in toekomstige Ubuntu-versies, aangezien apt-key en add-apt-repository verouderd zijn en zullen worden verwijderd in een toekomstige versie. Het toevoegen van externe repositories met behulp van gpg zorgt ervoor dat een sleutel alleen wordt gebruikt om een enkele repository te autoriseren zoals u dat bedoelt.

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