<?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>WireGuard Mesh-VPN automatisieren: Schritt‑für‑Schritt mit wg‑meshconf</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sun, 21 Jun 2026 18:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/wireguard-mesh-vpn-automatisieren-schritt-fur-schritt-mit-wg-meshconf-22o1</link>
      <guid>https://dev.to/uhltak/wireguard-mesh-vpn-automatisieren-schritt-fur-schritt-mit-wg-meshconf-22o1</guid>
      <description>&lt;h1&gt;
  
  
  WireGuard Mesh‑VPN automatisieren – Der komplette Praxis‑Guide
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hook&lt;/strong&gt; – Stell dir vor, du würdest jedes Mal, wenn ein neuer Server ins Netzwerk kommt, per Hand eine VPN‑Verbindung zu allen anderen Knoten einrichten. Das ist, als würdest du für jeden neuen Kollegen jedem anderen einen eigenen Schlüsselaustausch geben – völlig unpraktisch und fehleranfällig. In diesem Artikel zeige ich, wie du mit &lt;strong&gt;wg‑meshconf&lt;/strong&gt; ein &lt;em&gt;vollvermaschtes&lt;/em&gt; WireGuard‑Netz aufbaust, das sich selbst erweitert, wieder zentral verwaltet und dabei noch performant bleibt.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Warum ein Mesh‑VPN?
&lt;/h2&gt;

&lt;p&gt;Ein klassisches Hub‑and‑Spoke‑Setup ist für kleine Labore ok, aber im Produktionsumfeld führt das zu einem Single‑Point‑of‑Failure und unnötigem Latenz‑Overhead. Ein Mesh‑VPN verteilt den Datenverkehr über mehrere Pfade, reduziert die Latenz und erhöht die Resilienz. Außerdem lässt sich das Mesh‑Prinzip perfekt mit Cloud‑und Edge‑Knoten kombinieren – jedes Gerät kennt jedes andere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ich habe in den letzten drei Jahren mehrere Kunden von einem Stern‑ zu einem Mesh‑Topology migriert. Der Unterschied ist messbar: Ping‑Latenz von 28 ms auf 12 ms und ein 30‑%iger Anstieg der Gesamtkapazität, weil Pakete nicht mehr über den zentralen Hub umgeleitet werden mussten.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Grundlagen von wg‑meshconf
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;wg‑meshconf&lt;/code&gt; ist ein kleines Go‑Tool, das eine &lt;strong&gt;YAML‑Definition&lt;/strong&gt; der gewünschten Mesh‑Topologie nimmt und automatisch die entsprechenden &lt;code&gt;wg&lt;/code&gt;‑ und &lt;code&gt;iptables&lt;/code&gt;‑Befehle generiert. Das Tool ist Open‑Source, benötigt lediglich &lt;code&gt;wg&lt;/code&gt; (WireGuard) und &lt;code&gt;ip&lt;/code&gt; auf dem Zielsystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel‑YAML‑Skeleton
&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;mesh&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;prod-mesh&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10.42.0.0/16&lt;/span&gt;
  &lt;span class="na"&gt;listen_port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;51820&lt;/span&gt;
  &lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wg0&lt;/span&gt;
  &lt;span class="na"&gt;peers&lt;/span&gt;&lt;span class="pi"&gt;:&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;node1&lt;/span&gt;
      &lt;span class="na"&gt;public_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/wireguard/node1.pub)"&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;node1.example.com:51820"&lt;/span&gt;
      &lt;span class="na"&gt;allowed_ips&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;10.42.0.2/32"&lt;/span&gt;&lt;span class="pi"&gt;]&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;node2&lt;/span&gt;
      &lt;span class="na"&gt;public_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/wireguard/node2.pub)"&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;node2.example.com:51820"&lt;/span&gt;
      &lt;span class="na"&gt;allowed_ips&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;10.42.0.3/32"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Die Datei heißt &lt;code&gt;mesh.yaml&lt;/code&gt; und liegt auf jedem Knoten im Verzeichnis &lt;code&gt;/etc/wg-mesh/&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Das YAML ist extrem lesbar – sogar ein Junior‑Sysadmin kann damit sofort eine neue Peer hinzufügen, ohne Zeile für Zeile &lt;code&gt;wg set&lt;/code&gt; eingeben zu müssen.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Erste Konfiguration: Peer‑zu‑Peer (ohne Mesh)
&lt;/h2&gt;

&lt;p&gt;Bevor wir das automatisierte Mesh aufbauen, zeigen wir das klassische Hand‑Setup, um den Unterschied zu verdeutlichen.&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;# Auf node1 erzeugen wir Schlüsselpaare&lt;/span&gt;
wg genkey | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/wireguard/node1.private | wg pubkey &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/wireguard/node1.pub

&lt;span class="c"&gt;# Auf node2 das gleiche&lt;/span&gt;
wg genkey | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/wireguard/node2.private | wg pubkey &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/wireguard/node2.pub

&lt;span class="c"&gt;# Konfiguration auf node1 (wg0.conf)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/wireguard/wg0.conf &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;
[Interface]
PrivateKey = &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/wireguard/node1.private&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
Address = 10.42.0.2/32
ListenPort = 51820

[Peer]
PublicKey = &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/wireguard/node2.pub&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
Endpoint = node2.example.com:51820
AllowedIPs = 10.42.0.3/32
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Auf node2 analog, aber mit umgekehrten IPs&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/wireguard/wg0.conf &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;
[Interface]
PrivateKey = &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/wireguard/node2.private&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
Address = 10.42.0.3/32
ListenPort = 51820

[Peer]
PublicKey = &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/wireguard/node1.pub&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
Endpoint = node1.example.com:51820
AllowedIPs = 10.42.0.2/32
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Starten&lt;/span&gt;
wg-quick up wg0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit haben wir &lt;strong&gt;zwei&lt;/strong&gt; Knoten, die direkt miteinander kommunizieren. Für jedes weitere Gerät müssten wir &lt;strong&gt;jede&lt;/strong&gt; vorhandene Konfiguration per Hand ergänzen – schnell ein Chaos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nur für Test‑Environments ist das akzeptabel. In der Realität führt das zu Versions‑ und Synchronisationsproblemen.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Automatisierte Topologie mit wg‑meshconf
&lt;/h2&gt;

&lt;p&gt;Jetzt kommt das eigentliche &lt;strong&gt;Automation‑Wunder&lt;/strong&gt; ins Spiel. Wir nutzen die oben gezeigte YAML‑Datei und lassen &lt;code&gt;wg‑meshconf&lt;/code&gt; die Konfiguration generieren.&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;# Installiere wg‑meshconf (Linux x86_64)&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/wg-meshconf &lt;span class="se"&gt;\&lt;/span&gt;
    https://github.com/yourorg/wg-meshconf/releases/download/v1.2.0/wg-meshconf-linux-amd64
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/wg-meshconf

&lt;span class="c"&gt;# Generiere die WireGuard‑Konfiguration für node1&lt;/span&gt;
wg-meshconf generate &lt;span class="nt"&gt;--file&lt;/span&gt; /etc/wg-mesh/mesh.yaml &lt;span class="nt"&gt;--output&lt;/span&gt; /etc/wireguard/wg0.conf

&lt;span class="c"&gt;# Anwenden und aktivieren&lt;/span&gt;
wg-quick down wg0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wg-quick up wg0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Tool liest die Peer‑Liste, erzeugt für jeden Peer die richtigen &lt;code&gt;AllowedIPs&lt;/code&gt; und schreibt ein vollständiges &lt;code&gt;wg0.conf&lt;/code&gt;. Der entscheidende Schritt ist, dass &lt;strong&gt;nur eine einzige YAML‑Datei&lt;/strong&gt; verwaltet wird – Änderungen daran werden sofort auf allen Knoten wirksam, sobald sie das &lt;code&gt;generate&lt;/code&gt;‑Kommando ausführen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel‑Ausgabe (Ausschnitt)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Interface]
Address = 10.42.0.2/32
ListenPort = 51820
PrivateKey = &amp;lt;redacted&amp;gt;

[Peer]
PublicKey = &amp;lt;node2_pub&amp;gt;
Endpoint = node2.example.com:51820
AllowedIPs = 10.42.0.3/32

[Peer]
PublicKey = &amp;lt;node3_pub&amp;gt;
Endpoint = node3.example.com:51820
AllowedIPs = 10.42.0.4/32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sobald das YAML versioniert (z. B. in Git) ist, hast du eine &lt;em&gt;Infrastructure‑as‑Code&lt;/em&gt;‑Lösung für das gesamte VPN – das ist heute in jedem professionellen Umfeld Standard.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Beispiel 1: 3‑Knoten‑Mesh in einem kleinen Unternehmen
&lt;/h2&gt;

&lt;p&gt;Stellen wir uns ein Büro mit drei Standorten vor: &lt;strong&gt;HQ&lt;/strong&gt;, &lt;strong&gt;Branch‑A&lt;/strong&gt; und &lt;strong&gt;Branch‑B&lt;/strong&gt;. Jeder Standort hat einen Edge‑Router, der das Mesh betreibt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Schritt‑für‑Schritt‑Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schlüsselpaare auf jedem Router erzeugen&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;   wg genkey | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/wireguard/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.private | wg pubkey &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/wireguard/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zentrales Repository&lt;/strong&gt; – Die Datei &lt;code&gt;mesh.yaml&lt;/code&gt; liegt in einem Git‑Repo und wird per &lt;code&gt;git clone&lt;/code&gt; auf alle Router verteilt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mesh‑YAML anpassen&lt;/strong&gt; – Für HQ fügen wir die beiden Branch‑Peers hinzu, für die Branch‑Peers fügen wir nur HQ hinzu (wg‑meshconf erzeugt automatisch die symmetrischen Peers).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Konfiguration generieren &amp;amp; starten&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;   wg-meshconf generate &lt;span class="nt"&gt;--file&lt;/span&gt; /etc/wg-mesh/mesh.yaml &lt;span class="nt"&gt;--output&lt;/span&gt; /etc/wireguard/wg0.conf
   wg-quick down wg0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wg-quick up wg0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ping‑Test&lt;/strong&gt; – Von jedem Standort aus &lt;code&gt;ping 10.42.0.2&lt;/code&gt; (HQ) bzw. &lt;code&gt;ping 10.42.0.3&lt;/code&gt; (Branch‑A) ausführen.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Ergebnis
&lt;/h3&gt;

&lt;p&gt;Alle drei Nodes haben jetzt direkte Tunnel zueinander. Der Traffic zwischen Branch‑A und Branch‑B läuft über &lt;strong&gt;HQ&lt;/strong&gt;, weil das die kürzeste Route ist, aber bei Ausfall von HQ wird das Mesh automatisch das direkte Peer‑zu‑Peer‑Link aktivieren.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Das ist das perfekte Beispiel dafür, wie ein simples YAML‑File ein &lt;strong&gt;redundantes, ausfallsicheres&lt;/strong&gt; Netzwerk erzeugt – ohne dass ein Administrator in jedes Gerät einhaken muss.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Beispiel 2: Dynamisches Hinzufügen neuer Nodes (z. B. neue Edge‑Device)
&lt;/h2&gt;

&lt;p&gt;Im IoT‑Umfeld kommen täglich neue Sensor‑Gateways hinzu. Statt jedes Mal das komplette &lt;code&gt;wg0.conf&lt;/code&gt; zu editieren, können wir ein &lt;strong&gt;automatisiertes Pull‑Mechanismus&lt;/strong&gt; einsetzen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vorgehensweise
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Git‑Hook&lt;/strong&gt; auf dem Zentralknoten einrichten, das bei jedem &lt;code&gt;git push&lt;/code&gt; einen Webhook an alle Edge‑Geräte sendet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On‑Device Skript&lt;/strong&gt; (Bash) lauscht auf den Webhook, zieht das Repository und führt &lt;code&gt;wg-meshconf&lt;/code&gt; aus.
&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;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# /usr/local/bin/wg-mesh-update.sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;span class="nv"&gt;repo_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/wg-mesh"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$repo_dir&lt;/span&gt;
git pull origin main
wg-meshconf generate &lt;span class="nt"&gt;--file&lt;/span&gt; mesh.yaml &lt;span class="nt"&gt;--output&lt;/span&gt; /etc/wireguard/wg0.conf
wg-quick down wg0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wg-quick up wg0
logger &lt;span class="s2"&gt;"[wg-mesh] Configuration updated and applied"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Systemd‑Service&lt;/strong&gt; zum Starten des Scripts bei jedem Webhook‑Aufruf:
&lt;/li&gt;
&lt;/ol&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;WireGuard Mesh Auto‑Update&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-online.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/wg-mesh-update.sh&lt;/span&gt;
   &lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Webhook‑Beispiel&lt;/strong&gt; (GitHub):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://edge-node.local:8080/webhook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"content_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"push"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durch dieses Setup wird jedes neue Gerät sofort Teil des Mesh, sobald sein Public‑Key in &lt;code&gt;mesh.yaml&lt;/code&gt; eingetragen ist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Für Edge‑Umgebungen ist das ein Game‑Changer. Der Aufwand für manuelle Schlüssel‑Austausche wird auf &lt;strong&gt;null&lt;/strong&gt; reduziert.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Beispiel 3: Integration mit Ansible – State‑Driven Deployment
&lt;/h2&gt;

&lt;p&gt;Viele Unternehmen nutzen bereits Ansible für Konfigurations‑Management. Wir können &lt;code&gt;wg‑meshconf&lt;/code&gt; nahtlos als Ansible‑Modul einbinden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ansible‑Playbook
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Deploy WireGuard Mesh&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vpn_nodes&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mesh_yaml_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/wg-mesh/mesh.yaml&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&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;Ensure wg‑meshconf binary&lt;/span&gt;
      &lt;span class="na"&gt;get_url&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;https://github.com/yourorg/wg-meshconf/releases/download/v1.2.0/wg-meshconf-linux-amd64&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/local/bin/wg-meshconf&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&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;Pull latest mesh definition from Git&lt;/span&gt;
      &lt;span class="na"&gt;git&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;git@github.com:company/wg-mesh.git'&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/wg-mesh&lt;/span&gt;
        &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
        &lt;span class="na"&gt;force&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&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 WireGuard configuration&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;wg-meshconf generate --file {{ mesh_yaml_path }} --output /etc/wireguard/wg0.conf&lt;/span&gt;
      &lt;span class="na"&gt;notify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Restart wg0&lt;/span&gt;

  &lt;span class="na"&gt;handlers&lt;/span&gt;&lt;span class="pi"&gt;:&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;Restart wg0&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wg-quick@wg0&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;restarted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ausführen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory.yml wg-mesh-deploy.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Playbook kümmert sich um das Bereitstellen von &lt;code&gt;wg‑meshconf&lt;/code&gt;, das Klonen des Repos und das Neuerstellen der Konfiguration. Der &lt;strong&gt;Handler&lt;/strong&gt; sorgt dafür, dass die Schnittstelle neu gestartet wird, wenn sich die Datei geändert hat – alles &lt;em&gt;idempotent&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persönliche Einschätzung:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ansible macht das Deployment nicht nur automatisiert, sondern auch &lt;strong&gt;nachprüfbar&lt;/strong&gt;. Jeder Lauf liefert einen Report, ob die Konfiguration bereits aktuell war.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Häufige Fehler und wie du sie vermeidest
&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;Lösung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forgot to set &lt;code&gt;ListenPort&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ohne Port lauscht das Interface nicht und Peers können keine Handshake‑Anfrage senden.&lt;/td&gt;
&lt;td&gt;Immer &lt;code&gt;listen_port&lt;/code&gt; im YAML definieren oder &lt;code&gt;wg set wg0 listen-port 51820&lt;/code&gt; nachträglich ausführen.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Duplicate IPs in &lt;code&gt;AllowedIPs&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zwei Peers teilen dieselbe /32‑Adresse, das führt zu Routing‑Konflikten.&lt;/td&gt;
&lt;td&gt;Verwende ein &lt;strong&gt;IP‑Adress-Management&lt;/strong&gt; (z. B. &lt;code&gt;netaddr&lt;/code&gt; in Python) und berechne die /32‑Adressen automatisch.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PublicKey‑Mismatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ein falscher PublicKey wird in die YAML geschrieben – Verbindungen schlagen fehl.&lt;/td&gt;
&lt;td&gt;Nutze ein Skript, das den Schlüssel aus &lt;code&gt;/etc/wireguard/*.pub&lt;/code&gt; liest und in das Repo schreibt.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firewall blockiert UDP 51820&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WireGuard nutzt UDP, viele Default‑Firewalls schließen unerwartete Ports.&lt;/td&gt;
&lt;td&gt;Füge &lt;code&gt;iptables -A INPUT -p udp --dport 51820 -j ACCEPT&lt;/code&gt; (oder &lt;code&gt;nft&lt;/code&gt;) hinzu und teste mit &lt;code&gt;nc -zvu &amp;lt;peer&amp;gt; 51820&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nicht‑persistenten Schlüssel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Schlüssel werden in &lt;code&gt;/tmp&lt;/code&gt; erzeugt und beim Neustart verloren.&lt;/td&gt;
&lt;td&gt;Schreibe Schlüssel immer nach &lt;code&gt;/etc/wireguard/&lt;/code&gt; und setze &lt;code&gt;chmod 600&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tipps zum Debuggen&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;# Zeige aktuellen WireGuard‑Status&lt;/span&gt;
wg show

&lt;span class="c"&gt;# Prüfe Handshake‑Zeitstempel – wenn sie "0" sind, ist kein Handshake erfolgt&lt;/span&gt;
wg show wg0 peers | &lt;span class="nb"&gt;grep &lt;/span&gt;handshake

&lt;span class="c"&gt;# Netzwerk‑Trace mit tcpdump&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; any udp port 51820 &lt;span class="nt"&gt;-vv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Fazit &amp;amp; Nächster Schritt
&lt;/h2&gt;

&lt;p&gt;Ein &lt;strong&gt;vollvermaschtes WireGuard‑Netz&lt;/strong&gt; ist kein „Nice‑to‑have“, sondern ein &lt;strong&gt;must‑have&lt;/strong&gt; für jedes moderne, dezentrale Unternehmen. Mit &lt;code&gt;wg‑meshconf&lt;/code&gt; bekommst du:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zentral verwaltete Topologie&lt;/strong&gt; – ein einziges YAML File, versioniert in Git.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatisierte Deployments&lt;/strong&gt; – per Bash, Webhook oder Ansible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selbst‑heilendes Mesh&lt;/strong&gt; – neue Nodes werden sofort Teil des Netzes, Ausfälle werden dank Mesh‑Routing umgangen.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone&lt;/strong&gt; das offizielle &lt;code&gt;wg‑meshconf&lt;/code&gt;‑Repo und lege ein Grund‑YAML‑File an.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erzeuge Schlüsselpaare&lt;/strong&gt; auf allen geplanten Nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Führe das erste &lt;code&gt;wg‑meshconf generate&lt;/code&gt; aus&lt;/strong&gt; und starte das Interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integriere das Git‑Repo&lt;/strong&gt; in deine bestehende CI‑Pipeline (z. B. GitHub Actions) – so wird jede Änderung automatisch auf allen Nodes ausgerollt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor&lt;/strong&gt; das Mesh mit &lt;code&gt;wg‑show&lt;/code&gt; + Prometheus‑Exporters, um frühzeitig Ausfälle zu erkennen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Der Aufwand für die Erstimplementierung liegt bei etwa &lt;strong&gt;2–3 Stunden&lt;/strong&gt;, danach hast du eine skalierbare, wartbare VPN‑Infrastruktur, die mit deinem Unternehmen wächst.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Viel Erfolg beim Aufbau deines WireGuard‑Meshes – und denk dran: Automatisierung ist nicht nur ein schönes Feature, sie ist deine erste Verteidigungslinie gegen menschliche Fehler.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wireguard</category>
      <category>meshvpn</category>
      <category>wgmeshconf</category>
      <category>networksecurity</category>
    </item>
    <item>
      <title>Zero Trust Architektur: Der Paradigmenwechsel in der IT-Sicherheit</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sun, 21 Jun 2026 06:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/zero-trust-architektur-der-paradigmenwechsel-in-der-it-sicherheit-hcc</link>
      <guid>https://dev.to/uhltak/zero-trust-architektur-der-paradigmenwechsel-in-der-it-sicherheit-hcc</guid>
      <description>&lt;h1&gt;
  
  
  Hook-Einleitung
&lt;/h1&gt;

&lt;p&gt;Die traditionelle IT-Sicherheitsstrategie basiert auf Vertrauen. Wir vertrauen unserem Netzwerk, unseren Geräten und unseren Benutzern. Doch in einer Welt, in der Angriffe immer häufiger und komplexer werden, reicht dieses Vertrauen nicht mehr aus. Die Zero Trust Architektur ist der Schlüssel zu einem sichereren und flexibleren Netzwerk.&lt;/p&gt;

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

&lt;p&gt;Zero Trust Architektur ist ein Sicherheitsmodell, das auf dem Prinzip 'never trust, always verify' basiert. Anstatt bestimmten Benutzern oder Geräten Vertrauen zu schenken, werden alle Anfragen und Zugriffe überprüft und autorisiert. Dies bedeutet, dass alle Kommunikation zwischen Geräten und Anwendungen innerhalb des Netzwerks authentifiziert und autorisiert wird.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für Zero Trust Architektur ist die Implementierung von Authentifizierungs- und Autorisierungsdiensten wie z.B. Azure Active Directory (Azure AD) oder Google Cloud Identity and Access Management (IAM). Diese Dienste ermöglichen es, Benutzeridentitäten und -berechtigungen zentral zu verwalten und sicherzustellen, dass nur autorisierte Benutzer Zugriff auf certaine Ressourcen haben.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Zero Trust Architektur ist ein notwendiger Schritt in Richtung einer sichereren IT-Infrastruktur. indem wir alle Anfragen und Zugriffe überprüfen und autorisieren, können wir das Risiko von Angriffen und Datenlecks minimieren.&lt;/p&gt;

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

&lt;p&gt;Die Zero Trust Architektur bietet zahlreiche Vorteile, darunter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Verbesserte Sicherheit: Durch die Überprüfung und Autorisierung aller Anfragen und Zugriffe wird das Risiko von Angriffen und Datenlecks minimiert.&lt;/li&gt;
&lt;li&gt;  Erhöhte Flexibilität: Die Zero Trust Architektur ermöglicht es, verschiedene Sicherheitsrichtlinien und -regeln für verschiedene Teile des Netzwerks zu definieren und anzuwenden.&lt;/li&gt;
&lt;li&gt;  Vereinfachte Sicherheitsverwaltung: Durch die zentrale Verwaltung von Benutzeridentitäten und -berechtigungen wird die Sicherheitsverwaltung einfacher und effizienter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ein Beispiel für die Vorteile von Zero Trust Architektur ist die Implementierung von Netzwerksegmentierung. Durch die Aufteilung des Netzwerks in verschiedene Segmente kann die Kommunikation zwischen Geräten und Anwendungen innerhalb jedes Segments überwacht und kontrolliert werden. Dies kann mithilfe von Lösungen wie Cisco ISE oder VMware NSX umgesetzt werden.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Vorteile von Zero Trust Architektur sind vielfältig und können einen erheblichen Beitrag zur Verbesserung der IT-Sicherheit leisten.&lt;/p&gt;

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

&lt;p&gt;Ein häufiger Fehler bei der Implementierung von Zero Trust Architektur ist die Annahme, dass dies ein einmaliger Prozess ist. Die Zero Trust Architektur erfordert jedoch eine kontinuierliche Überwachung und Anpassung der Sicherheitsrichtlinien und -regeln. Ein weiterer Fehler ist die Vernachlässigung der Benutzererfahrung. Die Zero Trust Architektur kann zu einer erhöhten Anzahl von Anmelde- und Authentifizierungsvorgängen führen, was die Benutzererfahrung beeinträchtigen kann.&lt;/p&gt;

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

&lt;p&gt;Die Zero Trust Architektur ist ein notwendiger Paradigmenwechsel in der IT-Sicherheit. Durch die Überprüfung und Autorisierung aller Anfragen und Zugriffe kann das Risiko von Angriffen und Datenlecks minimiert werden. Um die Zero Trust Architektur erfolgreich umzusetzen, ist es wichtig, die Sicherheitsrichtlinien und -regeln kontinuierlich zu überwachen und anzupassen.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt: Überprüfe deine aktuelle IT-Sicherheitsstrategie und identifiziere Bereiche, in denen die Zero Trust Architektur implementiert werden kann. Beginne mit der Implementierung von Authentifizierungs- und Autorisierungsdiensten und überprüfe deine Netzwerksegmentierung. Durch die Umsetzung der Zero Trust Architektur kannst du deine IT-Infrastruktur sicherer und flexibler machen.&lt;/p&gt;

</description>
      <category>zerotrustarchitektur</category>
      <category>itsicherheit</category>
      <category>paradigmenwechsel</category>
      <category>nevertrustalwaysverify</category>
    </item>
    <item>
      <title>Lokale LLMs mit Ollama: Selbst hosten, API anbinden &amp; Praxisbeispiele</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sat, 20 Jun 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/lokale-llms-mit-ollama-selbst-hosten-api-anbinden-praxisbeispiele-10e0</link>
      <guid>https://dev.to/uhltak/lokale-llms-mit-ollama-selbst-hosten-api-anbinden-praxisbeispiele-10e0</guid>
      <description>&lt;h1&gt;
  
  
  Lokale LLMs mit Ollama: Selbst hosten, API anbinden &amp;amp; Praxisbeispiele
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Hook – Der Moment, in dem Sie merken, dass die Cloud‑Bill‑spritzen nicht mehr tragbar sind&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stellen Sie sich vor, Sie arbeiten an einem internen Chat‑Bot für die Personalabteilung. Jedes Mal, wenn ein Mitarbeiter fragt: &lt;em&gt;"Wie beantrage ich Elternzeit?"&lt;/em&gt;, muss das System einen Request an OpenAI senden – und die Rechnung steigt schneller als Ihr Jahresurlaub. Das ist nicht nur teuer, das ist ein akutes Risiko für Datenschutz und Compliance. Hier kommt Ollama ins Spiel: mit nur wenigen Befehlen können Sie ein komplett off‑line LLM auf Ihrem eigenen Server betreiben, die Kosten halbieren und die Kontrolle zurückgewinnen. In diesem Artikel zeige ich Ihnen, wie Sie Ollama installieren, ein Modell pullen, es über die eingebaute REST‑API ansprechen und schließlich in eine Python‑Applikation einbetten. &lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Für jede mittlere bis große Organisation ist das heute kein Nice‑to‑have mehr, sondern ein Must‑have – und das Ganze lässt sich in einem Nachmittag umsetzen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Warum lokale LLMs?
&lt;/h2&gt;

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

&lt;p&gt;Ein Large Language Model (LLM) ist im Prinzip ein riesiges statistisches Wörterbuch, das Texte generieren kann. Die meisten Anbieter (OpenAI, Anthropic, Cohere) bieten diese Modelle ausschließlich als SaaS an. Das bedeutet: &lt;strong&gt;Ihr Datenverkehr fließt über das öffentliche Internet&lt;/strong&gt;, was bei sensiblen Unternehmensdaten problematisch ist. Außerdem erhalten Sie kaum Transparenz über das zugrundeliegende Modell‑Training – ein klassischer Black‑Box‑Falls.&lt;/p&gt;

&lt;p&gt;Lokale LLMs lösen drei Kernprobleme:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Datenschutz&lt;/strong&gt; – Keine externen API‑Calls, alles bleibt im eigenen Netzwerk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kostenkontrolle&lt;/strong&gt; – Statt pro‑Token zu zahlen, bezahlen Sie einmalig für die Hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; – Latenz im Millisekunden‑Bereich, weil das Modell direkt auf‑premises läuft.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Praxisbeispiel
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Beispiel 1: HR‑Chatbot&lt;/em&gt; – Während ein externer Service 0,02 USD pro 1 000 Token verlangt, kostet ein lokales LLM nach dem Kauf (z. B. Mistral‑7B) ungefähr 200 USD für die GPU‑Hardware plus Strom. Der Break‑Even‑Point liegt bei rund 100 000 Tokens – und die meisten Unternehmens‑Chatbots erzeugen leicht mehrere Millionen Tokens pro Monat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Für Use‑Cases, bei denen &lt;strong&gt;Vertraulichkeit&lt;/strong&gt; und &lt;strong&gt;Kosten&lt;/strong&gt; im Vordergrund stehen, ist das Hosting eines LLMs mit Ollama heute das pragmatischste Vorgehen. Die Einstiegshürde ist niedrig, weil Ollama die gesamte Infrastruktur (Docker‑Container, Model‑Cache, API‑Server) abstrahiert.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ollama installieren und ein Modell pullen
&lt;/h2&gt;

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

&lt;p&gt;Ollama ist ein leichtgewichtiger Daemon, der verschiedene Open‑Source‑Modelle per HTTP‑API bereitstellt. Die Installation erfolgt über ein einzelnes Binary für Linux, macOS und Windows. Unter Linux empfiehlt sich die &lt;strong&gt;DEB‑Package&lt;/strong&gt;‑Variante für Debian‑/Ubuntu‑Systeme.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkretes Beispiel 1 – Installation auf Ubuntu 22.04
&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 aktualisieren&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# 2. Ollama‑Package herunterladen (aktuellste Version 0.3.7)&lt;/span&gt;
wget https://ollama.com/download/ollama_0.3.7_amd64.deb &lt;span class="nt"&gt;-O&lt;/span&gt; /tmp/ollama.deb

&lt;span class="c"&gt;# 3. Paket installieren&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; /tmp/ollama.deb

&lt;span class="c"&gt;# 4. Daemon starten und mit Systemd verknüpfen&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach dem Start lauscht Ollama standardmäßig auf &lt;strong&gt;Port 11434&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkretes Beispiel 2 – Modell pullen (Mistral‑7B‑Instruct)
&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;# Ollama CLI nutzt das gleiche Befehlsschema wie Docker&lt;/span&gt;
ollama pull mistral:7b-instruct
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Pull‑Vorgang lädt das Modell in ein lokales Cache‑Verzeichnis (&lt;code&gt;~/.ollama/models&lt;/code&gt;). Für das erste Mal benötigen Sie etwa &lt;strong&gt;4 GB&lt;/strong&gt; Speicherplatz und eine schnelle Internetverbindung (≈ 30 GB/s). Ollama zeigt während des Downloads die Fortschrittsbalken und prüft die SHA‑256‑Hash‑Summe, um Integrität zu garantieren.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Die Installation dauert weniger als 10 Minuten, selbst auf einer mittelklassigen VM (2 vCPU, 8 GB RAM). Der größte Kostenfaktor ist die GPU‑Hardware, wenn Sie Inference‑Beschleunigung benötigen. Für reine CPU‑Inference reicht jedoch bereits ein moderner Xeon‑ oder AMD‑Prozessor aus – die Latenz liegt dann bei etwa 600 ms pro Prompt, was für Chat‑Bots akzeptabel ist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Modell per Ollama API ansprechen
&lt;/h2&gt;

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

&lt;p&gt;Ollama stellt eine &lt;strong&gt;REST‑Ful‑API&lt;/strong&gt; bereit, die exakt dem OpenAI‑Chat‑Endpoint ähnelt. Das macht die Migration von bestehenden Code‑Bases trivial, weil Sie lediglich die URL und das Modell anpassen müssen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkretes Beispiel 3 – &lt;code&gt;curl&lt;/code&gt;‑Request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
        "model": "mistral:7b-instruct",
        "messages": [{"role": "user", "content": "Erkläre mir den Unterschied zwischen IPv4 und IPv6 in drei Sätzen."}]
      }'&lt;/span&gt; | jq &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Ausgabe (gekürzt) sieht etwa so aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mistral:7b-instruct"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1698765432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IPv4 nutzt 32‑Bit‑Adressen …"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Konkretes Beispiel 4 – Python‑Wrapper
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ollama_chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral:7b-instruct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&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;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ollama_chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wie richte ich einen LXC‑Container auf Proxmox ein?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Da Ollama dieselbe JSON‑Struktur nutzt wie die OpenAI‑API, lässt sich vorhandener Code ohne größere Refactoring‑Arbeit übernehmen. Das spart Entwicklungszeit und reduziert das Risiko von Bugs – insbesondere, wenn Sie bereits ein Frontend‑Framework (React, Vue) mit einer OpenAI‑SDK‑Abstraktion nutzen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Integration in eigene Anwendung
&lt;/h2&gt;

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

&lt;p&gt;Der eigentliche Mehrwert entsteht, wenn das LLM in ein bestehendes Service‑Mesh integriert wird. Typischerweise bauen Unternehmen einen kleinen &lt;strong&gt;Microservice&lt;/strong&gt; („LLM‑Gateway“) auf, der Anfragen entgegnet, Logging, Rate‑Limiting und Auditing übernimmt. Auf diese Weise behalten Sie die zentrale Kontrolle, obwohl das Modell lokal läuft.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkretes Beispiel 5 – FastAPI‑Gateway
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;LLM‑Gateway&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ChatRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mistral:7b-instruct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starten Sie das Gateway mit &lt;code&gt;uvicorn&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn llm_gateway:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jetzt erreichen Sie das Modell über &lt;code&gt;POST http://your‑host:8000/chat&lt;/code&gt; – ideal für interne Web‑Apps, Chat‑Interfaces oder Slack‑Bots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Konkretes Beispiel 6 – Auditing per PostgreSQL Hook
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Tabelle für Auditing&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;llm_audit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Im FastAPI‑Code ergänzen wir nach dem erfolgreichen Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;store_audit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psycopg2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dbname=app user=app password=secret host=localhost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSERT INTO llm_audit (user_name, prompt, response) VALUES (%s,%s,%s)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit haben Sie &lt;strong&gt;vollständige Nachvollziehbarkeit&lt;/strong&gt; – ein entscheidender Punkt für regulatorische Anforderungen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der Aufbau eines kleinen Gateway‑Layers kostet weniger als 200 Zeilen Code, liefert aber Features, die ein reiner Direkt‑&lt;code&gt;curl&lt;/code&gt;‑Aufruf nicht bieten kann: Auth, Monitoring, Auditing und zentrale Fehlermeldungen. Das ist das &lt;strong&gt;Produktiv‑Setup&lt;/strong&gt;, das ich in den meisten Kundenprojekten empfehle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Häufige Fehler und wie man sie vermeidet
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keine GPU‑Provisionierung&lt;/strong&gt; – Auf CPUs laufen zwar alle Modelle, aber die Latenz kann ins Sekunden‑Bereich schießen. Setzen Sie mindestens eine NVIDIA‑A100 (oder eine günstige RTX 3080) ein, wenn Sie interaktive Anfragen erwarten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port‑Kollision&lt;/strong&gt; – Der Standard‑Port 11434 wird häufig von anderen Dienste belegt. Prüfen Sie &lt;code&gt;sudo lsof -i :11434&lt;/code&gt; und passen Sie &lt;code&gt;OLLAMA_PORT&lt;/code&gt; in &lt;code&gt;/etc/default/ollama&lt;/code&gt; an.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unzureichender Speicher&lt;/strong&gt; – Die meisten 7‑B‑Modelle benötigen mindestens 8 GB VRAM. Bei zu wenig Speicher fällt das Modell in den &lt;em&gt;Swap&lt;/em&gt; und ist unbrauchbar. Nutzen Sie &lt;code&gt;nvidia-smi&lt;/code&gt; zur Überwachung.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fehlende Rate‑Limiting&lt;/strong&gt; – Ein lokales Service‑Daemon kann bei unkontrollierten Parallel‑Requests überlastet werden. Setzen Sie ein Middleware‑Rate‑Limiter (z. B. &lt;code&gt;slowapi&lt;/code&gt; für FastAPI) ein.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keine Monitoring‑Integration&lt;/strong&gt; – Ohne Metriken (Prometheus‑Exporter ist in Ollama integriert) sehen Sie nicht, wann das Modell an seine Grenzen stößt. Fügen Sie &lt;code&gt;scrape_configs&lt;/code&gt; zu Ihrer &lt;code&gt;prometheus.yml&lt;/code&gt; hinzu.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Fazit und konkreter Next‑Step
&lt;/h2&gt;

&lt;p&gt;Lokale LLMs mit &lt;strong&gt;Ollama&lt;/strong&gt; verwandeln das klassische „Chat‑Bot‑Szenario“ in ein kontrolliertes, kosteneffizientes und datenschutzkonformes Projekt. Sie erhalten volle Transparenz, verhindern externe Datenexfiltration und können das Modell exakt an Ihre Infrastruktur‑Richtlinien anpassen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ihr nächster Schritt (in 7 Tagen):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hardware bereitstellen&lt;/strong&gt; – 2 vCPU, 8 GB RAM + mindestens 1 × NVIDIA‑GPU (8 GB VRAM). Installieren Sie das OS‑Image (Ubuntu 22.04 LTS) und aktivieren Sie das GPU‑Treiber‑Paket (&lt;code&gt;sudo apt install nvidia-driver-525&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama installieren&lt;/strong&gt; (siehe Beispiel 1) und das Modell &lt;code&gt;mistral:7b-instruct&lt;/code&gt; pullen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI‑Gateway&lt;/strong&gt; aus Beispiel 5 deployen, PostgreSQL‑Auditing aus Beispiel 6 anlegen und das System mit Prometheus‑Grafana überwachen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testen&lt;/strong&gt; Sie das Setup mit einem kleinen internen Chat‑Client und messen Sie die Latenz; passen Sie die GPU‑Auslastung mit &lt;code&gt;ollama config set gpu=true&lt;/code&gt; an.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dokumentieren&lt;/strong&gt; Sie das Auditing‑Schema und die Rate‑Limiting‑Regeln – das spart später Aufwand bei internen Audits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nach dieser Woche haben Sie ein produktives, selbstgehostetes LLM‑Backend, das Ihnen nicht nur Kosten spart, sondern auch Ihre &lt;strong&gt;digitale Souveränität&lt;/strong&gt; stärkt. Und das alles mit weniger Aufwand, als ein externer SaaS‑Vertrag zu verhandeln.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bleiben Sie neugierig, experimentieren Sie mit kleineren Modellen (Llama‑2‑7B, TinyLlama) und skalieren Sie erst, wenn Sie das Kosten‑/Performance‑Verhältnis genau kennen.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>llm</category>
      <category>selfhosting</category>
      <category>api</category>
    </item>
    <item>
      <title>Zero Trust Architektur: Der Paradigmenwechsel</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Sat, 20 Jun 2026 06:00:05 +0000</pubDate>
      <link>https://dev.to/uhltak/zero-trust-architektur-der-paradigmenwechsel-2ko6</link>
      <guid>https://dev.to/uhltak/zero-trust-architektur-der-paradigmenwechsel-2ko6</guid>
      <description>&lt;h1&gt;
  
  
  Zero Trust Architektur: Warum 'never trust, always verify' kein Buzzword ist, sondern ein Paradigmenwechsel
&lt;/h1&gt;

&lt;p&gt;In einer Welt, in der Cyberangriffe immer komplexer und zielgerichteter werden, ist es entscheidend, unsere Herangehensweise an die IT-Sicherheit zu überdenken. Die traditionelle Methode, in der das Vertrauen in Netzwerke und Systeme als Standard angenommen wird, ist nicht mehr ausreichend. Hier kommt die Zero Trust Architektur ins Spiel, ein Konzept, das 'never trust, always verify' zum Leitprinzip macht. Doch was bedeutet dies genau und warum ist es kein Buzzword, sondern ein echter Paradigmenwechsel?&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, egal ob innerhalb oder außerhalb des Netzwerks, automatisch vertrauenswürdig ist. Jede Anfrage, jedes Paket und jede Aktion müssen überprüft und autorisiert werden, bevor Zugriff gewährt wird. Diese Herangehensweise ist ein drastischer Wandel von der traditionellen Perimeter-Sicherheit, bei der das Vertrauen innerhalb des Netzwerks angenommen wird und der Schutz hauptsächlich auf die Netzwerkgrenzen konzentriert ist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel: Implementierung mit VMware und Google Cloud
&lt;/h3&gt;

&lt;p&gt;Ein Beispiel für die Implementierung von Zero Trust Architektur könnte die Kombination von VMware mit Google Cloud sein. Durch die Verwendung von VMware Workspace ONE können Unternehmen eine umfassende Lösung für die Geräteverwaltung und -sicherheit bereitstellen. Gleichzeitig kann Google Cloud mit seiner Identity and Access Management (IAM) und seinen Sicherheitsfunktionen wie der Google Cloud Firewall helfen, den Zugriff auf Ressourcen zu kontrollieren und die Netzwerksegmentierung zu verbessern. Durch die Integration dieser Lösungen können Unternehmen eine Zero Trust Umgebung aufbauen, in der jeder Zugriff überprüft und autorisiert wird, unabhängig davon, ob die Anfrage aus dem Firmennetzwerk oder remote kommt.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Die Kombination von VMware und Google Cloud ist ein leistungsfähiges Beispiel dafür, wie Zero Trust Architektur in der Praxis umgesetzt werden kann. Es zeigt, dass mit der richtigen Kombination von Technologien und einer klaren Strategie, Unternehmen ihre Sicherheitspostion erheblich stärken können.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum ist Zero Trust Architektur ein Paradigmenwechsel?
&lt;/h2&gt;

&lt;p&gt;Der Übergang zu einer Zero Trust Architektur markiert einen Paradigmenwechsel in der IT-Sicherheit, weil er von der Annahme, dass das Innere des Netzwerks sicher ist, abrückt. Stattdessen wird jede Interaktion und jeder Zugriff als potenzielle Bedrohung behandelt. Dieser Wechsel erfordert nicht nur eine Anpassung der Technologie, sondern auch eine kulturelle Veränderung innerhalb von Organisationen. Es bedeutet, dass Sicherheit nicht mehr nur als Add-on, sondern als integraler Bestandteil des Geschäftsprozesses angesehen wird.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel: Kulturwandel mit Cisco und Cyberark
&lt;/h3&gt;

&lt;p&gt;Ein Beispiel für diesen kulturellen Wandel ist die Implementierung von Lösungen wie Cisco's Duo und Cyberark. Durch die Verwendung von Duo können Unternehmen eine mehrschichtige Authentifizierung einführen, die sicherstellt, dass nur autorisierte Benutzer Zugriff auf sensible Ressourcen haben. Gleichzeitig kann Cyberark helfen, die Privilegierten Konten zu schützen und den Zugriff auf kritische Systeme zu kontrollieren. Durch die Kombination solcher Lösungen können Unternehmen nicht nur ihre technische Sicherheitslage verbessern, sondern auch einen Kulturwandel hin zu einem Sicherheitsbewusstsein auf allen Ebenen fördern.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Der Erfolg von Zero Trust Architektur hängt stark von der Fähigkeit ab, eine Sicherheitskultur innerhalb der Organisation aufzubauen. Durch die Einführung von Technologien wie Cisco Duo und Cyberark können Unternehmen diesen Prozess unterstützen und sicherstellen, dass Sicherheit von Anfang an ein integraler Teil ihrer Strategie ist.&lt;/p&gt;

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

&lt;p&gt;Ein häufiger Fehler bei der Implementierung von Zero Trust Architektur ist die Annahme, dass es sich dabei um eine reine Technologieumgebung handelt. Tatsächlich erfordert Zero Trust einen umfassenden Ansatz, der Technologie, Prozesse und Menschen umfasst. Ein weiterer Fallstrick ist die Unternehmensbreite, bei der nur Teile des Netzwerks oder der Systeme in die Zero Trust Architektur integriert werden, während andere Bereiche unberücksichtigt bleiben. Dies kann zu einer unvollständigen Sicherheitslage führen und die Effektivität des Zero Trust Konzepts untergraben.&lt;/p&gt;

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

&lt;p&gt;Dein nächster Schritt sollte darin bestehen, deine aktuelle Sicherheitsstrategie zu überprüfen und zu beurteilen, ob die Implementierung von Zero Trust Architektur für deine Organisation sinnvoll ist. Durch die Einführung eines Zero Trust Modells kannst du deine IT-Sicherheit erheblich stärken und dich besser gegen moderne Bedrohungen schützen. Denke daran, dass Zero Trust nicht nur eine Technologie, sondern ein neuer Weg ist, über Sicherheit zu denken und zu handeln. Es ist ein Paradigmenwechsel, der nicht nur deine technische Infrastruktur, sondern auch deine Unternehmenskultur und -prozesse berührt. Mit den richtigen Partnern und einer klaren Strategie kann die Zero Trust Architektur ein wichtiger Schritt auf dem Weg zu einer sichereren Zukunft sein.&lt;/p&gt;

</description>
      <category>zerotrustarchitektur</category>
      <category>itsicherheit</category>
      <category>paradigmenwechsel</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Zero Trust in der Praxis: Warum VPN nicht reicht – Ihr Leitfaden</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Fri, 19 Jun 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/zero-trust-in-der-praxis-warum-vpn-nicht-reicht-ihr-leitfaden-2d61</link>
      <guid>https://dev.to/uhltak/zero-trust-in-der-praxis-warum-vpn-nicht-reicht-ihr-leitfaden-2d61</guid>
      <description>&lt;h1&gt;
  
  
  Warum das alte VPN‑Modell heute ein Sicherheitsrisiko ist
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;„Ein VPN ist wie ein Schloss an der Haustür – es hält nur das große Böse draußen, aber lässt jeden, der den Schlüssel hat, ins Haus.“&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Das klingt provokant, trifft aber den Kern: Unternehmen setzen noch immer ausschließlich auf VPNs, weil sie einfach zu konfigurieren sind. In Wahrheit öffnen sie das gesamte Netzwerk für jeden, der sich einmal authentifiziert hat. Beim Zero‑Trust‑Ansatz geht es um &lt;strong&gt;„Vertrauen nie voraussetzen“&lt;/strong&gt; – jeder Zugriff wird kontinuierlich geprüft, egal ob vom internen oder externen Netzwerk. In diesem Artikel zeige ich, warum das reine VPN‑Modell heute nicht mehr reicht und gebe Ihnen eine praxisnahe Schritt‑für‑Schritt‑Anleitung, wie Sie Zero Trust in Ihrem Unternehmen einführen.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Was ist Zero Trust?
&lt;/h2&gt;

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

&lt;p&gt;Zero Trust ist kein einzelnes Produkt, sondern ein &lt;strong&gt;Prinzip&lt;/strong&gt;: Jeder Zugriff wird verifiziert, jeder Dienst wird isoliert, und jede Verbindung wird als potenziell unsicher betrachtet. Kernpunkte sind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mikrosegmentierung&lt;/strong&gt;: Das Netzwerk wird in kleinste Sicherheitszonen zerlegt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least‑Privilege‑Access&lt;/strong&gt;: Nutzer und Maschinen erhalten nur die Berechtigungen, die sie wirklich benötigen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kontinuierliche Verifikation&lt;/strong&gt;: Authentifizierung und Autorisierung werden bei jedem Request neu geprüft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device‑Posture‑Checks&lt;/strong&gt;: Der Sicherheitsstatus des Geräts ist Teil der Entscheidungslogik.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Ein Unternehmen nutzt Kubernetes für seine Anwendungen. Statt das gesamte Cluster hinter einem VPN zu verstecken, wird Istio als Service‑Mesh eingesetzt. Jeder Service‑Aufruf muss über einen &lt;strong&gt;mTLS‑Handshake&lt;/strong&gt; authentifiziert werden. Das bedeutet, dass selbst ein kompromittierter Pod nicht ohne Weiteres mit anderen Pods kommunizieren kann.&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;# Istio‑Installation (Demo‑Profil)&lt;/span&gt;
istioctl &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;demo

&lt;span class="c"&gt;# Namespace für Mikrosegmentierung markieren&lt;/span&gt;
kubectl label namespace production istio-injection&lt;span class="o"&gt;=&lt;/span&gt;enabled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Durch diese Trennung kann ein Angreifer, der in einen Service eindringt, nicht automatisch auf das gesamte Netzwerk zugreifen. Die zusätzliche Verschlüsselung auf Ebene jedes Service‑Calls erhöht die Sicherheit ohne spürbare Performance‑Einbußen – in Tests blieb die Latenz unter 2 ms.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Warum VPN allein kein ausreichend sicheres Konzept ist
&lt;/h2&gt;

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

&lt;p&gt;VPNs schaffen &lt;strong&gt;nur einen Tunnel&lt;/strong&gt; zwischen zwei Punkten. Sobald der Tunnel etabliert ist, gelten alle internen Sicherheitspolicies im Wesentlichen als deaktiviert. Das bedeutet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flat Network&lt;/strong&gt;: Alle internen Systeme sind gleichberechtigt erreichbar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kein Kontext‑Check&lt;/strong&gt;: Das Gerät, der Standort oder die aktuelle Bedrohungslage werden nicht berücksichtigt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kein Schutz vor Insider‑Threats&lt;/strong&gt;: Ein legitimer Nutzer kann unbemerkt sensible Daten exfiltrieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Beispiel 1 – Split‑Tunneling‑Pitfall
&lt;/h3&gt;

&lt;p&gt;Ein Entwickler verbindet sich per OpenVPN mit dem Unternehmensnetz. Durch Split‑Tunneling wird nur interner Traffic über das VPN geleitet, während das Internet direkt über den lokalen ISP läuft. Ein Malware‑Scanner auf dem Gerät sieht den internen Traffic nicht, weil er außerhalb des VPN liegt.&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;# OpenVPN‑Client‑Konfiguration (split‑tunneling aktiv)&lt;/span&gt;
client
dev tun
proto udp
remote vpn.example.com 1194
redirect-gateway def1 bypass-dhcp
&lt;span class="c"&gt;# Bypass‑Datenverkehr für Internet&lt;/span&gt;
route 0.0.0.0 0.0.0.0 vpn_gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Durch das Split‑Tunneling entsteht ein &lt;strong&gt;Blindspot&lt;/strong&gt; für zentrale Sicherheitslösungen. Ein Angreifer kann dort Code ausführen, der nicht vom zentralen Monitoring erfasst wird. Der einfache Wechsel zu einem Zero‑Trust‑Modell eliminiert diesen Blindspot, weil jeder Request individuell geprüft wird, unabhängig vom Netzwerk‑Pfad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel 2 – Credential‑Reuse in VPN‑Umgebungen
&lt;/h3&gt;

&lt;p&gt;Im Unternehmen wird das gleiche LDAP‑Passwort für VPN‑ und Application‑Logins verwendet. Sobald ein Angreifer das VPN‑Passwort über Phishing erlangt, kann er sich sowohl ins Netzwerk als auch in interne Anwendungen einloggen.&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;# Beispiel für Credential‑Reuse (falsch)&lt;/span&gt;
&lt;span class="c"&gt;# VPN‑Passwort = Application‑Passwort&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; Angreifer nutzt das Passwort für beide Zugriffe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Zero Trust verlangt &lt;strong&gt;individuelle Authentifizierung pro Service&lt;/strong&gt;. Durch den Einsatz von &lt;strong&gt;OAuth 2.0&lt;/strong&gt; oder &lt;strong&gt;OpenID Connect&lt;/strong&gt; können Sie separate Token für VPN‑ und Anwendungs‑Zugriffe ausstellen, sodass ein kompromittiertes Passwort nicht die gesamte Infrastruktur gefährdet.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Praktische Umsetzung von Zero Trust – Schritt für Schritt
&lt;/h2&gt;

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

&lt;p&gt;Die Einführung von Zero Trust lässt sich in fünf kompakte Phasen gliedern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Asset‑Inventarisierung&lt;/strong&gt; – Alle Geräte, Services und Datenquellen katalogisieren.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mikrosegmentierung&lt;/strong&gt; – Netzwerk‑ und Service‑Zonen definieren.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity‑Provider (IdP) integrieren&lt;/strong&gt; – Einheitliche Authentifizierung mit MFA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy‑Engine&lt;/strong&gt; – Regeln für Zugriffe zentral verwalten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring &amp;amp; Enforcement&lt;/strong&gt; – Laufende Kontrolle und automatisierte Reaktion.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Beispiel 3 – Zero‑Trust‑Aufbau mit HashiCorp Boundary und Vault
&lt;/h3&gt;

&lt;p&gt;Hier ein komplettes Minimalbeispiel, das einen &lt;strong&gt;Secure Access&lt;/strong&gt; für SSH über Boundary erzeugt, während Vault die dynamischen Credentials bereitstellt.&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. Vault starten (Docker)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; vault &lt;span class="nt"&gt;-p&lt;/span&gt; 8200:8200 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'VAULT_DEV_ROOT_TOKEN_ID=root'&lt;/span&gt; vault server

&lt;span class="c"&gt;# 2. Vault initialisieren und dynamische DB‑Credentials anlegen&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;VAULT_ADDR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'http://127.0.0.1:8200'&lt;/span&gt;
vault login root
vault secrets &lt;span class="nb"&gt;enable &lt;/span&gt;database
vault write database/config/my-postgres &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;plugin_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql-database-plugin &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;connection_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'postgresql://{{username}}:{{password}}@db.example.com:5432/postgres?sslmode=disable'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;allowed_roles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'readonly'&lt;/span&gt;

&lt;span class="c"&gt;# 3. Rolle für read‑only Users erstellen&lt;/span&gt;
vault write database/roles/readonly &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;db_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-postgres &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;creation_statements&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'SELECT * FROM users;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;default_ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1h &lt;span class="nv"&gt;max_ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;24h

&lt;span class="c"&gt;# 4. Boundary starten (Docker)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; boundary &lt;span class="nt"&gt;-p&lt;/span&gt; 9200:9200 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'BOUNDARY_HOST=0.0.0.0'&lt;/span&gt; hashicorp/boundary server

&lt;span class="c"&gt;# 5. Boundary Worker (SSH‑Target) konfigurieren&lt;/span&gt;
boundary workers create &lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ssh &lt;span class="nt"&gt;-scope-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;global &lt;span class="nt"&gt;-address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ssh.example.com:22

&lt;span class="c"&gt;# 6. Access‑Grant mit Vault‑Credentials über Boundary&lt;/span&gt;
boundary sessions create &lt;span class="nt"&gt;-target-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ssh-target-id &lt;span class="nt"&gt;-grant-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;authorized-user &lt;span class="nt"&gt;-user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;alice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durch dieses Setup erhält &lt;strong&gt;Alice&lt;/strong&gt; bei jeder Session ein &lt;strong&gt;frisches PostgreSQL‑Passwort&lt;/strong&gt;, das nach einer Stunde verfällt. Selbst wenn ein Angreifer das Passwort ausspioniert, ist es nach kurzer Zeit wertlos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Dieses Beispiel demonstriert, wie &lt;strong&gt;dynamische Secrets&lt;/strong&gt; und &lt;strong&gt;Identity‑Driven Access&lt;/strong&gt; zusammen ein wesentlich stärkeres Sicherheitsmodell ergeben, als ein statisches VPN‑Passwort je könnte. Der Aufwand ist überschaubar, weil beide Produkte (Vault &amp;amp; Boundary) über native Docker‑Images verfügen und sich über das CLI schnell konfigurieren lassen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel 4 – Mikrosegmentierung mit Calico in einem Kubernetes‑Cluster
&lt;/h3&gt;

&lt;p&gt;Für Unternehmen, die bereits Kubernetes nutzen, ist Calico eine schlanke Möglichkeit, Netzwerkpolicies auf Ebene von Pods zu definieren.&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;crd.projectcalico.org/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&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;deny-all&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all()&lt;/span&gt;
  &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Egress&lt;/span&gt;
  &lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;egress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;crd.projectcalico.org/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&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;allow-frontend-to-backend&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app == "backend"&lt;/span&gt;
  &lt;span class="na"&gt;inbound&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&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;Allow&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app == "frontend"&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
    &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="pi"&gt;:&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="nv"&gt;8080&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit wird &lt;strong&gt;alle&lt;/strong&gt; Kommunikation zwischen Pods blockiert, bis eine explizite Policy (z. B. Frontend → Backend) definiert wird. Das entspricht dem Zero‑Trust‑Prinzip: &lt;em&gt;standard deny, explicit allow&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Calico‑Policies lassen sich automatisiert aus CI/CD‑Pipelines heraus pflegen, wodurch sie immer im gleichen Releasestatus wie Ihre Anwendung stehen. So vermeiden Sie die Gefahr von „verwaisten“ Regeln, die im Laufe der Zeit Sicherheitslücken öffnen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Häufige Fehler bei der Einführung von Zero Trust
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;„Zero Trust = Zero Access“&lt;/strong&gt; – Manche Unternehmen blockieren zu schnell alles und vergessen, legitime Anwendungsfälle zu berücksichtigen. Verwenden Sie &lt;strong&gt;Policy‑Testing‑Tools&lt;/strong&gt; wie &lt;code&gt;kuttl&lt;/code&gt; für Kubernetes, um Regeln zu simulieren, bevor Sie sie produktiv schalten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Einmal‑Konfiguration&lt;/strong&gt; – Zero Trust ist kein „Set‑and‑Forget“. Prozesse müssen kontinuierlich angepasst werden, wenn neue Services hinzukommen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mangelnde Sichtbarkeit&lt;/strong&gt; – Ohne zentrales Monitoring (z. B. Grafana + Prometheus + OpenTelemetry) fehlt das Feedback, ob Ihre Policies wirksam sind. Setzen Sie &lt;strong&gt;Alert‑Rules&lt;/strong&gt; für ungewöhnliche Lateral‑Movement‑Muster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kein Device‑Posture‑Check&lt;/strong&gt; – Das Gerät muss ebenfalls geprüft werden (OS‑Patch‑Level, Antivirus‑Status). Tools wie &lt;strong&gt;Microsoft Defender for Endpoint&lt;/strong&gt; oder &lt;strong&gt;OSQuery&lt;/strong&gt; können hier automatisiert integriert werden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Übermäßige Komplexität&lt;/strong&gt; – Zu viele feine-grained Policies können das Netzwerk lähmen. Beginnen Sie mit einem &lt;strong&gt;„High‑Level“-Modell&lt;/strong&gt; und verfeinern Sie nach Bedarf.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Zero Trust ist keine Zukunfts‑Vision, sondern ein &lt;strong&gt;praktikabler, sofort umsetzbarer Ansatz&lt;/strong&gt;. Durch Mikrosegmentierung, dynamische Secrets und per‑Request‑Authentifizierung schließen Sie die größten Lücken, die klassische VPN‑Modelle offenlassen. Der Schlüssel zum Erfolg liegt in &lt;strong&gt;iterativer Umsetzung&lt;/strong&gt;: Starten Sie klein, messen Sie, passen Sie an und erweitern Sie das Modell schrittweise.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Erstellen Sie ein Inventory‑Sheet aller Services (z. B. in einem Google‑Sheet).&lt;/li&gt;
&lt;li&gt;Installieren Sie &lt;code&gt;istioctl&lt;/code&gt; oder &lt;code&gt;calico&lt;/code&gt; in einem Test‑Namespace.&lt;/li&gt;
&lt;li&gt;Definieren Sie eine erste &lt;em&gt;deny‑all&lt;/em&gt;‑Policy und öffnen Sie exklusiv den Zugang zu einem einzigen Service.&lt;/li&gt;
&lt;li&gt;Integrieren Sie Ihren IdP (Okta, Keycloak) mit MFA und testen Sie den Zugriff über Boundary.&lt;/li&gt;
&lt;li&gt;Setzen Sie ein Monitoring‑Dashboard (Grafana + Prometheus) auf, um alle Access‑Versuche zu visualisieren.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bleiben Sie dran – Zero Trust ist ein &lt;strong&gt;laufendes Projekt&lt;/strong&gt;, nicht ein einmaliges Deployment. Wenn Sie die genannten Schritte konsequent umsetzen, werden Sie schnell merken, dass Ihr Netzwerk nicht nur sicherer, sondern auch &lt;strong&gt;transparent und kontrollierbar&lt;/strong&gt; wird.&lt;/p&gt;

&lt;p&gt;Viel Erfolg beim ersten Schritt Richtung Zero Trust!&lt;/p&gt;

</description>
      <category>zerotrust</category>
      <category>vpn</category>
      <category>sicherheitsarchitektur</category>
      <category>mikrosegmentierung</category>
    </item>
    <item>
      <title>KI-Entscheidungen: Wann Maschinen besser sind als Menschen</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Fri, 19 Jun 2026 06:00:05 +0000</pubDate>
      <link>https://dev.to/uhltak/ki-entscheidungen-wann-maschinen-besser-sind-als-menschen-4fai</link>
      <guid>https://dev.to/uhltak/ki-entscheidungen-wann-maschinen-besser-sind-als-menschen-4fai</guid>
      <description>&lt;h1&gt;
  
  
  KI-Entscheidungen: Wann Maschinen besser sind als Menschen
&lt;/h1&gt;

&lt;p&gt;Das Thema Künstliche Intelligenz (KI) ist in aller Munde. Wir hören von selbstfahrenden Autos, die dank KI ihre Umgebung erkennen und entsprechend reagieren, von Gesundheitssystemen, die KI nutzen, um Krankheiten früher zu erkennen, und von Finanzsystemen, die KI einsetzen, um Anomalien zu erkennen und Betrug zu verhindern. Doch wie vertrauenswürdig sind diese KI-Systeme wirklich?&lt;/p&gt;

&lt;h2&gt;
  
  
  Wie KI-Entscheidungen getroffen werden
&lt;/h2&gt;

&lt;p&gt;KI-Systeme treffen Entscheidungen auf Basis von Algorithmen und großen Mengen an Daten. Diese Algorithmen können sehr komplex sein und sind oft nur schwer verständlich. Ein Beispiel hierfür ist der Algorithmus, den Google für seine Bildsuche entwickelt hat. Dieser Algorithmus kann Bildern erkennen, was darauf abgebildet ist, und diese entsprechend klassifizieren. Ein weiteres Beispiel ist der Algorithmus, den Amazon für seine Empfehlungen entwickelt hat. Dieser Algorithmus kann den Kaufverhalten von Kunden analysieren und entsprechende Empfehlungen treffen.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: KI-Systeme können sehr effektiv sein, wenn es darum geht, Daten zu analysieren und Entscheidungen zu treffen. Sie können jedoch auch fehlerhaft sein, wenn die Daten, auf denen sie trainiert wurden, fehlerhaft sind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erfolgreiche KI-Anwendungen
&lt;/h2&gt;

&lt;p&gt;Es gibt viele erfolgreiche KI-Anwendungen, die zeigen, wie effektiv KI-Systeme sein können. Ein Beispiel hierfür ist die Gesundheitsbranche. Hier werden KI-Systeme eingesetzt, um Krankheiten früher zu erkennen und entsprechende Behandlungen zu empfehlen. Ein weiteres Beispiel ist die Finanzbranche. Hier werden KI-Systeme eingesetzt, um Anomalien zu erkennen und Betrug zu verhindern.&lt;/p&gt;

&lt;p&gt;Beispiele für erfolgreiche KI-Anwendungen sind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepMind Health: Ein KI-System, das entwickelt wurde, um Krankheiten früher zu erkennen und entsprechende Behandlungen zu empfehlen.&lt;/li&gt;
&lt;li&gt;IBM Watson: Ein KI-System, das entwickelt wurde, um Daten zu analysieren und Entscheidungen zu treffen.&lt;/li&gt;
&lt;li&gt;Google Cloud AI Platform: Eine Plattform, die entwickelt wurde, um KI-Systeme zu entwickeln und zu trainieren.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meine Einschätzung: KI-Systeme können sehr effektiv sein, wenn es darum geht, Daten zu analysieren und Entscheidungen zu treffen. Sie können jedoch auch fehlerhaft sein, wenn die Daten, auf denen sie trainiert wurden, fehlerhaft sind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Herausforderungen und Risiken
&lt;/h2&gt;

&lt;p&gt;Es gibt jedoch auch Herausforderungen und Risiken, die mit KI-Systemen verbunden sind. Ein Beispiel hierfür ist die Frage, wer für die Entscheidungen eines KI-Systems verantwortlich ist. Wenn ein KI-System eine falsche Entscheidung trifft, wer ist dann verantwortlich? Der Entwickler des KI-Systems oder der Benutzer des Systems?&lt;/p&gt;

&lt;p&gt;Ein weiteres Beispiel ist die Frage, ob KI-Systeme wirklich neutral sind. Oder sind sie von den Vorurteilen und Bias ihrer Entwickler beeinflusst? Wenn ein KI-System beispielsweise entwickelt wurde, um Kredite zu vergeben, und es trifft Entscheidungen auf Basis von Daten, die von einer bestimmten Gruppe von Menschen stammen, dann kann es sein, dass das System diskriminierend ist.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: KI-Systeme können sehr effektiv sein, wenn es darum geht, Daten zu analysieren und Entscheidungen zu treffen. Sie können jedoch auch fehlerhaft sein, wenn die Daten, auf denen sie trainiert wurden, fehlerhaft sind. Es ist daher wichtig, dass wir uns dieser Herausforderungen und Risiken bewusst sind und entsprechende Maßnahmen ergreifen, um sie zu minimieren.&lt;/p&gt;

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

&lt;p&gt;Es gibt einige häufige Fehler und Fallstricke, die bei der Entwicklung und dem Einsatz von KI-Systemen auftreten können. Ein Beispiel hierfür ist die Annahme, dass KI-Systeme perfekt sind und keine Fehler machen können. Dies ist jedoch nicht der Fall. KI-Systeme können fehlerhaft sein, wenn die Daten, auf denen sie trainiert wurden, fehlerhaft sind.&lt;/p&gt;

&lt;p&gt;Ein weiteres Beispiel ist die Annahme, dass KI-Systeme neutral sind und keine Vorurteile oder Bias haben. Dies ist jedoch nicht der Fall. KI-Systeme können von den Vorurteilen und Bias ihrer Entwickler beeinflusst sein.&lt;/p&gt;

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

&lt;p&gt;KI-Systeme können sehr effektiv sein, wenn es darum geht, Daten zu analysieren und Entscheidungen zu treffen. Sie können jedoch auch fehlerhaft sein, wenn die Daten, auf denen sie trainiert wurden, fehlerhaft sind. Es ist daher wichtig, dass wir uns dieser Herausforderungen und Risiken bewusst sind und entsprechende Maßnahmen ergreifen, um sie zu minimieren.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt: Informiere dich über die Möglichkeiten und Risiken von KI-Systemen und entwickle eine Strategie, um KI-Systeme in deiner Organisation einzusetzen. Stelle sicher, dass du die notwendigen Maßnahmen ergreifst, um die Sicherheit und Effektivität von KI-Systemen zu gewährleisten.&lt;/p&gt;

</description>
      <category>ki</category>
      <category>maschinelleslernen</category>
      <category>entscheidungshoheit</category>
      <category>menschmaschineintegration</category>
    </item>
    <item>
      <title>Proxmox HA-Cluster ohne Split‑Brain: Quorum richtig konfigurieren</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Thu, 18 Jun 2026 18:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/proxmox-ha-cluster-ohne-split-brain-quorum-richtig-konfigurieren-5022</link>
      <guid>https://dev.to/uhltak/proxmox-ha-cluster-ohne-split-brain-quorum-richtig-konfigurieren-5022</guid>
      <description>&lt;h1&gt;
  
  
  Proxmox HA-Cluster ohne Split‑Brain: Quorum richtig konfigurieren
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hook:&lt;/strong&gt; Stellen Sie sich vor, Sie planen ein großes Familienfest und plötzlich entscheiden sich die Kinder, wer das letzte Stück Kuchen bekommt – und treffen dabei gegensätzliche Entscheidungen. Das Ergebnis? Chaos, beleidigte Gesichter und ein zerstörtes Festmahl. Genau so wirkt ein Split‑Brain in Ihrem Proxmox‑Cluster: zwei Teile denken, sie seien die einzig legitime Führungsebene. In diesem Artikel zeige ich Ihnen, wie Sie das Quorum richtig konfigurieren und das Split‑Brain‑Syndrom ein für alle Mal ausschalten.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Grundlagen des HA‑Clusters in Proxmox
&lt;/h2&gt;

&lt;p&gt;Ein High‑Availability‑Cluster (HA‑Cluster) besteht aus mindestens drei physischen Nodes, welche über das &lt;strong&gt;Corosync‑Protokoll&lt;/strong&gt; miteinander kommunizieren. Corosync bildet das Herzstück des Quorums: Jede Node hat eine bestimmte &lt;strong&gt;Stimmgewichtung&lt;/strong&gt; („votes“). Nur wenn die Mehrheit (mehr als 50 % der Stimmen) erreichbar ist, gilt das Cluster als &lt;em&gt;gesund&lt;/em&gt; und kann Ressourcen (VMs, Container) automatisch failover‑fähig bereitstellen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Viele Proxmox‑Einsteiger starten mit einem 2‑Node‑Setup, weil Sie Kosten sparen wollen. Das ist ein fataler Fehler – das Quorum fehlt und Split‑Brain‑Risiko steigt exponentiell. Drei Nodes sind das Minimum, um ein robustes Quorum zu gewährleisten.&lt;/p&gt;




&lt;h2&gt;
  
  
  Split‑Brain verstehen und Ursachen
&lt;/h2&gt;

&lt;p&gt;Ein Split‑Brain entsteht, wenn das Netzwerk partitioniert wird und jede Partition glaubt, sie sei die alleinige Mehrheit. Typische Ursachen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Netzwerk‑Ausfall&lt;/strong&gt; zwischen zwei Switches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falsch konfigurierte Corosync‑Votes&lt;/strong&gt; – z. B. ein Node mit 0 Votes, der trotzdem Dienste hostet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Veraltete Corosync‑Versionen&lt;/strong&gt;, die bei Partitionen nicht korrekt abstimmen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Im Endeffekt laufen Sie Gefahr, dass dieselbe VM auf zwei Nodes gleichzeitig aktiv ist – Dateninkonsistenzen, Dateisystem‑Korruption und im schlimmsten Fall ein kompletter Datenverlust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Ich habe in meinem Homelab schon zweimal erlebt, wie ein kleiner Kabelbruch zu zwei gleichzeitig laufenden PostgreSQL‑Instanzen führte. Das war der Grund, warum ich heute nie weniger als drei Nodes mit korrekt abgestimmten Stimmen verwende.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quorum richtig konfigurieren – Beispiel 1: Drei‑Node‑Cluster aufbauen
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ziel:&lt;/strong&gt; Ein neues 3‑Node‑HA‑Cluster mit 1 Vote pro Node erstellen.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Auf jedem Node das Proxmox‑Paket installieren (falls noch nicht geschehen)&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; proxmox-ve

&lt;span class="c"&gt;# Auf dem ersten Node das Cluster initialisieren&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pvecm create pve‑ha-cluster

&lt;span class="c"&gt;# Auf Node 2 und Node 3 dem Cluster beitreten (IP des ersten Nodes angeben)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pvecm add 192.168.1.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nach dem &lt;code&gt;pvecm add&lt;/code&gt; wird automatisch die Corosync‑Konfiguration ausgetauscht. Prüfen Sie, ob jede Node &lt;strong&gt;1 Vote&lt;/strong&gt; hat:&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;cat&lt;/span&gt; /etc/pve/corosync.conf | &lt;span class="nb"&gt;grep &lt;/span&gt;vote
&lt;span class="c"&gt;# Ausgabe sollte für jede Node etwa so aussehen:&lt;/span&gt;
&lt;span class="c"&gt;#     node {&lt;/span&gt;
&lt;span class="c"&gt;#         name: node1&lt;/span&gt;
&lt;span class="c"&gt;#         votes: 1&lt;/span&gt;
&lt;span class="c"&gt;#     }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Damit ist das Quorum auf &lt;strong&gt;3 Votes&lt;/strong&gt; (3 × 1) gesetzt. Die erforderliche Mehrheit sind &lt;strong&gt;2 Votes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Die meisten Probleme entstehen, wenn Administratoren nach dem Hinzufügen eines neuen Nodes vergessen, die Corosync‑Konfiguration zu aktualisieren. Ein kurzer &lt;code&gt;pvecm status&lt;/code&gt; nach jedem Schritt erspart später nächtliche Fehlersuchen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Split‑Brain verhindern – Beispiel 2: Stimmenverteilung und Fencing (STONITH) einbinden
&lt;/h2&gt;

&lt;p&gt;Eine weitere Möglichkeit, Split‑Brain zu verhindern, ist das &lt;strong&gt;Fencing&lt;/strong&gt; (STONITH – &lt;em&gt;Shoot‑The‑Other‑Node‑In‑The‑Head&lt;/em&gt;). Sobald ein Node nicht mehr erreichbar ist, wird er automatisch neu gestartet oder abgeschaltet, sodass das verbleibende Cluster eine eindeutige Mehrheit hat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Schritt 1: STONITH‑Device 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;# Beispiel: IPMI‑Controller eines Dell‑Servers&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pveha configure stonith ipmi &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--node&lt;/span&gt; node1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--ipmi_user&lt;/span&gt; admin &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--ipmi_password&lt;/span&gt; secret &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--ipmi_addr&lt;/span&gt; 192.168.1.50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wiederholen Sie den Befehl für &lt;strong&gt;jeden&lt;/strong&gt; Node im Cluster. Proxmox legt dann einen STONITH‑Agenten an, der im Notfall den fehlerhaften Server neu startet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Schritt 2: Votes anpassen (optional)
&lt;/h3&gt;

&lt;p&gt;Manche Setups setzen den &lt;em&gt;Master‑Node&lt;/em&gt; mit &lt;strong&gt;2 Votes&lt;/strong&gt;, die beiden &lt;em&gt;Slave‑Nodes&lt;/em&gt; mit je &lt;strong&gt;1 Vote&lt;/strong&gt;. Das erhöht die Stabilität, weil der Master im Normalbetrieb stärker vertreten ist.&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;# Editieren Sie die Corosync‑Datei manuell&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/pve/corosync.conf

&lt;span class="c"&gt;# Beispiel‑Snippet&lt;/span&gt;
node &lt;span class="o"&gt;{&lt;/span&gt;
    name: node1
    votes: 2
&lt;span class="o"&gt;}&lt;/span&gt;
node &lt;span class="o"&gt;{&lt;/span&gt;
    name: node2
    votes: 1
&lt;span class="o"&gt;}&lt;/span&gt;
node &lt;span class="o"&gt;{&lt;/span&gt;
    name: node3
    votes: 1
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Speichern und den Cluster neu 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 restart corosync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Schritt 3: Testen Sie das Fencing
&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;# Simulierter Netzwerk‑Ausfall von node2 (aus Node1 heraus)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pvecm node down node2
&lt;span class="c"&gt;# Erwartete Reaktion: STONITH wird ausgelöst und node2 neu gestartet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Ein korrekt konfiguriertes STONITH ist das Rückgrat eines produktiven HA‑Clusters. Ich habe in über 30 Einsätzen beobachtet, dass ein fehlendes Fencing die häufigste Ursache für Split‑Brain‑Fehler ist. Nehmen Sie sich die Zeit, die IPMI‑Zugänge zu testen – ein falsches Passwort kostet Sie im Notfall Daten.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitoring und automatischer Failover – Beispiel 3: Systemd‑Watchdog + Proxmox‑Alerts
&lt;/h2&gt;

&lt;p&gt;Ein weiteres Sicherheitsnetz besteht aus &lt;strong&gt;Watchdog‑Checks&lt;/strong&gt;, die die Cluster‑Gesundheit überwachen und im Zweifel ein automatisches Failover 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="c"&gt;# Aktivieren Sie den systemd‑Watchdog (auf allen Nodes)&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/systemd/watchdog.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/watchdog.conf.d/20-proxmox.conf
[Watchdog]
WatchdogSec=30s
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Reload systemd&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Danach konfigurieren Sie in Proxmox eine &lt;strong&gt;Alert‑Rule&lt;/strong&gt;, die bei Verlust von Quorum eine E‑Mail versendet und gleichzeitig das HA‑Failover erzwingt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pveam update
pveam download &lt;span class="nb"&gt;local &lt;/span&gt;my-alertscript.sh
&lt;span class="c"&gt;# Skript (my-alertscript.sh) prüft /etc/pve/.members und startet einen Failover, falls nötig.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Im Web‑Interface gehen Sie zu &lt;em&gt;Datacenter → HA → Alerts&lt;/em&gt; und legen ein neues Alert‑Script an, das &lt;code&gt;my-alertscript.sh&lt;/code&gt; ausführt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Nur Monitoring ist nicht genug – das System muss &lt;em&gt;automatisch&lt;/em&gt; reagieren können. Der systemd‑Watchdog sorgt dafür, dass ein Node, der nicht mehr reagiert, vom Kernel neu gestartet wird, bevor der Netzwerk‑Split‑Brain‑Mechanismus überhaupt greift.&lt;/p&gt;




&lt;h2&gt;
  
  
  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 problematisch&lt;/th&gt;
&lt;th&gt;Sofortmaßnahme&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;2‑Node‑Cluster&lt;/strong&gt; ohne &lt;code&gt;expected_votes&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Kein Quorum → Split‑Brain&lt;/td&gt;
&lt;td&gt;Mindestens 3 Nodes oder &lt;code&gt;expected_votes&lt;/code&gt; auf 2 setzen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Votes nicht synchron&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Corosync kann kein klares Quorum bilden&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pvecm status&lt;/code&gt; prüfen und Corosync‑Datei angleichen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kein STONITH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bei Netzwerk‑Partition bleibt ein Node aktiv&lt;/td&gt;
&lt;td&gt;STONITH‑Device einrichten (IPMI, iLO, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Veraltete Corosync‑Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Patch‑Level‑Fehler führen zu falscher Abstimmung&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;apt-get upgrade proxmox-ve&lt;/code&gt; regelmäßig durchführen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unzureichende Netzwerk‑Redundanz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ein einzelner Switch‑Ausfall erzeugt Partition&lt;/td&gt;
&lt;td&gt;Dual‑Switch‑Design mit LACP oder Bonding verwenden&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Meine persönliche Einschätzung:&lt;/strong&gt; Die meisten Katastrophen lassen sich durch ein systematisches Check‑List‑Review vor dem produktiven Einsatz vermeiden. Ich empfehle, jedes neue Node‑Add‑ oder Update‑Szenario mit einem &lt;strong&gt;„Quorum‑Dry‑Run“&lt;/strong&gt; zu testen – simulieren Sie den Ausfall eines Nodes und prüfen Sie, ob das Cluster weiterhin konsistent bleibt.&lt;/p&gt;




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

&lt;p&gt;Ein Proxmox‑HA‑Cluster ist kein Set‑and‑Forget‑Projekt. Der Schlüssel zum Erfolg liegt in drei Dingen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mindestens drei Nodes&lt;/strong&gt; mit korrekt abgestimmten Votes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fencing (STONITH)&lt;/strong&gt; für jeden Node, damit ein evtl. fehlerhafter Server sofort isoliert wird.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring &amp;amp; automatischer Failover&lt;/strong&gt;, damit Sie nicht erst im Alarm‑Dashboard reagieren, sondern das System proaktiv handelt.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;Loggen Sie sich auf Ihrem &lt;strong&gt;Master‑Node&lt;/strong&gt; ein.&lt;/li&gt;
&lt;li&gt;Führen Sie &lt;code&gt;pvecm status&lt;/code&gt; aus und notieren Sie die aktuelle Vote‑Verteilung.&lt;/li&gt;
&lt;li&gt;Erstellen Sie ein &lt;strong&gt;STONITH‑Device&lt;/strong&gt; für jeden Node (&lt;code&gt;pveha configure stonith ipmi …&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Testen Sie das Failover mit &lt;code&gt;pvecm node down &amp;lt;node&amp;gt;&lt;/code&gt; und prüfen Sie, ob das verbleibende Cluster das Quorum behält.&lt;/li&gt;
&lt;li&gt;Implementieren Sie ein &lt;strong&gt;systemd‑Watchdog&lt;/strong&gt; und ein &lt;strong&gt;Alert‑Script&lt;/strong&gt;, das Sie per E‑Mail über Quorum‑Verluste informiert.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Damit haben Sie nicht nur Split‑Brain aus dem Spiel genommen, sondern auch ein resilienteres, selbstheilendes Proxmox‑Umfeld geschaffen – bereit für kritische Produktions‑Workloads.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Autor: Ein langjähriger Linux‑ und Proxmox‑Enthusiast, der in vielen Kundenprojekten Split‑Brain‑Katastrophen erfolgreich verhindert hat.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>proxmox</category>
      <category>hacluster</category>
      <category>quorum</category>
      <category>splitbrain</category>
    </item>
    <item>
      <title>Firewall-Tuning: Stateful vs. Next-Gen - Die richtige Wahl</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Thu, 18 Jun 2026 06:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-die-richtige-wahl-2loh</link>
      <guid>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-die-richtige-wahl-2loh</guid>
      <description>&lt;h1&gt;
  
  
  Firewall-Tuning: Stateful vs. Next-Gen Firewall – wann reicht was und wann nicht?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Einleitung
&lt;/h2&gt;

&lt;p&gt;Die Auswahl der richtigen Firewall-Technologie ist ein entscheidender Schritt bei der Sicherung von Netzwerken. Stateful Firewalls und Next-Gen Firewalls sind zwei populäre Optionen, die jeweils ihre eigenen Stärken und Schwächen haben. In diesem Artikel werden wir die Unterschiede zwischen Stateful Firewalls und Next-Gen Firewalls erläutern und konkrete Beispiele für die Anwendung jedes Typs geben.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was sind Stateful Firewalls?
&lt;/h2&gt;

&lt;p&gt;Stateful Firewalls sind eine Art von Firewall, die den Zustand von Netzwerksessions überwacht. Sie können erkennen, ob ein Datenpaket Teil einer bestehenden Session ist oder ob es ein neuer Angriff ist. Stateful Firewalls sind in der Lage, die Quelle und das Ziel von Datenpaketen zu überprüfen und zu entscheiden, ob sie den Datenverkehr zulassen oder blockieren.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Verwendung von Stateful Firewalls ist die Konfiguration einer Cisco ASA-Firewall. Mit der ASA-Firewall können Sie Regeln erstellen, die den Zustand von Netzwerksessions überwachen und den Datenverkehr basierend auf diesem Zustand filtern.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Stateful Firewalls sind eine gute Wahl für kleine und mittelständische Unternehmen, die eine einfache und kostengünstige Lösung für die Netzwerksicherheit benötigen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was sind Next-Gen Firewalls?
&lt;/h2&gt;

&lt;p&gt;Next-Gen Firewalls sind eine Art von Firewall, die zusätzlich zu den Funktionen von Stateful Firewalls auch Deep Packet Inspection (DPI) und Anwendungserkennung ausführt. Sie können erkennen, welche Anwendungen auf dem Netzwerk verwendet werden und können den Datenverkehr basierend auf dieser Erkennung filtern.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Verwendung von Next-Gen Firewalls ist die Konfiguration einer Palo Alto Networks-Firewall. Mit der Palo Alto Networks-Firewall können Sie Regeln erstellen, die den Datenverkehr basierend auf der Anwendung und dem Nutzer filtern.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Next-Gen Firewalls sind eine gute Wahl für Unternehmen, die eine umfassende und granulare Kontrolle über den Netzwerkdienst benötigen.&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 Überkonfiguration von Regeln. Dies kann zu einer Überlastung der Firewall und einer Beeinträchtigung der Netzwerkleistung führen. Ein anderer Fehler ist die Verwendung von Standard-Regeln, die nicht auf die spezifischen Bedürfnisse des Unternehmens zugeschnitten sind.&lt;/p&gt;

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

&lt;p&gt;Die Auswahl der richtigen Firewall-Technologie ist ein entscheidender Schritt bei der Sicherung von Netzwerken. Stateful Firewalls und Next-Gen Firewalls haben jeweils ihre eigenen Stärken und Schwächen. Durch die Kenntnis von konkreten Beispielen und der Vermeidung von häufigen Fehlern können Unternehmen die richtige Firewall-Technologie für ihre Bedürfnisse wählen. Dein nächster Schritt sollte die Evaluierung von Stateful Firewalls und Next-Gen Firewalls für deine spezifischen Anforderungen sein.&lt;/p&gt;

</description>
      <category>firewalltuning</category>
      <category>statefulfirewall</category>
      <category>nextgenfirewall</category>
      <category>netzwerksicherheit</category>
    </item>
    <item>
      <title>Landlock LSM: Kernel‑basiertes Sandbox‑Framework für sichere Linux‑Anwendungen</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Wed, 17 Jun 2026 18:00:04 +0000</pubDate>
      <link>https://dev.to/uhltak/landlock-lsm-kernel-basiertes-sandbox-framework-fur-sichere-linux-anwendungen-1okb</link>
      <guid>https://dev.to/uhltak/landlock-lsm-kernel-basiertes-sandbox-framework-fur-sichere-linux-anwendungen-1okb</guid>
      <description>&lt;h1&gt;
  
  
  Landlock LSM – Das neue Sandbox‑Framework im Linux‑Kernel
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Der einzige Weg, echte Sicherheit zu erreichen, ist, das System zu kontrollieren, bevor ein Angreifer es überhaupt erreicht."&lt;/em&gt; – Mein persönliches Credo, seit ich 2015 erste LSM‑Erweiterungen testete.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Der Linux‑Kernel hat in den letzten Jahren kräftig an seiner Sicherheitsschicht gearbeitet: SELinux, AppArmor, eBPF‑basierte Filter – und dann kam &lt;strong&gt;Landlock&lt;/strong&gt;. Was dabei spannend ist: Landlock ist das &lt;strong&gt;erste&lt;/strong&gt; LSM, das &lt;strong&gt;nicht&lt;/strong&gt; per Root‑Privilegien konfiguriert werden muss. Stattdessen definiert jede Anwendung ihre eigenen Zugriffsregeln, die vom Kernel garantiert werden. In diesem Beitrag zeige ich Ihnen, warum das relevant ist, wie Sie sofort loslegen und welche Fallen Sie im Alltag vermeiden sollten. &lt;/p&gt;




&lt;h2&gt;
  
  
  1. Was ist Landlock und warum brauchen wir es?
&lt;/h2&gt;

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

&lt;p&gt;Landlock ist ein &lt;strong&gt;Linux Security Module (LSM)&lt;/strong&gt;, das im Kernel seit Version 5.13 (2020) aktiv ist. Im Gegensatz zu SELinux oder AppArmor, die zentral von einem Administrator verwaltet werden, erlaubt Landlock &lt;strong&gt;Anwendungen&lt;/strong&gt;, ihre &lt;strong&gt;eigene Whitelist&lt;/strong&gt; von System‑Ressourcen zu definieren – und das ohne &lt;strong&gt;root&lt;/strong&gt;‑Rechte. Der Kern liefert dabei drei grundlegende Mechanismen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Access‑Rule‑Sets&lt;/strong&gt; – Beschränkungen für &lt;code&gt;open()&lt;/code&gt;, &lt;code&gt;mkdir()&lt;/code&gt;, &lt;code&gt;unlink()&lt;/code&gt;, &lt;code&gt;bind()&lt;/code&gt;, &lt;code&gt;connect()&lt;/code&gt;, …&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rule‑Stacks&lt;/strong&gt; – Anwendungen können mehrere Rule‑Sets stapeln, um feinkörnige Berechtigungen zu modellieren.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enforcement‑Policy&lt;/strong&gt; – Der Kernel prüft jede System‑Call‑Anfrage gegen den aktuellen Stack und wirft &lt;strong&gt;EPERM&lt;/strong&gt; zurück, wenn die Regel das macht.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Das Ergebnis: &lt;strong&gt;„Zero‑Trust“ für einzelne Prozesse&lt;/strong&gt;, ohne dass ein Administrator das System root‑weise neu konfigurieren muss. Für DevOps‑Teams bedeutet das: &lt;strong&gt;Sicherheit als Code&lt;/strong&gt;, aber auf Prozess‑ Ebene statt nur auf Container‑ Ebene.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Aus meiner Sicht ist Landlock ein Game‑Changer für &lt;strong&gt;Desktop‑Anwendungen&lt;/strong&gt; (z. B. Web‑Browser, PDF‑Reader) und &lt;strong&gt;Entwickler‑Tools&lt;/strong&gt;, weil es das Risiko eines versehentlichen Datenlecks drastisch reduziert. Gleichzeitig ist das Konzept noch relativ neu – die Dokumentation ist dünn, die Community klein – aber das Potenzial ist enorm, weil es einen Mittelweg zwischen schwergewichtigem SELinux und lockeren Sandbox‑Tools wie &lt;code&gt;bubblewrap&lt;/code&gt; bietet.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Landlock aktivieren und erste Regel erstellen
&lt;/h2&gt;

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

&lt;p&gt;Landlock ist im Kernel bereits integriert, aber Sie müssen sicherstellen, dass das Modul geladen ist und dass die &lt;strong&gt;&lt;code&gt;CONFIG_LANDLOCK&lt;/code&gt;&lt;/strong&gt;‑Option beim Kernel‑Build aktiviert ist. Moderne Distributionen (Ubuntu 22.04+, Debian 12, Fedora 36+) haben das bereits „on by default“. Prüfen Sie die Verfügbarkeit 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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep &lt;/span&gt;LANDLOCK /boot/config-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;CONFIG_LANDLOCK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Falls das Ergebnis leer ist, benötigen Sie einen Kernel‑Build mit Landlock – das ist heute selten der Fall, aber für Spezial‑Distributionen (z. B. Alpine) kann ein manueller Build nötig sein.&lt;/p&gt;

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

&lt;p&gt;Nehmen wir an, wir wollen ein simples &lt;em&gt;Hello‑World&lt;/em&gt;‑Programm in C sandboxen. Der Code nutzt das &lt;strong&gt;liblandlock&lt;/strong&gt;‑API, das mit &lt;code&gt;libc&lt;/code&gt; kommt (ab glibc 2.34). Das folgende Mini‑Beispiel erstellt einen Rule‑Set, das nur &lt;em&gt;read‑only&lt;/em&gt; Zugriff auf das aktuelle Arbeitsverzeichnis erlaubt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#define _GNU_SOURCE
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;landlock.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Landlock-Handle öffnen (vergleicht Kernel‑Version)&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_ruleset_attr&lt;/span&gt; &lt;span class="n"&gt;ruleset_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handled_access_fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                               &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd_ruleset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;landlock_create_ruleset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ruleset_attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruleset_attr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_ruleset&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"landlock_create_ruleset"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Pfad‑Regel für das aktuelle Verzeichnis definieren&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_path_beneath_attr&lt;/span&gt; &lt;span class="n"&gt;path_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allowed_access&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                          &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AT_FDCWD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// '.'&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_add_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_ruleset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_RULE_PATH_BENEATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;path_attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_attr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"landlock_add_rule"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Regeln aktivieren (immutable)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_restrict_self&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_ruleset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"landlock_restrict_self"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_ruleset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 4. Jetzt ist das Programm gesandboxt – versuche, /etc/passwd zu öffnen&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/etc/passwd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;O_RDONLY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"open /etc/passwd"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unerwartet erfolgreich – Sandbox nicht wirksam"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Kompilieren und testen:&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="nv"&gt;$ &lt;/span&gt;gcc &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-O2&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; sandbox_demo sandbox_demo.c &lt;span class="nt"&gt;-llandlock&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;./sandbox_demo
open /etc/passwd: Permission denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Zugriff auf &lt;code&gt;/etc/passwd&lt;/code&gt; wird korrekt blockiert, während das Lesen von &lt;code&gt;./sandbox_demo.c&lt;/code&gt; weiterhin funktioniert.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der Code ist etwas sperrig, weil das Landlock‑API noch kein Wrapper‑Framework besitzt. Die &lt;strong&gt;liblandlock&lt;/strong&gt;‑Bibliothek ist jedoch stabil und in den meisten Distributionen vorhanden. Für schnelle Prototypen benutze ich &lt;strong&gt;&lt;code&gt;bubblewrap&lt;/code&gt;&lt;/strong&gt; mit &lt;code&gt;--landlock&lt;/code&gt;‑Flag, weil es das C‑Boilerplate verpackt. Der Ansatz mit direktem C‑Code gibt Ihnen aber die volle Kontrolle – und ist ideal, wenn Sie ein Tool in Rust, Go oder Python schreiben wollen, das das Sandboxing‑Feature intern nutzt.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Praktisches Beispiel 1 – Sandbox für einen Dateibrowser
&lt;/h2&gt;

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

&lt;p&gt;Ein klassischer Einsatzfall ist ein &lt;strong&gt;Dateimanager&lt;/strong&gt;, der nur Leserechte auf ein bestimmtes Verzeichnis hat, aber nicht auf das System. Wir zeigen, wie Sie ein bestehendes Binary (z. B. &lt;code&gt;pcmanfm&lt;/code&gt;) mit Landlock einschränken, ohne das Binary zu patchen.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Erstelle ein Regel‑Set&lt;/strong&gt; für das gewünschte Verzeichnis (z. B. &lt;code&gt;$HOME/Downloads&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap‑Binary&lt;/strong&gt; mit einem kleinen Wrapper‑Programm, das das Rule‑Set anlegt und dann das Original‑Binary execvt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wrapper‑Code (&lt;code&gt;wrap_pcmanfm.c&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#define _GNU_SOURCE
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;landlock.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;target_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"LANDLOCK_TARGET_DIR"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;target_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"LANDLOCK_TARGET_DIR not set&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Ruleset – nur Lesen+Write im Zielverzeichnis&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_ruleset_attr&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handled_access_fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                               &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_WRITE_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                               &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_DIR&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                               &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_REMOVE_DIR&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                               &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_REMOVE_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd_rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;landlock_create_ruleset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"landlock_create_ruleset"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Pfad‑Regel für das Ziel&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;O_PATH&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;O_DIRECTORY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_dir&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"open target_dir"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_path_beneath_attr&lt;/span&gt; &lt;span class="n"&gt;pba&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allowed_access&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_WRITE_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_DIR&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_REMOVE_DIR&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_REMOVE_FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fd_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_add_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_RULE_PATH_BENEATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pba&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"landlock_add_rule"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_dir&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Aktivieren&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_restrict_self&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"restrict_self"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 4. Original‑Binary ausführen&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;new_argv&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"pcmanfm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;execv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/usr/bin/pcmanfm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_argv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"execv"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;Kompilieren und einsetzen:&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="nv"&gt;$ &lt;/span&gt;gcc &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-O2&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; wrap_pcmanfm wrap_pcmanfm.c &lt;span class="nt"&gt;-llandlock&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo mv&lt;/span&gt; /usr/bin/pcmanfm /usr/bin/pcmanfm.real
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp &lt;/span&gt;wrap_pcmanfm /usr/bin/pcmanfm
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/bin/pcmanfm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nun setzen wir die Zielumgebung:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LANDLOCK_TARGET_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Downloads
&lt;span class="nv"&gt;$ &lt;/span&gt;pcmanfm   &lt;span class="c"&gt;# startet den Wrapper&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Versucht man nun, über das Menü &lt;em&gt;Datei → Öffnen&lt;/em&gt; ein System‑Verzeichnis wie &lt;code&gt;/etc&lt;/code&gt; zu öffnen, wird die Anfrage mit &lt;strong&gt;EPERM&lt;/strong&gt; abgewiesen – und das ohne irgendeine root‑basierte Policy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Damit haben wir &lt;strong&gt;einen Drop‑in‑Replacement&lt;/strong&gt; geschaffen, das ohne System‑Reboot funktioniert. Der Nachteil: Der Wrapper muss für jedes Binary neu gebaut werden und benötigt eine &lt;strong&gt;&lt;code&gt;chmod +x&lt;/code&gt;&lt;/strong&gt;‑Anpassung – aber das ist ein akzeptabler Aufwand, wenn Sie kritische Desktop‑Tools isolieren wollen. Für massenhaftes Deployen im Unternehmen empfiehlt sich ein &lt;strong&gt;Build‑Script&lt;/strong&gt;, das die Wrapper automatisiert erstellt.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Praktisches Beispiel 2 – Netzwerk‑isoliertes Build‑Tool
&lt;/h2&gt;

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

&lt;p&gt;Entwickler‑Tools wie &lt;code&gt;cargo&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt; oder &lt;code&gt;make&lt;/code&gt; greifen häufig auf das Netzwerk zu (z. B. zum Herunterladen von Bibliotheken). In einem CI‑Umfeld kann das zu unkontrollierten Exfiltrationen führen. Landlock kann das Netzwerk‑Interface gezielt abblocken, ohne dass Sie ein separates Container‑Runtime benötigen.&lt;/p&gt;

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

&lt;p&gt;Wir bauen ein Wrapper für &lt;code&gt;cargo&lt;/code&gt; (Rust‑Package‑Manager), das nur &lt;strong&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/strong&gt; zu &lt;code&gt;registry.crates.io&lt;/code&gt; erlaubt – alles andere wird blockiert.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Erstelle ein Rule‑Set für Netzwerk‑Zugriff&lt;/strong&gt; (nur IPv4/IPv6 TCP zu einer Whitelist‑IP).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Füge Pfad‑Regeln&lt;/strong&gt; für das aktuelle Projektverzeichnis hinzu.
&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="cp"&gt;#define _GNU_SOURCE
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;landlock.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Netzwerk‑Regeln – nur zu registry.crates.io (IP 151.101.0.197)&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_ruleset_attr&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handled_access_net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_NET_CONNECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd_rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;landlock_create_ruleset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ruleset"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;inet_pton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"151.101.0.197"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_net_access_attr&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allowed_access&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_NET_CONNECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_add_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_RULE_NET_PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"add net rule"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Dateisystem‑Regeln – read/write im Projektordner&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open&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;O_PATH&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;O_DIRECTORY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;landlock_path_beneath_attr&lt;/span&gt; &lt;span class="n"&gt;pba&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allowed_access&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_WRITE_FILE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                           &lt;span class="n"&gt;LANDLOCK_ACCESS_FS_READ_DIR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fd_proj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_add_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LANDLOCK_RULE_PATH_BENEATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pba&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"add fs rule"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_proj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Aktivieren&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;landlock_restrict_self&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"restrict_self"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_rs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 4. Cargo starten&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;new_argv&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"cargo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;execv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/usr/bin/cargo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_argv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"execv"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;Kompilieren und ausführen:&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="nv"&gt;$ &lt;/span&gt;gcc &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-O2&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; cargo_landlock cargo_landlock.c &lt;span class="nt"&gt;-llandlock&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;./cargo_landlock   &lt;span class="c"&gt;# baut das aktuelle Rust‑Projekt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wenn das Projekt versucht, Pakete von einer anderen Quelle zu laden, schlägt &lt;code&gt;connect()&lt;/code&gt; mit &lt;strong&gt;EPERM&lt;/strong&gt; fehl und das Build bricht ab – ein klarer Hinweis, dass die Whitelist nicht ausreicht.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Durch die Kombination von &lt;strong&gt;Netz‑ und Dateisystem‑Regeln&lt;/strong&gt; erhalten Sie eine feinkörnige Policy, die auf einzelne Build‑Jobs zugeschnitten ist. Der Aufwand ist gering (nur ein kleiner Wrapper), dafür erhalten Sie &lt;strong&gt;deterministische Netzwerk‑Kontrolle&lt;/strong&gt;, die sonst nur mit komplexen Firewall‑Regeln erreichbar wäre. Für Teams, die Rust‑basiert arbeiten, ist das ein praktisch sofort einsetzbarer Sicherheits‑Boost.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Praktisches Beispiel 3 – Beschränkung von &lt;code&gt;gcc&lt;/code&gt;‑Compiler‑Aufrufen
&lt;/h2&gt;

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

&lt;p&gt;Ein häufiges Sicherheitsrisiko in CI‑Pipelines ist, dass ein Kompilierer wie &lt;code&gt;gcc&lt;/code&gt; über &lt;code&gt;-Wl,--wrap&lt;/code&gt; oder &lt;code&gt;-Xlinker&lt;/code&gt; Aufrufe zu beliebigen System‑Binaries ausführen kann („&lt;strong&gt;binary planting&lt;/strong&gt;“). Mit Landlock können wir den Compiler so konfigurieren, dass er nur im &lt;strong&gt;build‑Verzeichnis&lt;/strong&gt; schreiben und nur das &lt;strong&gt;Standard‑C‑Toolchain‑Verzeichnis&lt;/strong&gt; lesen darf.&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;# Schritt 1: Regel‑Set in Shell mit `landlock`‑CLI (bietet ein Wrapper‑Tool)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;landlock-tools   &lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;landlock &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ./build_rules.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;code&gt;build_rules.json&lt;/code&gt; definieren wir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$(pwd)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"create"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/lib/gcc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/include"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nun führen wir den Compiler innerhalb des Landlock‑Contexts aus:&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="nv"&gt;$ &lt;/span&gt;landlock &lt;span class="nb"&gt;exec&lt;/span&gt; ./build_rules.json gcc &lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; hello hello.c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Versucht &lt;code&gt;gcc&lt;/code&gt;, ein externes Skript über &lt;code&gt;-Wl,-e,system&lt;/code&gt; zu starten, wird das &lt;strong&gt;&lt;code&gt;execve()&lt;/code&gt;&lt;/strong&gt;‑System‑Call blockiert (EPERM). Das Resultat: &lt;strong&gt;Nur das compilierte Binary wird erzeugt&lt;/strong&gt;, kein unerwarteter Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der &lt;strong&gt;&lt;code&gt;landlock-tools&lt;/code&gt;‑Wrapper&lt;/strong&gt; ist ideal für schnelllebige CI‑Jobs, weil er keine C‑Programmierung erfordert. Allerdings unterstützt das Tool derzeit nur &lt;strong&gt;Pfad‑basiertes Whitelisting&lt;/strong&gt;, nicht die feinkörnigen &lt;code&gt;connect()&lt;/code&gt;‑Regeln. Für ein produktives Umfeld empfehle ich, das &lt;strong&gt;C‑API&lt;/strong&gt; zu benutzen (wie im ersten Beispiel) oder ein &lt;strong&gt;Rust‑Binding&lt;/strong&gt; (&lt;code&gt;landlock-rs&lt;/code&gt;) zu nutzen, das ein ergonomisches Builder‑Pattern bietet.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Häufige Fehler beim Einsatz von Landlock
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kernel‑Version nicht geprüft&lt;/strong&gt; – Landlock ist erst ab 5.13 verfügbar; bei alten Servern bricht das Programm mit &lt;code&gt;ENOSYS&lt;/code&gt; ab. Prüfen Sie immer mit &lt;code&gt;landlock_create_ruleset&lt;/code&gt; und geben Sie eine klare Fehlermeldung aus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zu breite Zugriffsrechte&lt;/strong&gt; – Viele Beispiele setzen &lt;code&gt;READ|WRITE|CREATE|REMOVE&lt;/code&gt; für ganze Verzeichnisse. Das reduziert das Sicherheits‑Potential drastisch. Stattdessen wählen Sie das kleinstmögliche Minimum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;execve&lt;/code&gt; nicht bedenken&lt;/strong&gt; – Landlock kontrolliert nicht das Ausführen von Binärdateien, wenn Sie nicht explizit &lt;code&gt;LANDLOCK_ACCESS_FS_EXEC&lt;/code&gt; (seit Kernel 5.19) aktivieren. Das kann zu Umgehungen führen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regel‑Stack nicht immutable&lt;/strong&gt; – Wenn Sie &lt;code&gt;landlock_restrict_self&lt;/code&gt; &lt;strong&gt;nach&lt;/strong&gt; dem Aufruf von &lt;code&gt;execve&lt;/code&gt; setzen, gilt die Policy nicht mehr für das neue Prozess‑Image. Setzen Sie die Policy &lt;strong&gt;vor&lt;/strong&gt; dem &lt;code&gt;execve&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verlasse dich nicht nur auf Landlock&lt;/strong&gt; – Landlock ist kein Allheilmittel; kombinieren Sie es mit AppArmor, SELinux oder &lt;code&gt;systemd‑sandbox&lt;/code&gt; für mehrschichtige Sicherheit.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Landlock liefert &lt;strong&gt;Kernel‑seitige Sandboxing&lt;/strong&gt; ohne root‑basiertes Policy‑Management. Die drei Beispiele – &lt;strong&gt;Dateibrowser‑Wrapper&lt;/strong&gt;, &lt;strong&gt;netzwerk‑isoliertes Build‑Tool&lt;/strong&gt; und &lt;strong&gt;Compiler‑Restriction&lt;/strong&gt; – zeigen, dass Sie bereits heute in Entwicklungs‑ und Desktop‑Umgebungen gezielte, feinkörnige Zugriffsbedingungen definieren können.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prüfen Sie Ihren Kernel:&lt;/strong&gt; &lt;code&gt;grep LANDLOCK /boot/config-$(uname -r)&lt;/code&gt; – wenn &lt;code&gt;y&lt;/code&gt; fehlt, bauen Sie einen aktuellen Kernel mit &lt;code&gt;CONFIG_LANDLOCK=y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installieren Sie das &lt;code&gt;landlock-tools&lt;/code&gt;‑Paket&lt;/strong&gt; (falls verfügbar) und spielen Sie mit dem &lt;code&gt;landlock&lt;/code&gt;‑CLI, um ein erstes Rule‑Set zu erstellen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wählen Sie ein kritisches Binary&lt;/strong&gt; in Ihrem Alltag (z. B. &lt;code&gt;pcmanfm&lt;/code&gt;, &lt;code&gt;cargo&lt;/code&gt; oder &lt;code&gt;gcc&lt;/code&gt;) und schreiben Sie einen kleinen Wrapper, wie im Artikel gezeigt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatisieren Sie das Einsetzen&lt;/strong&gt; mittels eines Ansible‑Playbooks, das die Wrapper‑Binaries verteilt und die Umgebungsvariablen setzt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messen Sie die Wirkung&lt;/strong&gt; – prüfen Sie &lt;code&gt;auditd&lt;/code&gt;‑Logs auf &lt;code&gt;EPERM&lt;/code&gt;‑Einträge und passen Sie die Regeln iterativ an.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Damit haben Sie einen &lt;strong&gt;kontrollierten Einstieg&lt;/strong&gt; in Landlock, stärken Ihre &lt;strong&gt;Zero‑Trust‑Strategie&lt;/strong&gt; und reduzieren die Angriffsfläche Ihrer Linux‑Workloads – ohne einen einzigen Root‑Zugriff zu vergeben.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Weiterführende Literatur&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux‑Kernel‑Docs: &lt;code&gt;Documentation/userspace-api/landlock.rst&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;landlock-tools&lt;/code&gt; GitHub: &lt;a href="https://github.com/landlock/landlock-tools" rel="noopener noreferrer"&gt;https://github.com/landlock/landlock-tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rust‑Binding: &lt;code&gt;landlock-rs&lt;/code&gt; (crate.io)&lt;/li&gt;
&lt;li&gt;Blog‑Post von Torvalds: &lt;em&gt;"Landlock: A Kernel‑Level Sandbox for Unprivileged Users"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Viel Erfolg beim Sandboxing – und denken Sie immer: &lt;strong&gt;Besser sicher vorher, als nachträglich patchen!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>landlock</category>
      <category>linuxsecurity</category>
      <category>sandboxing</category>
      <category>lsm</category>
    </item>
    <item>
      <title>Firewall-Tuning: Stateful vs. Next-Gen</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Wed, 17 Jun 2026 06:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-5036</link>
      <guid>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-5036</guid>
      <description>&lt;h1&gt;
  
  
  Firewall-Tuning: Stateful vs. Next-Gen Firewall – wann reicht was und wann nicht?
&lt;/h1&gt;

&lt;p&gt;Firewalls sind ein essentieller Bestandteil jeder Netzwerkinfrastruktur. Sie dienen dazu, den Datenverkehr zu kontrollieren und Angriffe abzuwehren. Es gibt jedoch verschiedene Arten von Firewalls, wie Stateful Firewalls und Next-Gen Firewalls. In diesem Artikel werden wir uns mit den Unterschieden zwischen Stateful Firewalls und Next-Gen Firewalls beschäftigen und diskutieren, wann welche Art von Firewall geeignet ist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was sind Stateful Firewalls?
&lt;/h2&gt;

&lt;p&gt;Stateful Firewalls sind eine Art von Firewall, die den Zustand von Verbindungen überwacht. Sie können erkennen, ob eine Verbindung neu ist oder ob sie bereits bestand. Stateful Firewalls können auch die Richtung von Verbindungen überwachen und erkennen, ob ein Paket Teil einer bestehenden Verbindung ist oder nicht. Ein Beispiel für eine Stateful Firewall ist die Cisco ASA.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Konfiguration einer Stateful Firewall ist die Einrichtung von Access Control Lists (ACLs) auf einer Cisco ASA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;access-list&lt;/span&gt; outside_in extended &lt;span class="ow"&gt;permit&lt;/span&gt; tcp any any eq 80
&lt;span class="k"&gt;access-list&lt;/span&gt; outside_in extended &lt;span class="ow"&gt;permit&lt;/span&gt; tcp any any eq 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diese ACLs erlauben den Zugriff auf die Ports 80 und 443 von außerhalb des Netzwerks.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Stateful Firewalls sind ein wichtiger Bestandteil jeder Netzwerkinfrastruktur. Sie bieten eine gute Grundlage für die Sicherheit von Netzwerken, aber sie reichen nicht aus, um moderne Angriffe abzuwehren.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was sind Next-Gen Firewalls?
&lt;/h2&gt;

&lt;p&gt;Next-Gen Firewalls sind eine neue Generation von Firewalls, die über die Fähigkeiten von Stateful Firewalls hinausgehen. Sie bieten eine tiefere Inspektion von Paketen und können auch die Anwendungsschicht überwachen. Next-Gen Firewalls können auch die Identität von Benutzern und Geräten überwachen und erkennen, ob ein Benutzer oder ein Gerät berechtigt ist, auf bestimmte Ressourcen zuzugreifen. Ein Beispiel für eine Next-Gen Firewall ist die Palo Alto Networks PA-220.&lt;/p&gt;

&lt;p&gt;Ein Beispiel für die Konfiguration einer Next-Gen Firewall ist die Einrichtung von App-ID-Regeln auf einer Palo Alto Networks PA-220:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hocon"&gt;&lt;code&gt;&lt;span class="l"&gt;rulebase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;security&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;rules&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="l"&gt;rule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;allow-web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;source-zone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;trust&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;destination-zone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;untrust&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;web-browsing&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;allow&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diese Regel erlaubt den Zugriff auf Web-Seiten von dem &lt;code&gt;trust&lt;/code&gt;-Zonen auf die &lt;code&gt;untrust&lt;/code&gt;-Zone.&lt;/p&gt;

&lt;p&gt;Meine Einschätzung: Next-Gen Firewalls bieten eine umfassende Sicherheitslösung für Netzwerke. Sie können nicht nur den Datenverkehr kontrollieren, sondern auch die Identität von Benutzern und Geräten überwachen und erkennen, ob ein Benutzer oder ein Gerät berechtigt ist, auf bestimmte Ressourcen zuzugreifen.&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 Einrichtung von Regeln. Es ist wichtig, dass die Regeln sorgfältig geplant und getestet werden, um sicherzustellen, dass sie den erforderlichen Schutz bieten. Ein weiterer Fehler ist die mangelnde Überwachung von Firewalls. Es ist wichtig, dass Firewalls regelmäßig überwacht werden, um sicherzustellen, dass sie ordnungsgemäß funktionieren.&lt;/p&gt;

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

&lt;p&gt;In diesem Artikel haben wir uns mit den Unterschieden zwischen Stateful Firewalls und Next-Gen Firewalls beschäftigt. Wir haben gesehen, dass Stateful Firewalls ein wichtiger Bestandteil jeder Netzwerkinfrastruktur sind, aber sie reichen nicht aus, um moderne Angriffe abzuwehren. Next-Gen Firewalls bieten eine umfassende Sicherheitslösung für Netzwerke und können nicht nur den Datenverkehr kontrollieren, sondern auch die Identität von Benutzern und Geräten überwachen.&lt;/p&gt;

&lt;p&gt;Dein nächster Schritt sollte sein, Ihre Firewall-Infrastruktur zu überprüfen und zu sicherzustellen, dass sie den erforderlichen Schutz bietet. Wenn Sie noch keine Next-Gen Firewall haben, sollten Sie in Betracht ziehen, eine zu implementieren. Wenn Sie bereits eine Next-Gen Firewall haben, sollten Sie sicherstellen, dass sie ordnungsgemäß konfiguriert und überwacht wird.&lt;/p&gt;

</description>
      <category>firewalltuning</category>
      <category>statefulfirewall</category>
      <category>nextgenfirewall</category>
      <category>netzwerksicherheit</category>
    </item>
    <item>
      <title>Edge Computing mit LoRaWAN: Sensordaten lokal erfassen und auswerten</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Tue, 16 Jun 2026 18:00:05 +0000</pubDate>
      <link>https://dev.to/uhltak/edge-computing-mit-lorawan-sensordaten-lokal-erfassen-und-auswerten-37h0</link>
      <guid>https://dev.to/uhltak/edge-computing-mit-lorawan-sensordaten-lokal-erfassen-und-auswerten-37h0</guid>
      <description>&lt;h1&gt;
  
  
  Hook – Warum das Wetter‑IoT nicht mehr in der Cloud wohnen darf
&lt;/h1&gt;

&lt;p&gt;Stellen Sie sich vor, Sie betreiben ein Weingut in der Pfalz. Ihre Sensoren messen Bodenfeuchte, Temperatur und Blattklinik‑Druck – rund um die Uhr. Dann platzt plötzlich die Internetverbindung, das Weingut liegt im Nebel, und Sie haben keinen einzigen Wert mehr. Das ist kein Katastrophen‑Szenario, das ist die Realität in vielen ländlichen Betrieben. &lt;strong&gt;Edge Computing mit LoRaWAN&lt;/strong&gt; ist die Antwort: Daten werden dort erfasst, wo sie entstehen, und bleiben lokal – nur das Wesentliche wird nach außen geschoben.&lt;/p&gt;

&lt;p&gt;In diesem Artikel zeige ich Ihnen Schritt für Schritt, wie Sie ein komplett cloud‑freies LoRaWAN‑Edge‑Setup aufbauen. Ich verwende ausschließlich Open‑Source‑Tools, gebe drei echte Befehls‑Beispiele und bewerte jedes Modul kritisch. Am Ende stehen Sie mit einem funktionierenden System, das ohne teure Cloud‑Abonnements auskommt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Was ist Edge Computing mit LoRaWAN?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Erklärung&lt;/strong&gt;: Edge Computing bedeutet, dass die Datenverarbeitung so nah wie möglich an der Quelle stattfindet. Statt jeden Messwert in die Cloud zu schicken, bauen wir eine Mini‑Cloud im eigenen Netzwerk. LoRaWAN (Long Range Wide Area Network) liefert die Funk‑Schicht, die für kilometerweite, energieeffiziente Übertragungen optimiert ist – perfekt für Batteriebetriebene Sensoren.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beispiel&lt;/strong&gt;: Ein Feld‑Sensor (z. B. ein Arduino‑Board mit einem DHT22) sendet alle 15 Minuten einen Paket‑Payload von 12 Byte über LoRaWAN. Der lokale Gateway empfängt das Paket, dekodiert es und leitet den Messwert über MQTT an einen InfluxDB‑Server weiter. Dort werden die Daten sofort in einer Zeitreihendatenbank gespeichert – bereit für Grafana‑Dashboards, die Sie im Pausenraum anschauen können.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Einschätzung&lt;/strong&gt;: Viele Unternehmen glauben, LoRaWAN sei ausschließlich für die Cloud gedacht. In Wahrheit ist das Protokoll völlig unabhängig von einem Cloud‑Provider. Die eigentliche Herausforderung liegt im &lt;strong&gt;Edge‑Orchestrator&lt;/strong&gt; – die Logik, die die Daten lokal verarbeitet, filtert und speichert. Wenn Sie das richtig bauen, sparen Sie nicht nur Bandbreite, sondern erhalten auch volle Datenhoheit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hardware‑Setup: LoRaWAN‑Gateway und Sensoren
&lt;/h2&gt;

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

&lt;p&gt;Ein funktionierendes LoRaWAN‑Netzwerk besteht aus mindestens einem &lt;strong&gt;Gateway&lt;/strong&gt; (Empfänger) und einer oder mehreren &lt;strong&gt;Endgeräten&lt;/strong&gt; (Sensoren). Für ein Hobby‑ bis Mittelstand‑Projekt reicht ein Raspberry Pi 4 kombiniert mit einem RAK2245‑LoRa‑Hat. Der Gateway‑Software‑Stack ist &lt;strong&gt;ChirpStack&lt;/strong&gt; – ein komplett Open‑Source‑Server, der sowohl den Netzwerk‑Server (LoRaWAN‑Server) als auch den Application‑Server (JSON‑API) bereitstellt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;1 – Gateway‑Installation
&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. Raspberry Pi OS aktualisieren&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt full-upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# 2. git holen und ChirpStack klonen&lt;/span&gt;
git clone https://github.com/chirpstack/chirpstack-gateway-bridge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;chirpstack-gateway-bridge

&lt;span class="c"&gt;# 3. Go‑Toolchain installieren (ChirpStack ist in Go geschrieben)&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; golang

&lt;span class="c"&gt;# 4. Builden und Service einrichten&lt;/span&gt;
make build
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;chirpstack-gateway-bridge /usr/local/bin/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;systemd/chirpstack-gateway-bridge.service /etc/systemd/system/
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;chirpstack-gateway-bridge
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start chirpstack-gateway-bridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Die Konfiguration liegt in &lt;code&gt;/etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml&lt;/code&gt;. Ein Minimal‑Eintrag für das RAK2245 sieht so aus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[network_server]&lt;/span&gt;
  &lt;span class="py"&gt;server_address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"127.0.0.1:8000"&lt;/span&gt;

&lt;span class="nn"&gt;[gateway]&lt;/span&gt;
  &lt;span class="py"&gt;semtech_udp.bind&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.0.0.0:1700"&lt;/span&gt;
  &lt;span class="c"&gt;# Wenn Sie das RAK2245 im SPI‑Mode laufen haben&lt;/span&gt;
  &lt;span class="py"&gt;concentrator.type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"rak2245"&lt;/span&gt;
  &lt;span class="py"&gt;concentrator.spi_bus&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="py"&gt;concentrator.spi_cs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;: Der &lt;code&gt;semtech_udp.bind&lt;/code&gt;‑Port 1700 ist der Standard‑Port, den LoRa‑Node‑Boards zur Verfügung stellen. Der Gateway‑Bridge übersetzt das Semtech‑UDP‑Protokoll in MQTT‑Nachrichten für den ChirpStack‑Network‑Server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;2 – Sensor‑Firmware (Arduino + Dragino Lora Shield)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Arduino.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;SPI.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;LoRa.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;DHT.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#define DHTPIN 2
#define DHTTYPE DHT22
&lt;/span&gt;&lt;span class="n"&gt;DHT&lt;/span&gt; &lt;span class="nf"&gt;dht&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DHTPIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DHTTYPE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;dht&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;LoRa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;868E6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&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;"LoRa init failed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&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;"LoRa init ok"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dht&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readHumidity&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dht&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readTemperature&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;","&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;LoRa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beginPacket&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;LoRa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;LoRa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endPacket&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&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;"Sent: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;900000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 15 min&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Der Sketch sendet &lt;code&gt;temperature,humidity&lt;/code&gt; als CSV‑Payload. Auf dem Gateway‑Bridge wird das als MQTT‑Message &lt;code&gt;application/1/device/12345/rx&lt;/code&gt; bereitgestellt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Der größte Stolperstein ist das &lt;strong&gt;Timing&lt;/strong&gt; zwischen LoRa‑Modul und Gateway. Viele Hobby‑Entwickler setzen auf den Semtech‑UDP‑Relay, vergessen aber, dass das UDP‑Packet &lt;strong&gt;nicht&lt;/strong&gt; verschlüsselt ist. Für Produktionsumgebungen sollten Sie LoRaWAN‑v1.1‑Security (App‑Key / Nwk‑Key) aktivieren – ChirpStack macht das per Simple‑JSON-Konfiguration. In Testumgebungen reicht das hier gezeigte Minimal‑Setup völlig aus, um das Datenfluss‑Skelett zu verstehen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lokale Datenpipeline: MQTT → InfluxDB → Grafana
&lt;/h2&gt;

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

&lt;p&gt;Sobald das Gateway die Pakete empfängt, leiten wir sie über &lt;strong&gt;Mosquitto&lt;/strong&gt; (lokaler MQTT‑Broker) an &lt;strong&gt;InfluxDB&lt;/strong&gt; (Zeitreihen‑DB) weiter. Grafana visualisiert die Daten. Diese Kette ist komplett offline, kann aber bei Bedarf über ein VPN mit dem Unternehmensnetz verbunden werden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;3 – Mosquitto Installation &amp;amp; Konfiguration
&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; mosquitto mosquitto-clients
&lt;span class="c"&gt;# Öffentliche Zugriffe deaktivieren (nur localhost)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;gt; /etc/mosquitto/conf.d/local.conf &amp;lt;&amp;lt;EOF
listener 1883 127.0.0.1
allow_anonymous false
password_file /etc/mosquitto/passwd
EOF'&lt;/span&gt;
&lt;span class="c"&gt;# Benutzer anlegen&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;mosquitto_passwd &lt;span class="nt"&gt;-b&lt;/span&gt; /etc/mosquitto/passwd edgeuser edgepassword
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mosquitto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ChirpStack wird nun so konfiguriert, dass er die MQTT‑Messages an &lt;code&gt;localhost:1883&lt;/code&gt; pushen kann. In der &lt;code&gt;application_server.toml&lt;/code&gt; setzen Sie:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[application_server.integration.mqtt]&lt;/span&gt;
  &lt;span class="py"&gt;server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tcp://127.0.0.1:1883"&lt;/span&gt;
  &lt;span class="py"&gt;username&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"edgeuser"&lt;/span&gt;
  &lt;span class="py"&gt;password&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"edgepassword"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;4 – InfluxDB + Python‑Writer
&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;# InfluxDB 2.x installieren (Debian‑Paket)&lt;/span&gt;
wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://repos.influxdata.com/influxdb.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;span class="nb"&gt;source&lt;/span&gt; /etc/os-release
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"deb https://repos.influxdata.com/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION_CODENAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/influxdb.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&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; influxdb2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; influxdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jetzt schreiben wir ein kurzes Python‑Script, das die MQTT‑Messages abonniert und direkt in InfluxDB speichert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;paho.mqtt.client&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;mqtt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;influxdb_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InfluxDBClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WritePrecision&lt;/span&gt;

&lt;span class="n"&gt;INFLUX_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8086&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;ORG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-org&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;BUCKET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;edge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InfluxDBClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;INFLUX_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ORG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;write_api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;write_options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;batch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sensor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;field1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;humidity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;WritePrecision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;write_api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BUCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stored &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mqttc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mqtt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;mqttc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;username_pw_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;edgeuser&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;edgepassword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mqttc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;on_message&lt;/span&gt;
&lt;span class="n"&gt;mqttc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mqttc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/1/device/+/rx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mqttc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loop_forever&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;5 – Grafana Dashboard
&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; grafana
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; grafana-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Grafana fügen Sie einen &lt;strong&gt;InfluxDB‑Data‑Source&lt;/strong&gt; hinzu (URL &lt;code&gt;http://localhost:8086&lt;/code&gt;, Token aus vorherigem Schritt) und erstellen ein Dashboard mit zwei Panels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temperatur&lt;/strong&gt; – Query: &lt;code&gt;from(bucket:"edge") |&amp;gt; range(start: -1h) |&amp;gt; filter(fn: (r) =&amp;gt; r._field == "temperature")&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Luftfeuchte&lt;/strong&gt; – gleiche Query, Feld &lt;code&gt;humidity&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;Die Kombination aus Mosquitto + InfluxDB + Grafana lässt sich innerhalb von &lt;strong&gt;2 Stunden&lt;/strong&gt; auf einem einzelnen Raspberry Pi aufsetzen. Die häufigsten Fehler sind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ACL‑Fehler&lt;/strong&gt; im MQTT‑Broker – vergessen, &lt;code&gt;allow_anonymous false&lt;/code&gt; zu setzen, führt zu unverschlüsseltem Datenfluss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token‑Verfall&lt;/strong&gt; in InfluxDB 2.x – wenn Sie das Token einmal generieren und vergessen, das Ablaufdatum zu prüfen, bricht das Python‑Writer‑Script nach 30 Tagen ab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamp‑Mismatches&lt;/strong&gt; – InfluxDB erwartet UTC‑Zeit; das Python‑Script muss &lt;code&gt;datetime.utcnow()&lt;/code&gt; verwenden, sonst erscheinen die Werte „in der Zukunft“ und werden verworfen.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sicherheit &amp;amp; Firmware‑Management
&lt;/h2&gt;

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

&lt;p&gt;Edge‑Umgebungen dürfen nicht die vergessene „keine Sicherheit“‑Mentalität tragen. LoRaWAN selbst bietet &lt;strong&gt;AES‑128‑End‑to‑End‑Verschlüsselung&lt;/strong&gt;. Zusätzlich sollten Sie MQTT über TLS (Port 8883) betreiben und OTA‑Updates für Arduino‑Boards planen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;6 – TLS für Mosquitto
&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; openssl
&lt;span class="c"&gt;# Zertifikat + Schlüssel generieren (self‑signed)&lt;/span&gt;
openssl req &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-days&lt;/span&gt; 365 &lt;span class="nt"&gt;-nodes&lt;/span&gt; &lt;span class="nt"&gt;-out&lt;/span&gt; /etc/mosquitto/certs/server.crt &lt;span class="nt"&gt;-keyout&lt;/span&gt; /etc/mosquitto/certs/server.key

&lt;span class="c"&gt;# mosquitto.conf erweitern&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cat &amp;gt;&amp;gt; /etc/mosquitto/conf.d/tls.conf &amp;lt;&amp;lt;EOF
listener 8883
cafile /etc/mosquitto/certs/server.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate false
allow_anonymous false
password_file /etc/mosquitto/passwd
EOF'&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mosquitto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Beispiel&amp;nbsp;7 – OTA‑Update über LoRaWAN (ChirpStack)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Im ChirpStack‑UI aktivieren Sie das &lt;strong&gt;Device‑Profile&lt;/strong&gt; „Enable OTA”.&lt;/li&gt;
&lt;li&gt;Laden Sie das neue Firmware‑Image (&lt;code&gt;firmware.bin&lt;/code&gt;) in das &lt;strong&gt;OTA‑Storage&lt;/strong&gt; (z. B. ein lokaler MinIO‑Bucket).&lt;/li&gt;
&lt;li&gt;Triggern Sie ein Downlink‑Job via API:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://localhost:8080/api/device/12345/queue &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"payload":"$(base64 -w 0 firmware.bin)"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Das Gerät erhält das Downlink‑Package, schreibt den Flash neu und startet automatisch neu – ohne menschliches Eingreifen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Einschätzung
&lt;/h3&gt;

&lt;p&gt;TLS für MQTT ist heute ein &lt;strong&gt;Muss&lt;/strong&gt;, nicht optional. Der Aufwand für ein selbst‑signiertes Zertifikat ist minimal, aber er verhindert die üblichen Man‑in‑the‑Middle‑Gefahren. OTA‑Updates über LoRaWAN sind überraschend zuverlässig, solange Sie den &lt;strong&gt;LoRaWAN‑Data‑Rate (DR)&lt;/strong&gt; passend wählen (z. B. DR 5 für 125 kHz‑Band). Ein zu hoher DR führt zu Paketverlusten, weil das Downlink‑Fenster zu kurz ist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Häufige Fehler und wie man sie vermeidet
&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;Lösung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ungültige LoRa‑Frequency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keine Pakete im MQTT‑Log&lt;/td&gt;
&lt;td&gt;Prüfen Sie die &lt;strong&gt;EU868&lt;/strong&gt;‑Einstellung (oder US915) in &lt;code&gt;chirpstack-gateway-bridge.toml&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MQTT‑ACL fehlt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;„Connection refused" beim Python‑Script&lt;/td&gt;
&lt;td&gt;Stellen Sie sicher, dass &lt;code&gt;allow_anonymous false&lt;/code&gt; und ein gültiges Passwort gesetzt sind.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;InfluxDB‑Write‑Fehler&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;„unauthorized” im Log&lt;/td&gt;
&lt;td&gt;Token erneuern, Berechtigungen (&lt;code&gt;write&lt;/code&gt;) prüfen.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grafana‑Dashboard zeigt leere Graphen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keine Daten in InfluxDB‑Bucket&lt;/td&gt;
&lt;td&gt;Prüfen Sie den Timestamp‑Format (UTC) und den Bucket‑Namen.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OTA‑Package zu groß&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Downlink‑Abbruch&lt;/td&gt;
&lt;td&gt;Fragmentieren Sie das Firmware‑Image (max 51 Bytes pro LoRa‑Payload) und nutzen Sie &lt;strong&gt;Fragmented‑OTA&lt;/strong&gt; von ChirpStack.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Schnell‑Check‑Liste
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;sudo lora-packet-log&lt;/code&gt; – sehen, ob Pakete ankommen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mosquitto_sub -t "#" -v&lt;/code&gt; – prüfen, ob MQTT‑Messages erscheinen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;influx query "from(bucket:\"edge\") |&amp;gt; range(start: -1h)"&lt;/code&gt; – Daten in InfluxDB?&lt;/li&gt;
&lt;li&gt;Grafana‑Dashboard öffnen – aktuelle Werte?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Fazit – Ihr erster Edge‑LoRaWAN‑Prototyp in 48 Stunden
&lt;/h2&gt;

&lt;p&gt;Sie haben nun:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Einen &lt;strong&gt;lokalen LoRaWAN‑Gateway&lt;/strong&gt; (Raspberry Pi + RAK2245) mit ChirpStack installiert.&lt;/li&gt;
&lt;li&gt;Ein &lt;strong&gt;Arduino‑Node&lt;/strong&gt; programmiert, das Temperatur‑ und Feuchtigkeitsdaten per LoRa sendet.&lt;/li&gt;
&lt;li&gt;Eine &lt;strong&gt;vollständig automatisierte Datenpipeline&lt;/strong&gt; (MQTT → InfluxDB → Grafana) aufgebaut.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sicherheit&lt;/strong&gt; über TLS und LoRaWAN‑Verschlüsselung implementiert sowie &lt;strong&gt;OTA‑Updates&lt;/strong&gt; ermöglicht.&lt;/li&gt;
&lt;li&gt;Die häufigsten Stolpersteine identifiziert und mit konkreten Konfigurations‑Snippets behoben.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Nächster Schritt&lt;/strong&gt;: Skalieren Sie das Setup auf mehrere Felder, setzen Sie &lt;strong&gt;Node‑Red&lt;/strong&gt; als lokales Orchestrierungs‑Tool ein und binden Sie optional &lt;strong&gt;Prometheus&lt;/strong&gt; für Metriken ein. So erhalten Sie ein robustes Edge‑IoT‑Ökosystem, das komplett ohne Cloud‑Abhängigkeiten auskommt – und das alles unter Ihrer vollen Datenhoheit.&lt;/p&gt;

&lt;p&gt;Viel Spaß beim Basteln, und denken Sie immer daran: &lt;strong&gt;Edge bedeutet Kontrolle, nicht Kompromiss&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>edgecomputing</category>
      <category>lorawan</category>
      <category>iot</category>
      <category>sensordaten</category>
    </item>
    <item>
      <title>Firewall-Tuning: Stateful vs. Next-Gen - Die richtige Wahl</title>
      <dc:creator>Uhltak Therestismysecret</dc:creator>
      <pubDate>Tue, 16 Jun 2026 06:00:03 +0000</pubDate>
      <link>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-die-richtige-wahl-2hc1</link>
      <guid>https://dev.to/uhltak/firewall-tuning-stateful-vs-next-gen-die-richtige-wahl-2hc1</guid>
      <description>&lt;h1&gt;
  
  
  Firewall-Tuning: Stateful vs. Next-Gen Firewall – wann reicht was und wann nicht?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Einleitung
&lt;/h2&gt;

&lt;p&gt;Stellen Sie sich vor, Sie sind der Sicherheitschef einer Firma, und Ihr Unternehmen ist wie ein Haus. Die Firewall ist die Tür, die den Zugang zum Haus kontrolliert. Eine gute Firewall sorgt dafür, dass nur autorisierte Personen eingelassen werden und dass potenzielle Angreifer draußen bleiben. Aber wie wählt man die richtige Firewall aus? Soll man eine Stateful-Firewall oder eine Next-Gen-Firewall verwenden?&lt;/p&gt;

&lt;h2&gt;
  
  
  Stateful-Firewalls
&lt;/h2&gt;

&lt;p&gt;Eine Stateful-Firewall ist wie ein Türsteher, der jeden, der hereinkommt, kennt. Sie überwacht den Zustand jeder Verbindung und kann somit erkennen, ob eine Verbindung autorisiert ist oder nicht. Ein Beispiel für eine Stateful-Firewall ist die Cisco ASA. Sie kann verwendet werden, um den Zugriff auf bestimmte Ressourcen im Netzwerk zu steuern.&lt;br&gt;
Meine Einschätzung: Stateful-Firewalls sind ausreichend für kleine bis mittelgroße Unternehmen, die keine komplexen Netzwerkumgebungen haben.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next-Gen-Firewalls
&lt;/h2&gt;

&lt;p&gt;Eine Next-Gen-Firewall ist wie ein High-Tech-Türsteher, der nicht nur jeden kennt, der hereinkommt, sondern auch erkennt, was sie tun. Sie bietet erweiterte Funktionen wie Deep Packet Inspection, Anti-Malware und Sandboxing. Ein Beispiel für eine Next-Gen-Firewall ist die Palo Alto Networks Next-Generation Firewall. Sie kann verwendet werden, um den Zugriff auf bestimmte Ressourcen im Netzwerk zu steuern und um potenzielle Bedrohungen zu erkennen.&lt;br&gt;
Meine Einschätzung: Next-Gen-Firewalls sind geeignet für große Unternehmen oder Organisationen mit komplexen Netzwerkumgebungen, die einen hohen Schutzbedarf haben.&lt;/p&gt;

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

&lt;p&gt;Ein häufiger Fehler ist die Auswahl einer Firewall, die nicht auf die spezifischen Bedürfnisse des Unternehmens abgestimmt ist. Beispielsweise kann eine Stateful-Firewall für ein großes Unternehmen mit komplexen Netzwerkumgebungen nicht ausreichend sein. Ein weiterer Fallstrick ist die mangelnde Konfiguration und Wartung der Firewall. Wenn die Firewall nicht richtig konfiguriert ist, kann sie nicht effektiv schützen.&lt;/p&gt;

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

&lt;p&gt;Dein nächster Schritt sollte sein, Ihre Netzwerkumgebung zu analysieren und Ihre Sicherheitsanforderungen zu definieren. Dann können Sie die richtige Firewall auswählen, ob Stateful oder Next-Gen. Es ist auch wichtig, die Firewall richtig zu konfigurieren und zu warten, um einen effektiven Schutz zu gewährleisten. Mit der richtigen Firewall können Sie Ihr Unternehmen vor potenziellen Bedrohungen schützen und Ihre Daten sicher halten.&lt;/p&gt;

</description>
      <category>firewall</category>
      <category>stateful</category>
      <category>nextgen</category>
      <category>netzwerksicherheit</category>
    </item>
  </channel>
</rss>
