Eigenes Debian/Ubuntu Repository aufbauen

Kurzanleitung zum Aufbau eines APT Paket Repository

In dem Repo wird das hallo-1.0.0.deb verwendet um die Funktion von reprepro zu zeigen, wie eigene DEB Pakete erstellt werden können könnt Ihr hier lesen.

Installation der benötigten Pakete

apt install reprepro apache2 gnupg

Erstellen eines GnuPG keys

Mit diesem GPG Schlüssel wird das Repository und die Pakete signiert. Der Public Key muss auf den Zielsystemen als Trusted Key hinterlegt werden. (siehe unten)

Beim Erstellen des Keys muss man ein Passwort angeben. Nur mit diesem Passwort ist es möglich neue Pakete zum Repository hinzuzufügen und zu signieren.

gpg --gen-key

...

Ihr Name ("Vorname Nachname"): Mein APT Repo Key
Email-Adresse: example@example.org
Sie haben diese User-ID gewählt:
    "Mein APT Repo Key <example@example.org>"

Ändern: (N)ame, (E)-Mail oder (F)ertig/(A)bbrechen? f

...


Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa3072 2020-10-11 [SC] [verfällt: 2022-10-11]
      4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D
uid                      Mein APT Repo Key <example@example.org>
sub   rsa3072 2020-10-11 [E] [verfällt: 2022-10-11]

Der Key hat eine Gültigkeit von 2 Jahren, man kann die Gültigkeit verlängern. Das geht mit „gpg –edit-key <key_id>“. Mit „expire“ kann die Gültigkeit des Keys geändert werden.

gpg --edit-key 4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D


gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Geheimer Schlüssel ist vorhanden.

sec  rsa3072/28C7770DD3A8D10D
     erzeugt: 2020-10-11  verfällt: 2022-10-11  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa3072/236EB690D64E39D8
     erzeugt: 2020-10-11  verfällt: 2022-10-11  Nutzung: E
[ ultimativ ] (1). Mein APT Repo Key <example@example.org>



gpg> expire
Ändern des Verfallsdatums des Hauptschlüssels.
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 10y
Key verfällt am Mi 09 Okt 2030 21:37:42 CEST
Ist dies richtig? (j/N) j

sec  rsa3072/28C7770DD3A8D10D
     erzeugt: 2020-10-11  verfällt: 2030-10-09  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa3072/236EB690D64E39D8
     erzeugt: 2020-10-11  verfällt: 2022-10-11  Nutzung: E
[ ultimativ ] (1). Mein APT Repo Key <example@example.org>


gpg> key 1
gpg> expire
Ändern des Verfallsdatums des Unterschlüssels.
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 10y
Key verfällt am Mi 09 Okt 2030 21:37:42 CEST
Ist dies richtig? (j/N) j

sec  rsa3072/28C7770DD3A8D10D
     erzeugt: 2020-10-11  verfällt: 2030-10-09  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa3072/236EB690D64E39D8
     erzeugt: 2020-10-11  verfällt: 2030-10-09  Nutzung: E
[ ultimativ ] (1). Mein APT Repo Key <example@example.org>


gpg> quit
Änderungen speichern? (j/N) j



Erstellen des REPO Verzeichnis

mkdir -p /var/www/repos/apt/debian
mkdir /var/www/repos/apt/debian/conf

Erstellen der Apache Konfiguration

In dem einfachen Beispiel habe ich einfach die Default Virtual Host Konfiguration ersetzt/angepasst, diese liegt unter /etc/apache2/sites-enabled/000-default

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /var/www/repos/ >
                Options Indexes FollowSymLinks Multiviews
                Require all granted
        </Directory>

        <Directory "/var/www/repos/apt/*/db/">
                Require all denied
        </Directory>

        <Directory "/var/www/repos/apt/*/conf/">
                Require all denied
        </Directory>

        <Directory "/var/www/repos/apt/*/incoming/">
                Require all denied
        </Directory>
</VirtualHost>

Entfernen von unnötigen Files im Webroot /var/www

rm -rf /var/www/html

Testen der Apache Konfiguration und Neustart des Services

root@repodev:~# apache2ctl configtest
Syntax OK
root@repodev:~# /etc/init.d/apache2 reload
[ ok ] Reloading apache2 configuration (via systemctl): apache2.service.

Erstellen der distributions Datei

Die Datei beschreibt das Repository und für welche Distribution das Repo ist. Bei „SignWith“ wird die Key ID verwendet von dem eben erzeugten GPG Key.

Bei Codename wird der OS Release Name angegeben, z.B. bei Debian „buster“ oder bei Ubuntu „bionic“, das hängt von dem jeweiligen Release ab. Ist es ein generisches Repo dann kann hier auch z.B. „all“ genommen werden.

/var/www/repos/apt/debian/conf/distributions

Origin: Mein APT Repo
Label: Mein APT Repo
Codename: <osrelease>
Architectures: i386 amd64
Components: main
Description: APT repository fuer meine Pakete
SignWith: 4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D

/var/www/repos/apt/debian/conf/options

verbose
basedir /var/www/repos/apt/debian
ask-passphrase

Exportieren des GnuPG Keys

Der GPG Key muss in den APT Keyring auf dem Zielsystem aufgenommen werden damit man Pakete installieren kann. Dazu exportieren wir Ihn und stellen Ihn auf dem Webserver bereit.

gpg --armor --output /var/www/repo_key.key --export 4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D

Ein Paket veröffentlichen

Mit folgendem Befehl wird ein neues Paket z.B. hallo_1.0.0.deb dem Repository hinzugefügt. Wird das Kommando ausgeführt fragt der Assistent nach dem Passwort für den GPG Key.

# reprepro -b /var/www/repos/apt/debian includedeb <osrelease> /root/hallo_1.0.0.deb

/root/hallo-1.0.0.deb: component guessed as 'main'
Exporting indices...




Im Browser kann man ebenfalls prüfen ob die Veröffentlichung geklappt hat, dazu http://<repo>/repos/apt/debian/pool/main/h/hallo/ aufrufen:

Installieren von hallo aus eigenem Repository

Als erstes muss der Public Key des Repositorys zur Keychain hinzugefügt werden.

wget -O - http://10.10.10.10/repo_key.key|apt-key add -

Erstellen einer sources.list.d Datei

Die Datei wird verwendet um das Repo einzubinden.

/etc/apt/sources.list.d/mein_repo.list

deb http://10.10.10.10/repos/apt/debian <osrelease> main

Aktualisieren von APT Quellen

# apt update


Holen:1 http://10.10.10.10/repos/apt/debian all InRelease [2.331 B]
Holen:2 http://10.10.10.10/repos/apt/debian all/main amd64 Packages [1.018 B]
OK:3 http://deb.debian.org/debian buster InRelease
Holen:4 http://deb.debian.org/debian buster-updates InRelease [51,9 kB]
OK:5 http://security.debian.org/debian-security buster/updates InRelease
Es wurden 55,2 kB in 1 s geholt (86,7 kB/s).
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Alle Pakete sind aktuell.

Installieren ….

# apt install hallo

Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden NEUEN Pakete werden installiert:
  hallo
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 776 B an Archiven heruntergeladen werden.
Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt.
Holen:1 http://10.10.10.10/repos/apt/debian all/main amd64 hallo all 1.0-0 [776 B]
Es wurden 776 B in 0 s geholt (0 B/s).
Vormals nicht ausgewähltes Paket hallo wird gewählt.
(Lese Datenbank ... 35202 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../archives/hallo_1.0-0_all.deb ...
Entpacken von hallo (1.0-0) ...
hallo (1.0-0) wird eingerichtet ...

Viel Spaß 😉

3 Gedanken zu „Eigenes Debian/Ubuntu Repository aufbauen“

  1. Danke, hat soweit funktioniert. Aber der Aufruf übers webinterface funktioniert bei mir nicht. Ich habe ein anderes deb genommen und den Pfad, den mir rerepro angelegt hat im www Verzeichnis „verfolgt“ und im Browser eingegeben. Ich bekomme leider immer ein „Not found“. Woran könnte das liegen?

    Danke
    Gruß
    Volker

    Antworten
  2. Haha, kaum frage ich um Hilfe, wird mir klar, wie das gemeint war:

    echo „deb http://10.10.10.10/repos/apt/debian main“ > mein_repo.list

    Solltest Du die Seite aktualisieren: Ubuntu-jammy bemängelt:
    „Schlüssel ist im veralteten Schlüsselbund trusted.gpg gespeichert (/etc/apt/trusted.gpg), siehe den Abschnitt MISSBILLIGUNG in apt-key(8) für Details.“

    Danke
    Frank

    Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.