Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
In modernen Produktionsumgebungen sind Debian und Ubuntu die Arbeitspferde unzähliger Container, VMs und Bare-Metal-Server. Wer Paket- und Repository-Management nur mit den Standarddefaults betreibt, verschenkt Stabilität, Sicherheit und Performance. In diesem Tutorial steigen wir tief in die fortgeschrittene APT-Nutzung ein: Sie lernen Pinning, sauber signierte Repositories ohne legacy apt-key, lokale Caching-Proxies, Private-Repos mit Snapshots, gespiegelte Upstream-Repositories und Automatisierung. Zudem zeigen wir, wie sich das meiste in grafischen UIs auf Ubuntu nachvollziehen lässt.
Die Zielgruppe sind fortgeschrittene Linux- und DevOps-Professionals, die reproduzierbare Builds, sicheres Patch-Management und kontrollierte Rollouts über viele Systeme hinweg sicherstellen müssen. Der Fokus liegt auf Debian und Ubuntu (Server/Cloud & Desktop) mit Beispielen für CLI, Konfigurationen und passende UI-Schritte.
Sie benötigen Root- oder Sudo-Rechte auf einem Debian- oder Ubuntu-System. Kenntnisse in Linux-Netzwerkgrundlagen, systemd, grundlegender GPG-Nutzung und Git/CI sind hilfreich. Für einige Abschnitte wie private Repos setzen wir Basiskenntnisse in HTTP-Serving (Nginx/Apache) voraus.
APT aggregiert Paketquellen (sources.list und *.list in sources.list.d), lädt Indexdaten (Packages, Release) und validiert Signaturen. Das Vertrauensmodell von APT basiert auf mit GPG signierten Release-Dateien der Repositories. Das sorgt dafür, dass nur Pakete aus Quellen installiert werden, deren Release-Dateien mit einem Ihnen bekannten Schlüssel signiert wurden.
Wichtig: Der historische Weg über apt-key ist deprecatiert. Moderne Setups verwenden per-Repository-Keyrings und das signed-by-Attribut in der APT-Source. Das reduziert die Vertrauensfläche und verhindert, dass ein einzelner globaler Schlüssel alle Repos autorisiert. Weitere Details finden Sie in den offiziellen Manpages und Howtos: apt-secure(8) und sources.list(5) auf manpages.debian.org und manpages.ubuntu.com.
Trust-Links: apt-secure(8), apt_preferences(5), Debian Wiki: Secure APT, Ubuntu Server: Package Management.
Bevor Sie etwas ändern, verschaffen Sie sich einen Überblick über Quellen, Prioritäten und aktive Policies.
sudo apt-get update
apt-cache policy
apt-cache policy <paketname>
Mit apt-cache policy sehen Sie die Herkunft (Origin, Suite, Version) und die eingestellten Prioritäten. Notieren Sie, welche Repositories aktiv sind und woher kritische Pakete stammen.
Listen Sie Ihre Sources auf:
grep -R "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/ | sed 's/#.*$//' | sed '/^\s*$/d'
Und prüfen Sie globale APT-Konfigurationen:
grep -R . /etc/apt/apt.conf.d/ | sed 's/#.*$//'
apt-key ist veraltet, weil es Schlüssel global in trusted.gpg einträgt. Best Practice ist, für jedes Repo einen separaten Keyring in /usr/share/keyrings abzulegen und die Source mit signed-by zu binden. So minimieren Sie die Vertrauensdomäne eines Schlüssels.
Beispiel: Einbinden eines Drittanbieter-Repos mit signiertem Keyring.
# 1) Key herunterladen und als dearmored GPG-Keyring ablegen
curl -fsSL https://example.com/repo-signing-key.gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/example-archive-keyring.gpg
# 2) Repository-Datei erstellen (Anpassen: Suite & Archs)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/example-archive-keyring.gpg] \
https://repo.example.com/debian stable main" | \
sudo tee /etc/apt/sources.list.d/example.list
# 3) Aktualisieren und testen
sudo apt-get update
apt-cache policy | grep -A2 example.com
Vermeiden Sie apt-key add <key>. Sie erweitern sonst die globale Trust-List. Prüfen Sie die offizielle Empfehlung in den Manpages: apt-key(8) weist explizit auf die Deprecation hin.
Optional: Halten Sie Keyrings unter Versionskontrolle (z. B. in einem Konfigurations-Repo) und verteilen Sie sie mit Ihrem CM-Tool (Ansible, Puppet, Chef). Damit dokumentieren und auditieren Sie den Trust-State Ihrer Flotte.
Mit apt Pinning steuern Sie, aus welchem Repository welche Version bevorzugt wird. Das ist essenziell, wenn Sie Backports, PPAs oder mehrere Suiten (z. B. bionic, bionic-updates, bionic-security) parallel nutzen. Pinning wird über /etc/apt/preferences(.d/*.pref) gesteuert.
Wichtige Eckpunkte:
Beispiel: Debian Backports nur auf Nachfrage erlauben (empfohlen), aber nicht automatisch bevorzugen:
sudo tee /etc/apt/preferences.d/99-backports.pref >/dev/null <<'EOF'
Package: *
Pin: release a=bullseye-backports
Pin-Priority: 100
EOF
# Nutzung für einzelnes Paket:
sudo apt-get -t bullseye-backports install <paket>
Beispiel: Bevorzugen von Security-Updates gegenüber -updates und -proposed:
sudo tee /etc/apt/preferences.d/90-security.pref >/dev/null <<'EOF'
Package: *
Pin: release a=jammy-security
Pin-Priority: 990
Package: *
Pin: release a=jammy-updates
Pin-Priority: 500
Package: *
Pin: release a=jammy-proposed
Pin-Priority: 100
EOF
Beispiel: PPA streng einschränken, nur für ein konkretes Paket erlauben:
# 1) PPA hinzufügen (siehe nächster Abschnitt für sichere Key-Verwaltung)
# 2) Nur Paket foo darf aus dem PPA installiert werden
sudo tee /etc/apt/preferences.d/50-ppa-foo.pref >/dev/null <<'EOF'
Package: *
Pin: origin ppa.launchpad.net
Pin-Priority: 100
Package: foo
Pin: origin ppa.launchpad.net
Pin-Priority: 700
EOF
Tipp: Nutzen Sie apt-cache policy foo, um zu prüfen, ob Ihr Pinning greift. Beachten Sie, dass Origin/Suite je nach Repo variieren. Lesen Sie die Release-Dateien mit apt-cache policy oder apt-cache madison.
PPAs (Personal Package Archives) sind bei Ubuntu verbreitet, bringen aber Risiken. Verwenden Sie PPAs sparsam, pinnen Sie strikt und setzen Sie Repository-spezifische Keyrings. Offizielle PPA-Dokumentation: Launchpad PPA.
CLI-Variante mit add-apt-repository und modernem Keyring-Ansatz:
# Beispiel-PPA: ppa:mozillateam/ppa (als Platzhalter)
# 1) Key herunterladen und binden
UBU_CODENAME=$( . /etc/os-release && echo "$UBUNTU_CODENAME" )
PPA_PATH="https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu"
curl -fsSL "${PPA_PATH}/dists/${UBU_CODENAME}/Release.gpg" | \
sudo gpg --dearmor -o /usr/share/keyrings/mozillateam-ppa.gpg
# 2) Source anlegen (mit signed-by)
echo "deb [signed-by=/usr/share/keyrings/mozillateam-ppa.gpg] ${PPA_PATH} ${UBU_CODENAME} main" | \
sudo tee /etc/apt/sources.list.d/mozillateam-ppa.list
sudo apt-get update
UI-Variante auf Ubuntu Desktop: Öffnen Sie „Software & Aktualisierungen“ → Reiter „Andere Software“ → „Hinzufügen“. Tragen Sie die APT-Zeile z. B. „deb https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu jammy main“ ein. Der grafische Dialog verwaltet standardmäßig Schlüssel globaler – kombinieren Sie das mit manueller signed-by-Pflege für bestmögliche Sicherheit.
Pinning für PPAs ist Pflicht in Produktivumgebungen, um unbeabsichtigte Massenupdates zu verhindern. Siehe Beispiel im vorherigen Abschnitt.
Neben Pinning sind Holds nützlich, um Upgrades temporär zu blockieren. Verwenden Sie apt-mark hold, um kritische Services zu stabilisieren, etwa vor großen Events:
sudo apt-mark hold nginx
apt-mark showhold
Downgrades sind mit apt-Prioritäten > 1000 möglich, sollten aber mit Vorsicht genutzt werden. Regeln Sie Freigaben über Metriken (Canary Hosts) und rollen Sie erst danach flächig aus. In CI/CD können Sie Versionsstrings festschreiben und mit dpkg –compare-versions testen.
Ein Cache-Proxy reduziert Bandbreite, beschleunigt Deployments und stabilisiert Updates bei Netzproblemen. apt-cacher-ng ist dafür ein bewährter, leichter Dienst.
Installation auf einem dedizierten Host (z. B. cache.internal):
sudo apt-get update
sudo apt-get install -y apt-cacher-ng
Standardmäßig lauscht apt-cacher-ng auf Port 3142. Prüfen Sie die Konfiguration in /etc/apt-cacher-ng/acng.conf. Hilfreiche Optionen sind ReportPage, Remap-Parameter und Exclude-Listen. Offizielle Doku: apt-cacher-ng.
Clients konfigurieren Sie via APT-Proxy:
echo 'Acquire::http::Proxy "http://cache.internal:3142";' | sudo tee /etc/apt/apt.conf.d/01proxy
Für HTTPS-Repos nutzt apt-cacher-ng ein spezielles Remapping (Es wird der Host im Pfad codiert). Testen Sie Updates:
sudo apt-get update
In großen Umgebungen empfiehlt sich die zentrale Verteilung der Proxy-Konfiguration via Cloud-Init, Ansible oder System-Image-Builds. Für Fallbacks können Sie Acquire::http::ProxyAutoDetect nutzen.
Für reproduzierbare Builds und kontrollierte Rollouts sind private Repositories mit Snapshots ideal. aptly ist ein beliebtes Tool, um Repos zu aggregieren, zu snapshotten und zu veröffentlichen – lokal oder auf S3/HTTP. Doku: aptly.
Installation:
sudo apt-get install -y gnupg2 aptly
GPG-Schlüssel erstellen (oder vorhandenen verwenden):
gpg --quick-gen-key "Repo Signing (Company) <[email protected]>" rsa4096 sign 2y
KEYID=$(gpg --list-keys --with-colons | awk -F: '/^pub/ {print $5; exit}')
Lokales Repo anlegen und Pakete einspielen:
# Neues Repo anlegen
aptly repo create -comment="internal base repo" -distribution=stable -component=main internal-base
# .deb-Pakete hinzufügen (eigene Builds oder fremde Artefakte)
aptly repo add internal-base /path/to/*.deb
# Snapshot erstellen
aptly snapshot create internal-2025-08-01 from repo internal-base
Snapshot veröffentlichen (signiert) und via Nginx servieren:
aptly publish snapshot -gpg-key="${KEYID}" internal-2025-08-01
# Standardpfad: ~/.aptly/public
# Nginx-Snippet
sudo tee /etc/nginx/sites-available/aptly.conf >/dev/null <<'EOF'
server {
listen 80;
server_name repo.internal;
root /home/aptly/.aptly/public;
location / {
autoindex on;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/aptly.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Clients binden den Repo-Key (dearmored) und die Source ein:
curl -fsSL http://repo.internal/public/keyring.gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/internal-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/internal-archive-keyring.gpg] \
http://repo.internal stable main" | sudo tee /etc/apt/sources.list.d/internal.list
sudo apt-get update
Mit aptly-Snapshots können Sie Releases einfrieren, testen und anschließend promote-publishen, ohne dass sich der Inhalt ändert. Sie können auch Remote-Repos spiegeln und daraus Subsets publizieren, inklusive Filters. Für produktive Pipelines lohnt sich die Kombination mit CI (GitHub Actions/GitLab CI) und S3-Backends.
Für Standorte mit schwacher Konnektivität oder Compliance-Anforderungen können Sie offizielle Debian/Ubuntu-Repos mit debmirror spiegeln. Das ist schwergewichtiger als Caching, bietet aber vollständige Kontrolle und Planbarkeit. Debian Anleitung: Debian Mirroring.
Beispiel: Teilspiegel für Ubuntu jammy amd64 (main, universe):
sudo apt-get install -y debmirror gnupg
sudo mkdir -p /srv/mirror/ubuntu
sudo debmirror --arch=amd64 \
--section=main,universe \
--dist=jammy,jammy-updates,jammy-security \
--method=http --host=archive.ubuntu.com --root=ubuntu \
--progress --i18n --passive \
--ignore-release-gpg --nosource \
/srv/mirror/ubuntu
Validieren Sie Signaturen und konfigurieren Sie GPG-Keys für die Release-Prüfung (ignorerelated Flags oben sind nur für initiale Tests). Stellen Sie den Mirror per Nginx bereit und referenzieren Sie ihn in Ihren clientspezifischen sources.list-Dateien. Für Debian tauschen Sie Host/Root/Suites entsprechend aus.
Für Flottenverwaltung sind deklarative Playbooks unverzichtbar. Ab Ansible 2.10 sollten Sie apt_key nicht mehr nutzen, sondern Keyrings manuell bereitstellen und signed-by referenzieren.
Beispiel-Playbook: Repository mit Keyring und Pinning:
---
- hosts: all
become: true
tasks:
- name: Deploy repo keyring
get_url:
url: https://repo.example.com/keys/example.gpg
dest: /usr/share/keyrings/example-archive-keyring.gpg
mode: '0644'
register: key
- name: Configure APT source
copy:
dest: /etc/apt/sources.list.d/example.list
content: |
deb [arch=amd64 signed-by=/usr/share/keyrings/example-archive-keyring.gpg] \
https://repo.example.com/debian stable main
notify: apt update cache
- name: Pin repo selectively
copy:
dest: /etc/apt/preferences.d/50-example.pref
content: |
Package: *
Pin: origin repo.example.com
Pin-Priority: 100
Package: myapp
Pin: origin repo.example.com
Pin-Priority: 800
handlers:
- name: apt update cache
apt:
update_cache: yes
Für Proxy-Settings definieren Sie Acquire::http::Proxy via ansible.builtin.copy oder template und verteilen sie zentral.
Beim Bau von Container-Images ist APT-Handling oft ausschlaggebend für Größe, Sicherheit und Reproduzierbarkeit. Best Practices:
Beispiel-Dockerfile (Ubuntu):
FROM ubuntu:22.04
SHELL ["/bin/bash", "-euxo", "pipefail", "-c"]
RUN echo 'Acquire::Retries "3";' > /etc/apt/apt.conf.d/80-retries \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
ca-certificates curl \
&& rm -rf /var/lib/apt/lists/*
Für private Repos im Build: Binden Sie Keyrings read-only ein, nutzen Sie Build Secrets oder ARGs für temporäre Token. Entfernen Sie sensible Dateien vor dem finalen Layer (Multi-Stage Builds).
Auch wenn Server headless sind, hilft es, UI-Pfade zu kennen – etwa für Entwickler-Workstations.
Repos verwalten:
PPAs: Über „Andere Software“ können Sie PPAs hinzufügen. Achten Sie darauf, die resultierenden .list-Dateien und Schlüssel anschließend manuell zu härten (signed-by, Pinning). Verbinden Sie das mit CLI-Praktiken aus diesem Tutorial.
Synaptic (optional): Mit Synaptic sehen Sie unter „Ursprung/Origin“ schnell, aus welchem Repo eine Version stammt, und können gezielt Versionen auswählen. Für Pinning bleibt die CLI maßgeblich.
Fehler „NO_PUBKEY“ oder „The following signatures couldn’t be verified“:
echo 'Acquire::Check-Valid-Until "false";' | sudo tee /etc/apt/apt.conf.d/99no-check-valid-until
Dieser Workaround schwächt die Sicherheitsgarantien und sollte nur temporär genutzt werden, bis der Mirror aktualisiert ist.
Proxy-Probleme: Wenn apt-get update bei HTTPS-Repos hinter einem strengen Proxy hängt, setzen Sie Acquire::https::Proxy analog zu http. Beispiel:
sudo tee /etc/apt/apt.conf.d/01proxy >/dev/null <<'EOF'
Acquire::http::Proxy "http://proxy.internal:3128";
Acquire::https::Proxy "http://proxy.internal:3128";
EOF
Langsame Update-Läufe: Aktivieren Sie pipelining und Retries vorsichtig, beachten Sie Upstream-Kompatibilität:
sudo tee /etc/apt/apt.conf.d/80-tuning >/dev/null <<'EOF'
Acquire::Retries "3";
Acquire::CompressionTypes::Order { "gz"; };
APT::Get::Assume-Yes "false";
APT::Install-Recommends "false";
EOF
Konflikte bei gemischten Suiten: Nutzen Sie apt-cache policy und apt-get -s install <paket> zur Simulation. Pinnen Sie restriktiver und reduzieren Sie die Anzahl der aktiven Fremdrepos.
Fehleranalyse auf Paketebene: Lesen Sie /var/log/apt/term.log und /var/log/dpkg.log. Für Pre-/Postinst-Hooks nutzen Sie systemctl status, journalctl -u apt-daily.service und prüfen Trigger in /var/lib/dpkg/info/.
Für produktionskritische Systeme lohnt es, kritische Bugs und Changelogs vor der Installation einzusehen. apt-listbugs warnt vor RC-Bugs, apt-listchanges zeigt Changelogs an.
sudo apt-get install -y apt-listbugs apt-listchanges
Konfiguration erfolgt über Debconf bzw. /etc/apt/listchanges.conf. Für Non-Interactive-Umgebungen können Sie Mails versenden lassen oder die Ausgabe in CI-Pipelines escapen.
Trust-Links: Debian Wiki: apt-listbugs, apt-listchanges(1).
Ubuntu:
Debian:
Best Practice: Security hoch priorisieren, Backports nur gezielt pinnen, proposed/testing nur selektiv und kurzzeitig einsetzen. Dokumentieren Sie Ihre Kanalstrategie, um Überraschungen in Wartungsfenstern zu vermeiden.
Verwenden Sie per-Repo Keyrings, führen Sie Schlüsselrotationen geplant durch und versionieren Sie alle APT-Konfigurationen. Auditieren Sie regelmäßig /etc/apt/sources.list.d auf Sprawl. Nutzen Sie CI-Checks, die unerwünschte Origins in Pull Requests blockieren.
Ergänzen Sie Compliance durch eine Positivliste erlaubter Repos in Ihrer CM-Engine und verifizieren Sie auf Hosts mit einem Compliance-Agent oder OSQuery. Für verteilte Teams kann eine interne Dokumentation mit generierten apt policy Snapshots pro Environment helfen.
Fassen Sie die Punkte in einer Pipeline zusammen:
Mit diesem Setup erhalten Sie reproduzierbare, kontrollierte und auditierbare Paketflüsse, die auch bei großen Flotten und mehreren Standorten skalieren.
Offizielle Dokumentation:
Tools und Projekte:
APT ist weit mehr als apt-get install. Wer Debian/Ubuntu produktionsreif betreiben will, braucht kontrollierte Vertrauensketten, präzises Pinning, reproduzierbare Repos mit Snapshots sowie performante Verteilung via Caching oder Spiegel. Mit per-Repo signed-by-Keyrings reduzieren Sie Risiko, mit Pinning und Holds beherrschen Sie Rollouts, und mit aptly plus apt-cacher-ng skalieren Sie die Versorgung ganzer Flotten. Ergänzen Sie das Ganze durch klare Governance, Automatisierung und Monitoring – und Sie heben Ihr Paketmanagement auf Enterprise-Niveau.
Wenn Sie diese Bausteine schrittweise umsetzen, profitieren Sie von kürzeren Deployments, weniger Überraschungen bei Updates und einer nachvollziehbaren Supply-Chain für Systempakete. Der nächste Schritt ist, Ihre bestehende Umgebung zu inventarisieren, einen Proof of Concept für Keyring/Signed-By und Pinning aufzusetzen und anschließend Caching sowie private Repos einzuführen. So schaffen Sie eine solide Basis für sichere, schnelle und reproduzierbare Releases auf Debian und Ubuntu.