Wie man die Abschaffung von apt-key und add-apt-repository in Ubuntu 22.04 mit gpg handhabt
apt-key ist ein Dienstprogramm, das verwendet wird, um die Schlüssel zu verwalten, die APT zur Authentifizierung von Paketen verwendet. Es ist eng mit dem Dienstprogramm add-apt-repository verwandt, das externe Repositories mithilfe von Schlüsselservern zur Liste vertrauenswürdiger Quellen einer APT-Installation hinzufügt. Allerdings werden Schlüssel, die mit apt-key und add-apt-repository hinzugefügt werden, von apt global vertraut. Diese Schlüssel sind nicht auf die Autorisierung des einzigen Repositorys beschränkt, für das sie vorgesehen waren. Jeder in dieser Weise hinzugefügte Schlüssel kann zur Autorisierung der Hinzufügung eines anderen externen Repositorys verwendet werden, was ein wichtiges Sicherheitsproblem darstellt.
Ab Ubuntu 20.10 zeigt die Verwendung von apt-key eine Warnung an, dass das Tool in naher Zukunft abgeschafft wird; ebenso wird auch add-apt-repository bald abgeschafft. Obwohl diese Abkündigungswarnungen die Verwendung von apt-key und add-apt-repository unter Ubuntu 22.04 nicht strikt verhindern, wird davon abgeraten, sie zu ignorieren.
Die derzeit beste Praxis besteht darin, gpg anstelle von apt-key und add-apt-repository zu verwenden, und in zukünftigen Versionen von Ubuntu wird dies die einzige Option sein. apt-key und add-apt-repository selbst haben immer als Wrapper fungiert, die im Hintergrund gpg aufrufen. Die direkte Verwendung von gpg schneidet den Vermittler aus. Aus diesem Grund ist die gpg-Methode rückwärtskompatibel mit älteren Versionen von Ubuntu und kann als Ersatz für apt-key verwendet werden.
Dieses Tutorial beschreibt zwei Verfahren, die Alternativen zu apt-key und add-apt-repository verwenden. Zunächst wird das Hinzufügen eines externen Repositorys mit einem öffentlichen Schlüssel über gpg anstelle von apt-key behandelt. Zweitens wird in einem Nachtrag das Hinzufügen eines externen Repositorys mithilfe eines Schlüsselservers mit gpg als Alternative zu add-apt-repository erläutert.
Voraussetzungen
Um dieses Tutorial abzuschließen, benötigen Sie einen Ubuntu 22.04-Server. Stellen Sie sicher, dass Sie diesen gemäß unserem Leitfaden für die Ersteinrichtung eines Servers für Ubuntu 22.04 einrichten, mit einem Nicht-Root-Benutzer mit sudo-Rechten und einer aktivierten Firewall.
Schritt 1 — Identifizierung der Komponenten und des Schlüsselformats
PGP, oder Pretty Good Privacy, ist ein proprietäres Verschlüsselungsprogramm, das zum Signieren, Verschlüsseln und Entschlüsseln von Dateien und Verzeichnissen verwendet wird. PGP-Dateien sind öffentliche Schlüsseldateien, die in diesem Prozess verwendet werden, um Repositories als gültige Quellen innerhalb von apt zu authentifizieren. GPG, oder GNU Privacy Guard, ist eine Open-Source-Alternative zu PGP. GPG-Dateien sind in der Regel Schlüsselringe, die mehrere Schlüssel enthalten. Beide Dateitypen werden häufig zum Signieren und Verschlüsseln von Dateien verwendet.
gpg ist das Befehlszeilentool von GPG, das verwendet werden kann, um externe Repositories für die Verwendung mit apt zu autorisieren. Allerdings akzeptiert gpg nur GPG-Dateien. Um dieses Befehlszeilentool mit PGP-Dateien verwenden zu können, müssen Sie sie konvertieren.
Elasticsearch stellt ein häufiges Szenario für die Schlüsselkonvertierung dar und wird in diesem Abschnitt als Beispiel verwendet. Sie laden einen für PGP formatierten Schlüssel herunter und konvertieren ihn in ein apt-kompatibles Format mit der Dateiendung .gpg. Dies tun Sie, indem Sie den gpg-Befehl mit dem Flag –dearmor ausführen. Anschließend fügen Sie den Repository-Link zur Liste der Paketquellen hinzu, während Sie einen direkten Verweis auf Ihren konvertierten Schlüssel anhängen. Schließlich überprüfen Sie diesen Prozess, indem Sie das Elasticsearch-Paket installieren.
Projekte, die das Hinzufügen von Repositories mit Schlüsselverifizierung erfordern, stellen Ihnen immer einen öffentlichen Schlüssel und eine Repository-URI zur Verfügung, die seinen genauen Speicherort darstellt. Für unser Elasticsearch-Beispiel geben die Dokumentationen diese Komponenten auf ihrer Installationsseite an.
Hier sind die für Elasticsearch angegebenen Komponenten:
- Schlüssel: https://artifacts.elastic.co/GPG-KEY-elasticsearch
- Repository: https://artifacts.elastic.co/packages/7.x/apt stable main
Als nächstes müssen Sie feststellen, ob Sie eine PGP- oder GPG-Datei zur Verfügung haben. Sie können die Schlüsseldatei inspizieren, indem Sie die URL mit curl öffnen:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch
Dies gibt den Inhalt der Schlüsseldatei aus, der mit dem Folgenden beginnt:
Output
-----BEGIN PGP PUBLIC KEY BLOCK-----
. . .
Trotz der GPG-Erwähnung in der URL zeigt die erste Zeile an, dass es sich tatsächlich um eine PGP-Schlüsseldatei handelt. Beachten Sie dies, da apt nur das GPG-Format akzeptiert. Ursprünglich erkannte apt-key PGP-Dateien und konvertierte sie automatisch in GPG, indem gpg im Hintergrund aufgerufen wurde. Schritt 2 behandelt sowohl die manuelle Konvertierung von PGP in GPG als auch das Vorgehen, wenn keine Konvertierung erforderlich ist.
Schritt 2 — Herunterladen des Schlüssels und Konvertieren in ein apt-kompatibles Dateiformat
Mit der gpg-Methode müssen Sie den Schlüssel immer herunterladen, bevor Sie ihn zur Liste der Paketquellen hinzufügen. Früher war diese Reihenfolge mit apt-key nicht immer erforderlich. Jetzt müssen Sie den Pfad zur heruntergeladenen Schlüsseldatei in Ihrer Quellenliste angeben. Wenn Sie den Schlüssel nicht heruntergeladen haben, können Sie natürlich keinen vorhandenen Pfad referenzieren.
Da Sie bei Elasticsearch mit einer PGP-Datei arbeiten, konvertieren Sie diese nach dem Herunterladen in ein GPG-Dateiformat. Das folgende Beispiel verwendet curl, um den Schlüssel herunterzuladen, wobei der Download in einen gpg-Befehl weitergeleitet wird. Der gpg-Befehl wird mit dem Flag --dearmor
aufgerufen, um die PGP-Datei in ein GPG-Dateiformat zu konvertieren. Mit -o
wird die Ausgabedatei angegeben.
Unter Ubuntu wird das Verzeichnis /usr/share/keyrings
als empfohlener Speicherort für Ihre konvertierten GPG-Dateien verwendet, da es der Standardort ist, an dem Ubuntu seine Schlüsselringe speichert. In diesem Beispiel wird die Datei elastic-7.x.gpg
genannt, aber jeder beliebige Name ist möglich:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg
Dies konvertiert die PGP-Datei in das korrekte GPG-Format und macht sie bereit, der Liste der Quellen für apt hinzugefügt zu werden.
Hinweis: Wenn die heruntergeladene Datei bereits im GPG-Format vorliegt, können Sie die Datei direkt in /usr/share/keyrings
herunterladen, ohne sie zu konvertieren. Verwenden Sie dafür einen Befehl wie das folgende Beispiel:
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg
In diesem Fall würde die Ausgabe des curl-Befehls in tee weitergeleitet, um die Datei am richtigen Ort zu speichern.
Schritt 3 — Hinzufügen des Repositorys zur Liste der Paketquellen
Nachdem der Schlüssel heruntergeladen und im richtigen GPG-Dateiformat vorliegt, können Sie das Repository zur apt-Paketquellenliste hinzufügen und es explizit mit dem erhaltenen Schlüssel verknüpfen. Es gibt drei Methoden, um dies zu erreichen, die sich darauf beziehen, wie apt die Quellen findet. apt durchsucht eine zentrale sources.list
-Datei sowie .list- und .sources-Dateien im Verzeichnis sources.list.d
. Obwohl es keinen funktionalen Unterschied zwischen diesen Optionen gibt, wird empfohlen, die Methode auszuwählen, die am besten zu Ihren Anforderungen passt.
Option 1 — Hinzufügen direkt zur sources.list
Die erste Methode besteht darin, eine Zeile, die die Quelle darstellt, direkt in /etc/apt/sources.list
einzufügen, der Hauptdatei, die die apt-Quellen enthält. Diese Datei enthält mehrere Quellen, einschließlich der Standardquellen, die mit Ubuntu geliefert werden. Es ist vollkommen akzeptabel, diese Datei direkt zu bearbeiten, obwohl Option 2 und Option 3 eine modularere Lösung darstellen, die einfacher zu bearbeiten und zu warten ist.
Öffnen Sie /etc/apt/sources.list
mit nano oder Ihrem bevorzugten Texteditor:
sudo nano /etc/apt/sources.list
Fügen Sie dann das externe Repository am Ende der Datei hinzu:
/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
Diese Zeile enthält die folgenden Informationen über die Quelle:
- deb: Gibt an, dass die Quelle eine reguläre Debian-Architektur verwendet.
- arch=amd64,arm64: Gibt die Architekturen an, für die die apt-Daten heruntergeladen werden. Hier sind es amd64 und arm64.
- signed-by=/usr/share/keyrings/elastic-7.x.gpg: Gibt den Schlüssel an, der zur Autorisierung dieser Quelle verwendet wird. Hier verweist er auf Ihre .gpg-Datei im Verzeichnis
/usr/share/keyrings
. Dieser Teil der Zeile muss enthalten sein, was zuvor mit der apt-key-Methode nicht erforderlich war. Diese Ergänzung ist die wichtigste Änderung beim Wechsel von apt-key, da sie den Schlüssel an ein einziges Repository bindet, das er autorisieren darf, und damit die ursprüngliche Sicherheitslücke in apt-key behebt. - https://artifacts.elastic.co/packages/7.x/apt stable main: URI, der den genauen Ort der Daten im Repository darstellt.
Speichern und beenden Sie die Datei mit CTRL+O
und CTRL+X
.
Option 2 — Erstellen einer neuen .list-Datei in sources.list.d
Mit dieser Option erstellen Sie stattdessen eine neue Datei im Verzeichnis sources.list.d
. apt durchsucht sowohl dieses Verzeichnis als auch sources.list
nach Repository-Ergänzungen. Diese Methode ermöglicht es Ihnen, Repository-Ergänzungen physisch in separaten Dateien zu isolieren. Wenn Sie diese Ergänzung später entfernen oder bearbeiten müssen, können Sie diese Datei löschen, anstatt die zentrale sources.list
-Datei zu bearbeiten. Das Halten von Ergänzungen in separaten Dateien erleichtert die Wartung, und das Bearbeiten von sources.list
kann fehleranfälliger sein, da es sich auf andere Repositories in der Datei auswirken kann.
Um dies zu tun, leiten Sie einen echo
-Befehl in einen tee
-Befehl, um diese neue Datei zu erstellen und die entsprechende Zeile einzufügen. Die Datei wird im folgenden Beispiel elastic-7.x.list
genannt, aber jeder Name funktioniert, solange es sich um einen eindeutigen Dateinamen im Verzeichnis handelt:
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
Dieser Befehl ist identisch mit dem manuellen Erstellen der Datei und dem Einfügen der entsprechenden Textzeile.
Option 3 — Erstellen einer .sources-Datei in sources.list.d
Die dritte Methode schreibt in eine .sources-Datei anstelle einer .list-Datei. Diese Methode ist relativ neu und verwendet das mehrzeilige deb822-Format, das im Vergleich zur Deklaration deb . . .
weniger Mehrdeutigkeiten aufweist, obwohl sie funktional identisch ist. Erstellen Sie eine neue Datei:
sudo nano /etc/apt/sources.list.d/elastic-7.x.sources
Fügen Sie dann das externe Repository im deb822-Format hinzu:
/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
Speichern und verlassen Sie die Datei, nachdem Sie den Text eingefügt haben.
Schritt 4 — Installation des Pakets aus dem externen Repository
Sie müssen apt update
aufrufen, damit apt die Hauptdatei sources.list
sowie alle .list
– und .sources
-Dateien im Verzeichnis sources.list.d
durchsucht. Das Ausführen von apt install
ohne vorheriges Update führt entweder zu einer fehlgeschlagenen Installation oder zur Installation eines veralteten Standardpakets aus apt.
Aktualisieren Sie Ihre Repositorys:
sudo apt update
Installieren Sie anschließend Ihr Paket:
sudo apt install elasticsearch
In diesem Schritt ändert sich im Vergleich zur apt-key-Methode nichts. Sobald dieser Befehl abgeschlossen ist, haben Sie die Installation erfolgreich abgeschlossen.
Nachtrag – Hinzufügen eines externen Repositorys mithilfe eines Schlüsselservers
In diesem Abschnitt erläutern wir kurz, wie gpg mit einem Schlüsselserver anstelle eines öffentlichen Schlüssels Verwendung findet, um ein externes Repository hinzuzufügen. Der Prozess ist nahezu identisch mit der Methode des öffentlichen Schlüssels, wobei der Unterschied darin besteht, wie gpg aufgerufen wird.
add-apt-repository
ist das auf Schlüsselservern basierende Gegenstück zu apt-key, und beide sind abgeschafft. In diesem Szenario verwenden Sie andere Komponenten. Anstelle eines Schlüssels und eines Repositorys erhalten Sie eine Schlüsselserver-URL und eine Schlüssel-ID. In diesem Fall können Sie direkt vom Schlüsselserver im entsprechenden .gpg-Format herunterladen, ohne etwas konvertieren zu müssen. Da add-apt-repository
bald abgeschafft wird, verwenden Sie stattdessen gpg, um die Datei herunterzuladen und dabei das Standardverhalten von gpg zu überschreiben, den Schlüssel in einen vorhandenen Schlüsselring zu importieren.
Beispielkomponenten für die Verwendung von gpg mit einem Schlüsselserver
Unter Verwendung der Programmiersprache R als Beispiel finden Sie hier die angegebenen Komponenten, die auch in den Installationsanweisungen auf der offiziellen Projektseite zu finden sind:
- Schlüsselserver: keyserver.ubuntu.com
- Schlüssel-ID: E298A3A825C0D65DFD57CBB651716619E084DAB9
- Repository: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/
Erstens, laden Sie direkt vom Schlüsselserver mithilfe von gpg herunter. Beachten Sie, dass je nach Download-Traffic dieser Download-Befehl möglicherweise einige Zeit in Anspruch nimmt:
sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
Besonderheiten beim gpg-Befehl für Schlüsselserver
Dieser Befehl enthält die folgenden Flags, die sich von der Verwendung von gpg mit einem öffentlichen Schlüssel unterscheiden:
- –no-default-keyring: Kombiniert mit –keyring ermöglicht dies die Ausgabe in eine neue Datei anstelle des Imports in einen bestehenden Schlüsselring, was das Standardverhalten von gpg in diesem Szenario ist.
- –keyserver: Kombiniert mit –recv-keys gibt dies den spezifischen Schlüssel und Ort an, von dem Sie herunterladen.
- –homedir: Wird verwendet, um den Standardstandort von gpg für temporäre Dateien zu überschreiben. gpg muss diese Dateien erstellen, um den Befehl auszuführen, andernfalls versucht gpg, in
/root
zu schreiben, was zu einem Berechtigungsfehler führt. Stattdessen werden diese temporären Dateien in das Verzeichnis/tmp
geschrieben.
Fügen Sie anschließend das Repository zu einer .list-Datei hinzu. Dies erfolgt auf die gleiche Weise wie das Hinzufügen eines externen Repositorys mit einem öffentlichen Schlüssel, indem ein echo
-Befehl in einen tee
-Befehl weitergeleitet wird:
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
Aktualisieren Sie anschließend Ihre Liste der Repositories:
sudo apt update
Installieren Sie dann das Paket:
sudo apt install r-base
Die Verwendung von gpg zum Hinzufügen externer Repositories ist ähnlich zwischen öffentlichen Schlüsseln und Schlüsselservern, wobei der Unterschied in der Art des gpg-Aufrufs liegt.
Schlussfolgerung
Das Hinzufügen eines externen Repositorys mit einem öffentlichen Schlüssel oder einem Schlüsselserver kann mit gpg erfolgen, ohne apt-key oder add-apt-repository als Vermittler zu verwenden. Verwenden Sie diese Methode, um sicherzustellen, dass Ihr Prozess in zukünftigen Ubuntu-Versionen nicht veraltet. Das Hinzufügen externer Repositories mit gpg stellt sicher, dass ein Schlüssel nur zur Autorisierung eines einzigen Repositorys Verwendung findet, wie Sie es beabsichtigen.