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
:
- 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:
- 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:
- 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:
- sudo nano /etc/apt/sources.list
Voeg vervolgens het externe repository toe onderaan het bestand:
. . .
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 hetamd64
enarm64
.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. Doortee
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:
- 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:
- sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
Vervolgens voeg je het externe repository toe met het deb822
-formaat:
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:
- sudo apt update
Installeer vervolgens uw pakket:
- 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:
- 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 vangpg
in dit scenario.--keyserver
gecombineerd met--recv-keys
biedt de specifieke sleutel en locatie waarvan je downloadt.--homedir
wordt gebruikt om de standaardlocatie vangpg
voor het maken van tijdelijke bestanden te overschrijven.gpg
moet deze bestanden maken om de opdracht te voltooien, anders zalgpg
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:
- 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:
- sudo apt update
Daarna kun je het pakket installeren:
- 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.