Eigenes apt-Repository mit reprepro unter Ubuntu erstellen

Aus Thomas-Krenn-Wiki
Wechseln zu: Navigation, Suche

Mit reprepro können einfache eigene Paket-Repositories erstellt und verwaltet werden. Das Werkzeug befindet sich in den Ubuntu-Repositories und kann dazu dienen eigene Pakete bereitzustellen oder auch vorhandene Repositories zu spiegeln. Dieser Artikel stellt reprepro vor und zeigt den Aufbau eines einfachen Repos unter Ubuntu Server 12.04.1. Für Situationen, in denen komplette Repositories zur Bereitstellung im eigenen lokalen Netzwerk gespiegelt werden sollen, gibt es Alternativen wie apt-mirror.[1]

Installation

reprepro[2] kann unter Ubuntu aus den Repositories installiert werden: http://packages.ubuntu.com/precise/reprepro

:~$ apt-cache search reprepro
reprepro - Debian package repository producer
:~$ sudo apt-get install reprepro

Nützliche Informationen zum Einrichten eines Repos finden sich nach der Installation unter

:~$ ls /usr/share/doc/reprepro/
changelog.Debian.gz  copyright  examples  FAQ.gz  manual.html  NEWS.gz  README  README.Debian  recovery  short-howto.gz  TODO

Konfiguration

Im folgenden Beispiel wurde ein eigener User für die Bereitstellung der Pakete in dessen Home-Verzeichnis angelegt.

:~$ pwd
/home/repository

Für die Pakete wird eigenes Verzeichnis als auch ein Verzeichnis für die Konfiguration des Repos erstellt:

:~$ mkdir packages
:~$ mkdir packages/conf

Der erste Konfigurationsschritt besteht darin, die Datei distributions anzulegen, die festlegt für welche Distribution, Architektur etc. das Repository verwendet wird. Weitere Beispiele für die Datei distributions finden sich auch unter [1] (wiki.debian.org) und [2] (debian-administration.org):

:~/packages$ vi conf/distributions
Origin: TKmon
Label: tkmon
Codename: precise
Suite: stable
Architectures: i386 amd64 source
Components: main

"Origin" und "Label" sind beschreibende Felder, die in die Release-Datei übernommen werden. "Codename" ist ein verpflichtendes Feld und gibt den eindeutigen Identifier der Distribution an (z.B. precise, quantal für Ubuntu, wheezy für Debian):[3]

Codename: This required field is the unique identifier of a distribution and used as directory name within dists/.

Der Parameter "Suite" gibt die verbreiteten Parameter wie "stable", "unstable" oder auch "testing" an:

Suite: This optional field is simply copied into the Release files. In Debian it contains names like stable, testing or unstable. To create symlinks from the Suite to the Codename, use the createsymlinks command of reprepro.

"Architectures" und "Components" geben zum einen die Ziel-Architektur des Systems an (32-bit, 64-bit, "source" für Quellcode) als auch die Kompnenten der Distribution (main, contrib etc.):

Architectures: This required field lists the binary architectures within this distribution and if it contains source

Um bei den folgenden Befehlen nicht immer den Pfad des Pakete-Ordners angeben zu müssen, kann folgende Umgebungsvariable definiert werden (s.a. Umgebungsvariablen unter Ubuntu permanent setzen):

:~$ cat .pam_environment 
REPREPRO_BASE_DIR DEFAULT=/home/repository/packages

Pakete einbinden

Bei der Verwendung der "Suite"-Option in der Datei "distributions" werden im ersten Schritt symbolische Links von "stable" auf "precise" erzeugt:

:~$ reprepro -b /home/repository/packages createsymlinks
:~$ tree packages/
packages/
├── conf
│   ├── distributions
│   └── updates
├── db
│   ├── checksums.db
│   ├── contents.cache.db
│   ├── packages.db
│   ├── references.db
│   └── version
└── dists
    └── stable -> precise

3 directories, 8 files

Ist, wie oben beschrieben, die Umgebungsvariable REPREPRO_BASE_DIR DEFAULT gesetzt, kann die Option "-b" weggelassen werden. Es wird nun ein erstes Paket zum Repository hinzugefügt:

:~$ ls tkmon*
tkmon_0.0.1-1_all.deb  tkmon_0.0.1-1_amd64.changes  tkmon_0.0.1-1.debian.tar.gz  tkmon_0.0.1-1.dsc  tkmon_0.0.1.orig.tar.gz
:~$ reprepro -V include precise tkmon_0.0.1-1_amd64.changes 
Created directory "/home/repository/packages/pool"
Created directory "/home/repository/packages/pool/main"
Created directory "/home/repository/packages/pool/main/t"
Created directory "/home/repository/packages/pool/main/t/tkmon"
Exporting indices...
Created directory "/home/repository/packages/dists/precise"
Created directory "/home/repository/packages/dists/precise/main"
Created directory "/home/repository/packages/dists/precise/main/binary-i386"
Created directory "/home/repository/packages/dists/precise/main/binary-amd64"
Created directory "/home/repository/packages/dists/precise/main/source"

Zur Kontrolle wird der Inhalt des Repos aufgelistet:

:~$ reprepro list precise 
precise|main|i386: tkmon 0.0.1-1
precise|main|amd64: tkmon 0.0.1-1
precise|main|source: tkmon 0.0.1-1

Die Baumübersicht zeig, wo sich die Pakete in der Verzeichnisstruktur befinden:

:~$ tree packages/
packages/
├── conf
│   ├── distributions
│   └── updates
├── db
│   ├── checksums.db
│   ├── contents.cache.db
│   ├── packages.db
│   ├── references.db
│   ├── release.caches.db
│   └── version
├── dists
│   ├── precise
│   │   ├── main
│   │   │   ├── binary-amd64
│   │   │   │   ├── Packages
│   │   │   │   ├── Packages.gz
│   │   │   │   └── Release
│   │   │   ├── binary-i386
│   │   │   │   ├── Packages
│   │   │   │   ├── Packages.gz
│   │   │   │   └── Release
│   │   │   └── source
│   │   │       ├── Release
│   │   │       └── Sources.gz
│   │   └── Release
│   └── stable -> precise
└── pool
    └── main
        └── t
            └── tkmon
                ├── tkmon_0.0.1-1_all.deb
                ├── tkmon_0.0.1-1.debian.tar.gz
                ├── tkmon_0.0.1-1.dsc
                └── tkmon_0.0.1.orig.tar.gz

Pakete entfernen

Um Pakete zu entfernen wird das remove Kommando aufgerufen. Das folgende Beispiel beschränkt das Entfernen außerdem auf eine bestimmte Architektur:

:~$ reprepro -A amd64 remove precise tkmon
Exporting indices...
:~$ reprepro list precise 
precise|main|i386: tkmon 0.0.1-1
precise|main|source: tkmon 0.0.1-1

Bereitstellung des Repos über Apache

Für die Verbreitung des Repos über einen Webserver stehen mehrerer Möglichkeiten zur Verfügung. Für alle Varianten gilt, dass die internen Konfigurations-Datein "/conf" und "/db" vor unerlaubten Zugriff geschützt werden sollten. Das folgende Setup verwendet "mod userdir" für die Veröffentlichung im Home-Verzeichnis des Users "repository". Im ersten Schritt wir das Module "userdir" aktiviert:[4]

:~$ sudo a2enmod userdir

Aus Sicherheitsgründen und weil keine anderen User "userdir" verwenden sollten, wird die userdir Konfigurations-Datei wie folgt modifiziert:

:~$ sudo vi /etc/apache2/mods-enabled/userdir.conf
<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled
        UserDir enabled repository
[...]

Daraufhin wir im Home-Verzeichnis von repository der public_html Ordner erstellt:

:~$ mkdir public_html

Ein symbolischer Link stellt die Pakete im public_html zur Verfügung:

:~/public_html$ ln -s ../packages packages

Eine Änderung in den Dateirechten verhindert den Zugriff auf die Konfigurations-Ordner:

:~/public_html/packages$ chmod 750 conf/
:~/public_html/packages$ chmod 750 db/

Erstellen einer ".list" Datei

Die ".list"-Datei vereinfacht das Hinzufügen des Repos für den User:[5]

:~/public_html$ vi tkmon.list
deb http://192.168.56.102/~repository/packages precise main

Die IP-Adresse muss entsprechend dem richtigen Hostnamen angepasst werden!

Hinzufügen des Repos am User-Client

Ein User kann das Repo wie folgt hinzufügen und verwenden:

:~$ wget http://192.168.56.102/~repository/tkmon.list
:~$ sudo mv tkmon.list /etc/apt/sources.list.d/
:~$ sudo apt-get update
:~$ apt-cache search tkmon
tkmon - web based configuration for tk-monitoring appliance

Dem User stehen somit die Pakete am Client zur Verfügung.

Hash-Algorithmus des Repositorys auf SHA-2 umstellen

Dieser Abschnitt zeigt, wie Sie Ihr Repository mit einem sicheren SHA512 Hash-Algorithmus ausstatten.

Verhalten von apt update bei der Verwendung von SHA1

Unter Ubuntu 16.04 werden beim Aufruf von "apt update" Warnungen angezeigt, wenn ein Repository mit einer veralteten und schwachen SHA1 Hashmethode verwendet wird.

$ sudo apt update
[...]
W: http://archive.thomas-krenn.com/packages/dists/trusty/InRelease: Signature by key E191B7D9E6169E6DAA71EF12F9E765F60B8738CA uses weak digest algorithm (SHA1)

Repository aktualisieren

Dieses Problem lässt sich, wie nachfolgend beschrieben, schnell beheben.

  • Melden Sie sich an Ihrem Repository-Server an.
  • Wechseln Sie zum passenden User, in diesem Beispiel wird unter dem User repo das Repository verwaltet.
  • Öffnen Sie mit einem Editor, z.B. vim, die gpg.conf Datei des Repositorys.
    • sudo vi .gnupg/gpg.conf
  • Ergänzen Sie in dieser Datei die folgenden Einträge:[6] [7]
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 BZIP2 ZLIB ZIP Uncompressed
cert-digest-algo SHA512
personal-digest-preferences SHA512 SHA384 SHA256
  • Speichern Sie die Datei ab und schließen Sie den Editor.

InRelease Datei des Repos neu erstellen

Bei bestehenden Repos wird die InRelase Datei anschließend aktualisiert. Dies geschieht durch erneutem Export der entsprechenden Repositories.

  • Export des Repositories, hier am Beispiel eines Ubuntu 14.04 (trusty) Repos.
    • reprepro export trusty
    • Geben Sie den GPG-Key des Repo-Users zur Signierung an.
  • Prüfen der InRelease Datei:
    • In dieser Datei sollte nun in den ersten Zeilen folgende Ausgabe stehen:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
[...]

apt update nach der Aktualisierung auf SHA512

Die Warnung wird nun nicht mehr angezeigt, Sie können dies per erneutem Aufruf von apt update überprüfen.

Einzelnachweise

  1. apt-mirror (wiki.ubuntuusers.de)
  2. reprepro Webseite (alioth.debian.org)
  3. reprepro man-Page (alioth.debian.org)
  4. Apache public_html HOWTO (apache.org)
  5. Setting up signed apt repository with reprepro (wiki.debian.org)
  6. Generating GnuPG keys (wiki.debian.org)
  7. repository auf SHA512 umgestellt nach (uses weak digest algorithm (SHA1)) Warnung (blog.chr.istoph.de)


Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

Samba-Server Security
System-Statistiken unter Ubuntu mit serverstats sammeln
Ubuntu