Wenn Ubuntu dunkel wird: Das Playbook für CTOs zu Mirrors, OCI‑Proxys und hermetischen Builds

Von Diogo Hudson Dias
DevOps engineer in a São Paulo server room setting up a local package mirror on a rack-mounted server

Wenn ein DDoS auf die Ubuntu‑Infrastruktur Ihre CI/CD über Stunden ausbremsen kann, ist Ihre Software‑Lieferkette zu brüchig. Die Ausfälle bei Ubuntu letzte Woche waren nichts Exotisches – nur genug Netzwerkkummer, damit apt update hängt, Docker‑Pulls kriechen und Wartungsfenster explodieren. Die Lehre: Gehen Sie davon aus, dass Upstreams zum schlechtesten Zeitpunkt ausfallen – und konstruieren Sie darum herum.

Dieser Beitrag ist der Entscheidungsrahmen und die Bauanleitung, die ich mir auf jedem CTO‑Schreibtisch wünsche: wie Sie Ihre Organisation mit lokalen apt‑Mirrors, OCI‑Registry‑Proxys, Sprachpaket‑Caches und hermetischen Builds härten. Kein Vendor‑Theater. Es ist ein Aufwand von zwei bis sechs Wochen, der Upstream‑Chaos in ein Nichts‑Ereignis verwandelt.

Was tatsächlich kaputtging – und warum Sie es gespürt haben

Als Ubuntus Dienste gedrosselt wurden, haben Sie vermutlich Folgendes erlebt:

  • Builds, die bei apt update und apt install für Basis‑Images oder AMIs hängen blieben.
  • Timeouts bei docker pull ubuntu:22.04 oder Laufzeit‑Images, weil eine öffentliche Registry langsam und ungecacht war.
  • Kubernetes‑Nodes konnten Pods nicht starten, weil Image‑Pulls von Docker Hub oder GHCR rate‑limitiert und nicht proxied waren.
  • Wartungsfenster, die von 30 Minuten auf mehrere Stunden anwuchsen, weil Mirrors inkonsistent waren.

Nichts davon ist Ubuntu‑spezifisch. Debian, Alpine, npm, PyPI, crates.io, Docker Hub – jeder öffentliche Dienst hat Ausfälle und Rate Limits. Die Frage ist, ob Ihre Pipeline kontrolliert degradiert oder aufhört zu liefern.

Ein Entscheidungsrahmen: Cache, Mirror oder hermetisch?

Sie haben drei Hebel, in aufsteigender Reihenfolge von Aufwand und Reduktion des Blast‑Radius:

  1. Cache öffentliche Artefakte hinter lokalen Proxys. Schnell umgesetzt. Gut für Bandbreite und kurze Ausfälle. Bei Cache‑Misses weiterhin abhängig vom Upstream.
  2. Mirror bestimmte Repos in Ihren eigenen Storage und stellen Sie sie intern bereit. Mehr Arbeit. Nimmt für bekannte, geprüfte Versionen den Großteil der Upstream‑Abhängigkeit heraus.
  3. Hermetische Builds mit gepinnten Inputs, inhaltsadressierten Images und einer Allowlist‑Egress‑Policy. Der größte Aufwand. Bringt Reproduzierbarkeit und echte Supply‑Chain‑Kontrolle.

Wählen Sie basierend auf zwei Faktoren: Ihrer Release‑Kadenz und Ihrer Risikotoleranz. Wenn Sie wöchentlich shippen und in regulierten Märkten unterwegs sind (Fintech, Health, Infra), brauchen Sie jetzt mindestens Mirrors und im nächsten Quartal Hermetik. Wenn Sie noch vor Produkt‑Markt‑Fit sind oder der Burn begrenzt ist, starten Sie in diesem Sprint mit Caches und rüsten später auf.

Die Zielarchitektur (pragmatisch, nicht perfekt)

Hier ist der Stack, den wir für US‑Startups mit unserem Brazil‑basierten Platform‑Team implementieren – 6–8 Stunden Overlap und typischerweise 20–30% günstiger als ein US‑SRE‑Sprint, vor allem aber in Wochen statt Quartalen abgeschlossen:

  • OCI‑Registry‑Proxy‑Cache (Harbor, Artifactory oder vanilla registry:2 im Proxy‑Modus) für Docker Hub, GHCR, Quay und Ihre eigenen privaten Registries.
  • apt‑Caching und Snapshots über apt-cacher-ng für schnelle Erfolge, plus ein kuratierter, versionierter Mirror mit aptly oder reprepro für das Ubuntu/Debian, das Sie tatsächlich nutzen.
  • Sprachpaket‑Repos lokal proxied: Verdaccio für npm, devpi für PyPI, Nexus/Artifactory für Maven/Gradle, Athens oder goproxy für Go, ein Sparse‑Registry‑Mirror für Cargo.
  • Hermetische Build‑Schicht für Ihre kritischsten Services mit Bazel oder Nix, mit nach Digest gepinnten Container‑Basis‑Images, SBOM‑Erzeugung und Image‑Signierung via Sigstore cosign.
  • Egress‑Policy, die CI‑ und Build‑Nodes ausschließlich über Ihre Proxys und Mirrors leitet; Staging hat einen One‑Click‑Kill‑Switch für das Upstream‑Internet, um Resilienz zu testen.

Das funktioniert in der Cloud (EKS/GKE/AKS) und on‑prem. Sie können in einem Tag mit Caches starten, dann die Hot Paths snapshotten/spiegeln und schließlich mit hermetischen Builds abdichten, während Sie Dockerfiles und Pipelines refaktorieren.

Schritt 1: Container‑Images pinnen und proxen

Die meiste CI‑Langsamkeit beginnt mit FROM ubuntu:22.04 und einem dynamischen Pull aus einer öffentlichen Registry. Zwei Maßnahmen ändern das Spiel:

  • Per Digest pinnen. Statt FROM ubuntu:22.04 verwenden Sie FROM ubuntu@sha256:… Das eliminiert Tag‑Drift und garantiert Bit‑für‑Bit‑Reproduzierbarkeit. Jedes Basis‑Image, das Sie nicht pinnen, ist ein Ausfall und Supply‑Chain‑Bug in Wartestellung.
  • Eine Proxy‑Registry einführen. Setzen Sie Harbor oder registry:2 mit Proxy‑Caching für docker.io, ghcr.io und quay.io auf. Zeigen Sie alle Build‑Agents und Cluster standardmäßig auf Ihren Proxy als Registry‑Mirror. Bei Cache‑Treffern reduzieren sich die Pull‑Zeiten in den meisten Organisationen um 50–80% und sie werden immun gegen öffentliche Rate Limits.

Trade‑offs: Sie müssen skalierbaren Storage betreiben (S3/GCS/Azure Blob Backends sind ok), Cache‑Hit‑Raten überwachen und Metadaten sichern. Der Betriebsaufwand bleibt jedoch moderat – denken Sie an eine kleine t3.medium‑VM plus Objektspeicher zum Start.

Schritt 2: apt mit Caches und Snapshots reparieren

Starten Sie mit apt-cacher-ng für eine sofortige Reduktion der apt‑Langsamkeit. Ein Proxy, ein DNS‑Eintrag, und Builds hören auf, bei jeder Paketinstallation die öffentliche Mirror‑Farm zu belasten.

Dann steigen Sie auf einen Mirror mit Snapshotting um, damit sich Ihr Paketset nicht mehr unterm laufenden Betrieb verändert:

  • Nur spiegeln, was Sie nutzen. Verwenden Sie aptly oder reprepro, um einen kuratierten Ubuntu/Debian‑Mirror für Ihre Architekturen und Komponenten zu erstellen (z. B. jammy main, universe, security). Veröffentlichen Sie Snapshots nach S3 und liefern Sie sie über CloudFront oder eine kleine NGINX‑VM in Ihrer VPC aus.
  • Snapshot pro Release. Erstellen Sie bei jedem Release‑Branch einen datierten Snapshot; zeigen Sie CI auf diese Snapshot‑URL. Sie erhalten deterministische apt install‑Ergebnisse und können Snapshots nach Ihrem Takt fortschreiben.

Ja, Sie können allein mit Caches leben. Aber an dem Tag, an dem ein Paket zurückgezogen wird oder sich eine Abhängigkeit unter Ihnen ändert, wünschen Sie sich einen Snapshot zum Zurückrollen.

Schritt 3: Sprach‑Ökosysteme hinter den eigenen Perimeter bringen

Der Ubuntu‑Ausfall traf nicht nur OS‑Pakete. Wenn npm, PyPI oder crates.io blinzeln, steht Ihr Monorepo still. Bringen Sie diese hinter Ihre eigenen Endpunkte:

  • npm: Verdaccio mit Uplinks zu registry.npmjs.org. Speichern Sie hier auch private Pakete.
  • PyPI: devpi oder Artifactory. Pre‑cachen Sie Ihre häufigsten Wheels – Builds sind deutlich schneller, wenn Sie Source‑Builds vermeiden.
  • Maven/Gradle: Sonatype Nexus oder Artifactory als Proxy und Host. Verweisen Sie die settings.xml darauf – fertig.
  • Go: Athens betreiben oder GOPROXY auf Ihren eigenen goproxy‑Server konfigurieren.
  • Rust: das Sparse‑Registry‑Protokoll von Cargo nutzen und den Index spiegeln; Sie können eine interne Registry für proprietäre Crates hosten.

Bonus: Sobald Sie diese Ökosysteme proxen, können Sie in Lockfiles exakte Versionen pinnen, ohne 404er oder Rate Limits fürchten zu müssen. Ihre Supply‑Chain‑SBOMs werden belastbar, weil die Inputs nicht mehr floaten.

Schritt 4: Kritische Services hermetisch machen

Hermetische Builds bedeuten: Jeder Input ist deklariert, gepinnt und wird aus einem vertrauenswürdigen, von Ihnen kontrollierten Ort bezogen. Wenn Sie SLSA und Reproduzierbarkeit ernst nehmen, ist das Pflichtprogramm. Ein pragmatischer Einstieg:

  • Wählen Sie 2–3 kritische Services (z. B. Billing, Auth, Ingestion). Stellen Sie deren Dockerfiles auf gepinnte Base‑Image‑Digests um und heben Sie Build‑Logik in Bazel‑Regeln oder Nix‑Derivationen.
  • SBOMs erzeugen (CycloneDX oder SPDX) während des Builds und Images signieren mit cosign unter Verwendung Ihres Cloud‑KMS. Erzwingen Sie die Signaturprüfung zur Deploy‑Zeit über einen Admission‑Controller (Kyverno oder OPA Gatekeeper).
  • Distroless‑ oder Wolfi‑Basen bevorzugen

Verwenden Sie minimale Images wie Distroless oder Chainguard Wolfi, um bewegliche Teile zu reduzieren. Vorsicht: Alpines musl libc kann einige AI/ML‑ und glibc‑gebundene Abhängigkeiten brechen; Wolfi bietet glibc‑kompatible Varianten, und Distroless hat glibc‑Optionen. Vor breiter Einführung testen.Trade‑offs: Bazel/Nix bringen Lernkurve und CI‑Aufwand mit. Starten Sie dort, wo der Nutzen am höchsten ist. Über ein Quartal hinweg migrieren Sie den Rest der Flotte, wenn Sie die Services ohnehin anfassen.

Schritt 5: Egress absichern und Ausfälle üben

Nicht geübte Resilienz ist Theater. Zwei betriebliche Maßnahmen machen sie real:

  • CI/Build‑Egress einschränken auf Ihre Proxys und Mirrors. In der Cloud VPC‑Egress‑Gateways und Security Groups nutzen; on‑prem eine Firewall‑Allowlist. Ziel ist einfach: Wenn ein Build Upstreams nicht direkt erreichen kann, wissen Sie, dass Sie nicht heimlich davon abhängen.
  • Ausfall‑Drills durchführen. Einmal pro Sprint ein Feature‑Flag flippen, das das ausgehende Internet auf einem Staging‑Cluster und Ihrem CI‑Subnetz blockiert. Werden Builds fertig? Planen sich neue Pods? Sie finden Lücken – schließen Sie sie.

Messen Sie Erfolg mit einem einfachen KPI: Prozentsatz der Builds, die mit blockierter Upstream‑Konnektivität erfolgreich sind. Starten Sie unter 20%. Ziel: 90%+ innerhalb eines Quartals für Mainline‑Services.

Was das kostet (und einspart)

Zuerst die Cloud‑Rechnung: Ein kleiner Registry‑Proxy und Artefakt‑Proxys kosten einige hundert Dollar pro Monat an VM‑Zeit und Storage. Mirrors mit Snapshots fügen S3/Blob‑Storage hinzu, der mit Ihrem Paketvolumen skaliert; rechnen Sie über Monate mit Dutzenden bis wenigen Hundert GB. Im Gegenzug sparen Sie bei:

  • Entwicklerzeit: Wenn Ihre Org 300 Builds/Tag fährt und 20% davon bei einem Upstream‑Wobble je 10 Minuten hängen, sind das 600 Minuten/Tag Verlust. Bei einem All‑in‑Satz von $150/Stunde verbrennen Sie $1,5k/Tag für nichts – locker mehr als die Monatskosten eines sauberen Proxy/Mirror‑Setups.
  • Egress‑Gebühren: Pull‑through‑Caches reduzieren wiederholte Downloads über CI und Cluster hinweg. In Multi‑Region‑Setups spart das spürbar Geld.
  • Incident‑Thrash: Infra um 1 Uhr morgens zu pagern, um zu erklären, warum apt langsam ist, ist die Definition vermeidbarer Plackerei.

Implementierungszeit mit einem Senior‑Platform‑Engineer oder einem Nearshore‑SRE‑Duo:

  • Woche 1: Proxy‑Registry live, apt-cacher-ng läuft, npm/PyPI‑Proxys konfiguriert, CI durch Proxys geroutet.
  • Wochen 2–3: Kuratierter apt‑Mirror + Snapshots, erster hermetischer Service‑Build mit SBOM + Signierung, Egress‑Allowlist in CI/Staging durchgesetzt.
  • Wochen 4–6: Hermetisches Muster auf Top‑5‑Services ausweiten, Admission‑Policies in Prod ausrollen, routinemäßige Chaos‑Drills.

Trade‑offs, die Sie vorab anerkennen sollten

  • Sie betreiben nun mehr Infra. Ja – kleine, langweilige Services. Halten Sie sie als Code (Terraform/Kubernetes‑Manifeste), mit Metriken und Backups.
  • Pinning verlangsamt „mal eben updaten“‑Workflows. Genau das ist der Punkt. Sie aktualisieren nach Ihrem Plan, mit Tests – nicht an einem zufälligen Dienstag während eines DDoS.
  • Hermetische Builds sind nicht kostenlos. Bazel/Nix erhöhen die kognitive Last. Starten Sie dort, wo es zählt; zwingen Sie es nicht ab Tag 1 überall auf.
  • Minimale Images können die Debuggability beeinträchtigen. Fügen Sie eine Debug‑Variante hinzu oder nutzen Sie ephemere Sidecars fürs Troubleshooting – nicht die Produktions‑Images.

Kubernetes härten, damit Pods weiter pullen

Zwei Muster verhindern, dass Image‑Pulls zu Ihrem nächsten 3‑Uhr‑nachts‑Incident werden:

  • Node‑lokale Registries: Betreiben Sie ein DaemonSet, das pro Node einen lokalen Pull‑through‑Cache bereitstellt. So verhindern Sie, dass N Pods über M Nodes einen entfernten Proxy niedertrampeln.
  • Cache wärmen: Kritische Images beim Deploy mit einem DaemonSet vorab pullen oder mit Packer in Node‑AMIs einbacken. Setzen Sie für stabile Services imagePullPolicy auf IfNotPresent, um Churn zu reduzieren.

Kombinieren Sie das mit Signaturprüfung: Lassen Sie nur Images zu, die mit Ihrem Schlüssel signiert und über Ihren Proxy geholt wurden. Wenn während eines Ausfalls ein bösartiges Image in einer öffentlichen Registry auftaucht, werden nicht Sie es pullen.

Compliance‑Bonus: Reproduzierbarkeit, die respektiert wird

SOC 2, ISO 27001 und besonders SLSA drängen zu nachvollziehbaren, reproduzierbaren Builds. Mit gepinnten Digests, SBOMs und signierten Artefakten hört Ihre Evidenz auf, PowerPoint zu sein, und wird kryptografische Wahrheit. Wenn Ihre Roadmap Verkäufe an Enterprises oder den Public Sector vorsieht, brauchen Sie diese Haltung ohnehin. Es jetzt für Resilienz zu tun, zahlt doppelt.

30‑60‑90‑Tage‑Plan, den Sie wirklich umsetzen können

Tag 0–30

  • Harbor oder registry:2 im Proxy‑Modus mit Objekt‑Storage‑Backend aufsetzen; CI und Cluster darauf routen.
  • apt-cacher-ng deployen; eine globale apt‑Proxy‑Konfiguration für Builder und AMI‑Images hinzufügen.
  • Verdaccio und devpi einrichten; Paketmanager in CI rekonfigurieren.
  • Für alle in diesem Monat angefassten Dockerfiles Base‑Images per Digest pinnen.
  • Einen Staging‑Egress‑Block einführen und den ersten Upstream‑off‑Drill durchführen.

Tag 31–60

  • Einen kuratierten Mirror mit aptly oder reprepro für Ubuntu/Debian bauen; Snapshots auf interne Endpunkte veröffentlichen; CI auf Snapshots zeigen.
  • Zwei kritische Services auf hermetische Builds mit Bazel oder Nix umstellen; SBOMs erzeugen und Images mit cosign signieren; Signaturprüfung in Staging durchsetzen.
  • Kritische Runtime‑Images via DaemonSet vorab pullen; wo praktikabel in Node‑Images einbacken.
  • Metriken instrumentieren: Cache‑Hit‑Rate, Build‑Erfolg bei upstream‑off, mittlere Image‑Pull‑Zeit.

Tag 61–90

  • Hermetische Builds auf Ihre Top‑5–8‑Services ausweiten; Admission‑Policies in Produktion ausrollen.
  • Change‑Management um Snapshot‑Fortschritte und Base‑Image‑Updates mit wöchentlicher Kadenz und Rollback‑Plänen etablieren.
  • Einen vollständigen Outage‑Game‑Day durchführen: Upstreams für 4 Stunden blockieren; ein Post‑Mortem mit Lücken und Maßnahmen erstellen.

Warum jetzt

Zwei Signale kamen in derselben Woche: Ubuntus Infrastruktur‑Wobble und eine viel diskutierte Linux‑Sicherheitslücke, entdeckt via KI‑gestütztem Scanning. Übersetzung: Upstreams bleiben fragil, und Angreifer werden besser darin, die Risse zu finden. Beide Probleme belohnen die gleiche Antwort – bewegliche Teile reduzieren, nur von vertrauenswürdigen Orten beziehen und Builds reproduzierbar machen.

Sie brauchen kein 12‑Monats‑Platform‑Rewrite. Sie brauchen einen Monat fokussierte Arbeit und den Willen, die Türen zu verriegeln, die Sie ohnehin schließen wollten. Wenn Sie keine Kapazität haben, leihen Sie sie sich bei einem Team, das sie hat; unsere SREs in Brazil liefern dieses Muster mit festem Scope. So oder so: Warten Sie nicht auf den nächsten Ausfall, um dieselbe Lektion zweimal zu lernen.

Wichtigste Erkenntnisse

  • Hören Sie auf, zur Build‑Zeit auf öffentliche Upstreams zu setzen. Fügen Sie in diesem Sprint Proxy‑Caches für OCI und die Sprach‑Ökosysteme hinzu.
  • Spiegeln und snapshotten Sie die OS‑Pakete, die Sie tatsächlich nutzen; zeigen Sie CI für deterministische apt install‑Vorgänge auf Snapshots.
  • Pinnen Sie Container‑Basen per Digest, erzeugen Sie SBOMs und signieren Sie mit cosign; erzwingen Sie die Verifikation mit einem Admission‑Controller.
  • Beschränken Sie CI‑Egress auf Proxys und führen Sie regelmäßige upstream‑off‑Drills durch; peilen Sie 90%+ Build‑Erfolg bei blockiertem Internet an.
  • Starten Sie hermetische Builds dort, wo es zählt, und weiten Sie sie über ein Quartal aus; minimale Basen wie Distroless oder Wolfi reduzieren Risiko und Bloat.
  • Die Kosten sind gering im Vergleich zu verlorener Entwicklerzeit; die Compliance‑Vorteile sind ein Bonus, den Sie ohnehin brauchen.

Ready to scale your engineering team?

Tell us about your project and we'll get back to you within 24 hours.

Start a conversation