<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>NDM Blog</title>
        <link>https://docs.ndm-cli.dev/de/blog</link>
        <description>NDM Blog</description>
        <lastBuildDate>Sat, 31 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>de</language>
        <item>
            <title><![CDATA[Update, der Logger]]></title>
            <link>https://docs.ndm-cli.dev/de/blog/update-logger</link>
            <guid>https://docs.ndm-cli.dev/de/blog/update-logger</guid>
            <pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[{/ truncate /}]]></description>
            <content:encoded><![CDATA[
<p>Einer der zentralen Bestandteile von NDM ist es, zu beobachten, was ein analysiertes npm-Paket während seiner Ausführung tatsächlich macht.
Wir möchten Informationen über gestartete Prozesse, Dateisystemzugriffe, Netzwerkverbindungen und potenziell sensible Daten sammeln.</p>
<p>Klingt eigentlich ziemlich einfach, oder?</p>
<p>Tatsächlich hat sich das Ganze als deutlich komplizierter herausgestellt als ursprünglich gedacht.
Wir haben bereits mehrere Ansätze ausprobiert und sind mittlerweile bei einer Lösung angekommen, die sich ziemlich stark von unserem ursprünglichen Plan unterscheidet.</p>
<h2 class="anchor anchorTargetStickyNavbar_Hh9E" id="unser-ursprünglicher-plan">Unser ursprünglicher Plan<a href="https://docs.ndm-cli.dev/de/blog/update-logger#unser-urspr%C3%BCnglicher-plan" class="hash-link" aria-label="Direkter Link zur Unser ursprünglicher Plan" title="Direkter Link zur Unser ursprünglicher Plan" translate="no">​</a></h2>
<p>Unser erster Ansatz war die Verwendung von <a href="https://tetragon.io/" target="_blank" rel="noopener noreferrer" class=""><strong>Tetragon</strong></a>, einem auf eBPF basierenden Tool zur Überwachung und Absicherung von Systemaktivitäten zur Laufzeit.</p>
<p>Tetragon in unserer Docker-Umgebung zum Laufen zu bringen, war zunächst kein Problem. Der Container startete erfolgreich und auch unsere Policies wurden ohne Konfigurationsfehler akzeptiert.</p>
<p>Die eigentlichen Probleme begannen erst, als wir die Ereigniserfassung testen wollten.</p>
<p>Unsere Policies lieferten nicht die erwarteten Events.
Besonders die Einschränkung auf Prozesse innerhalb unserer Sandbox bereitete Schwierigkeiten.
Die zunächst verwendeten Mechanismen zur Containerauswahl funktionierten in unserer Docker-basierten Umgebung nicht wie erwartet, da wir kein Kubernetes einsetzen.
(<em>Tetraogn ist für Kubernetes genaut</em>)</p>
<p>Das bedeutete: Tetragon lief zwar, aber wir konnten nicht zuverlässig die Informationen sammeln, die wir für NDM benötigten.</p>
<p>Anstatt noch mehr Zeit in einen Ansatz zu investieren, der nicht wie gewünscht funktionierte, entschieden wir uns deshalb für unsere zweite Option.</p>
<h2 class="anchor anchorTargetStickyNavbar_Hh9E" id="plan-b">Plan „B“<a href="https://docs.ndm-cli.dev/de/blog/update-logger#plan-b" class="hash-link" aria-label="Direkter Link zur Plan „B“" title="Direkter Link zur Plan „B“" translate="no">​</a></h2>
<p>Natürlich hatten wir einen Plan B.</p>
<p>Wir entfernten den Tetragon-Container aus unserer Docker-Compose-Konfiguration und begannen mit Tests von <a href="https://falco.org/" target="_blank" rel="noopener noreferrer" class=""><strong>Falco</strong></a>.</p>
<p>Diesmal sah die Sache schon deutlich besser aus. Wir konnten die Containerauswahl konfigurieren und unsere eigenen Regeln lieferten endlich die gewünschten Events.</p>
<p>Wir konnten verschiedene Arten von Aktivitäten erfolgreich erkennen:</p>
<ul>
<li class=""><strong>Prozessaktivitäten:</strong> Erkennung von gestarteten Prozessen innerhalb der Sandbox.</li>
<li class=""><strong>Dateisystemaktivitäten:</strong> Beobachtung von Dateizugriffen, dem Erstellen und Verändern von Dateien.</li>
<li class=""><strong>Netzwerkaktivitäten:</strong> Erkennung ausgehender Netzwerkverbindungen.</li>
</ul>
<p>Auch beim CPU-Verbrauch schnitt Falco in unseren Tests besser ab als unser vorheriger Tetragon-Aufbau.</p>
<p>Zum ersten Mal hatten wir einen funktionierenden Proof of Concept, der einen Großteil der benötigten Informationen erfassen konnte.</p>
<p>Allerdings gab es noch ein großes Problem: unsere Sandbox-Runtime.</p>
<h2 class="anchor anchorTargetStickyNavbar_Hh9E" id="gvisor">gVisor<a href="https://docs.ndm-cli.dev/de/blog/update-logger#gvisor" class="hash-link" aria-label="Direkter Link zur gVisor" title="Direkter Link zur gVisor" translate="no">​</a></h2>
<p>NDM führt potenziell unsichere Pakete nicht einfach in gewöhnlichen Docker-Containern aus.
Stattdessen verwenden wir <a href="https://gvisor.dev/" target="_blank" rel="noopener noreferrer" class=""><strong>gVisor</strong></a> als zusätzliche Isolationsschicht.</p>
<h3 class="anchor anchorTargetStickyNavbar_Hh9E" id="aber-was-genau-ist-gvisor-eigentlich">Aber was genau ist gVisor eigentlich?<a href="https://docs.ndm-cli.dev/de/blog/update-logger#aber-was-genau-ist-gvisor-eigentlich" class="hash-link" aria-label="Direkter Link zur Aber was genau ist gVisor eigentlich?" title="Direkter Link zur Aber was genau ist gVisor eigentlich?" translate="no">​</a></h3>
<p>Im Gegensatz zu herkömmlichen Containern, die hauptsächlich auf Linux-Kernel-Mechanismen wie Namespaces und cgroups setzen, bringt gVisor einen zusätzlichen Kernel im Userspace mit.
Dieser wird <em>Sentry</em> genannt.</p>
<p>Das bedeutet, dass Systemaufrufe von Anwendungen innerhalb der Sandbox von gVisor abgefangen und verarbeitet werden, anstatt direkt an den Host-Kernel weitergegeben zu werden.</p>
<p>Aus Sicherheitssicht ist das natürlich ein großer Vorteil.
Für klassische Monitoring-Tools entsteht dadurch allerdings ein Problem.</p>
<p>Falco beobachtet Systemaktivitäten normalerweise über Events, die vom Host-Kernel erzeugt werden.
Bei gVisor werden viele Vorgänge innerhalb der Sandbox jedoch von Sentry verarbeitet. Diese sind für Falco deshalb nicht auf dieselbe Weise sichtbar wie bei gewöhnlichen Containern.</p>
<p>Dadurch konnte Falco nicht den vollständigen Einblick in die Aktivitäten eines Pakets liefern, den wir für NDM benötigen.</p>
<div class="theme-admonition theme-admonition-warning admonition_RRag alert alert--warning"><div class="admonitionHeading_D_CJ"><span class="admonitionIcon_FrdB"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Problem</div><div class="admonitionContent_j_8t"><p>Unsere Monitoring-Lösung muss beobachten können, was <em>innerhalb</em> der Sandbox passiert, und nicht nur, was auf dem Host-System geschieht.
Die alleinige Überwachung des Host-Kernels reicht für unseren Aufbau nicht aus.</p></div></div>
<p>Wir hätten unsere Sandbox-Architektur natürlich überdenken können. Das hätte allerdings bedeutet, einen wichtigen Bestandteil des Sicherheitskonzepts von NDM infrage zu stellen.</p>
<p>Stattdessen suchten wir nach einer Lösung, die direkt mit gVisor zusammenarbeitet.</p>
<h2 class="anchor anchorTargetStickyNavbar_Hh9E" id="eine-neue-hoffnung">Eine neue Hoffnung<a href="https://docs.ndm-cli.dev/de/blog/update-logger#eine-neue-hoffnung" class="hash-link" aria-label="Direkter Link zur Eine neue Hoffnung" title="Direkter Link zur Eine neue Hoffnung" translate="no">​</a></h2>
<p>Hier kommt <strong>SecCheck</strong> ins Spiel.</p>
<p>SecCheck ist ein direkt in gVisor integrierter Monitoring-Mechanismus.
Damit kann gVisor sicherheitsrelevante Ereignisse aus der Sandbox über einen eigenen Event-Stream bereitstellen.</p>
<p>Und genau das haben wir gesucht!</p>
<p>Anstatt die Aktivitäten innerhalb der Sandbox von außen über den Host-Kernel beobachten zu müssen, können wir die Monitoring-Funktionen nutzen, die gVisor bereits selbst mitbringt.</p>
<p>Das bedeutet außerdem, dass wir weder unsere bestehende Sandbox-Architektur aufgeben noch eine zusätzliche Monitoring-Schicht einführen müssen, die möglicherweise gar nicht alle relevanten Vorgänge sehen kann.</p>
<div class="theme-admonition theme-admonition-tip admonition_RRag alert alert--success"><div class="admonitionHeading_D_CJ"><span class="admonitionIcon_FrdB"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Warum SecCheck vielversprechend ist</div><div class="admonitionContent_j_8t"><ul>
<li class=""><strong>Direkte gVisor-Integration:</strong> Die Events stammen direkt von der Komponente, die für die Isolation der Sandbox verantwortlich ist.</li>
<li class=""><strong>Bessere Sichtbarkeit:</strong> Wir können Informationen über Aktivitäten erfassen, die bei einer herkömmlichen Überwachung auf Host-Ebene möglicherweise nicht sichtbar wären.</li>
<li class=""><strong>Passt zu unserer Architektur:</strong> Der Event-Stream kann von einem separaten Dienst empfangen und in unser bestehendes Django-Backend integriert werden.</li>
</ul></div></div>
<p>Mit der Implementierung der Kommunikation zwischen gVisor und unserem Backend haben wir bereits begonnen. Erste Tests haben bestätigt, dass gVisor unseren konfigurierten SecCheck-Socket erreicht.</p>
<p>Bis wir alle relevanten Events zuverlässig erfassen, verarbeiten und speichern können, liegt allerdings noch etwas Arbeit vor uns.
Insbesondere müssen wir mehrere gleichzeitig laufende Sandboxes unterstützen und sicherstellen, dass die Events immer der richtigen Analyse zugeordnet werden.</p>
<p><strong>Ganz am Ziel sind wir also noch nicht, aber diesmal scheint die Richtung zu stimmen.</strong></p>
<p>Weitere Details zur technischen Umsetzung werden in unserer Dokumentation folgen, sobald alles wie vorgesehen funktioniert.</p>]]></content:encoded>
            <category>update</category>
            <category>news</category>
            <category>NDM</category>
        </item>
        <item>
            <title><![CDATA[Update]]></title>
            <link>https://docs.ndm-cli.dev/de/blog/first-update</link>
            <guid>https://docs.ndm-cli.dev/de/blog/first-update</guid>
            <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[{/ truncate /}]]></description>
            <content:encoded><![CDATA[
<div class="theme-admonition theme-admonition-tip admonition_RRag alert alert--success"><div class="admonitionHeading_D_CJ"><span class="admonitionIcon_FrdB"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Woran wir gerade arbeiten</div><div class="admonitionContent_j_8t"><p>Wir richten derzeit einen <strong>Logger</strong> für die NDM-Sandbox ein.</p><p>Die Sandbox ist bereits aktiv, und wir extrahieren die Funktionen aus dem Paket. Diese Funktionen können wir nun ausführen.</p><p>Wir benötigen lediglich einen Logger, um nachvollziehen zu können, welche Vorgänge innerhalb des Pakets ablaufen.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Hh9E" id="außerdem-erwähnenswert">Außerdem erwähnenswert:<a href="https://docs.ndm-cli.dev/de/blog/first-update#au%C3%9Ferdem-erw%C3%A4hnenswert" class="hash-link" aria-label="Direkter Link zur Außerdem erwähnenswert:" title="Direkter Link zur Außerdem erwähnenswert:" translate="no">​</a></h2>
<p>Der Server arbeitet asynchron. Aktuell testen wir die Belastungsgrenzen des Servers.</p>
<p>Zudem haben wir ein Tool entwickelt, das die Erstellung weiterer Sandboxen bei Bedarf steuert: Wenn beispielsweise zwei Nutzer gleichzeitig eine Anfrage für dasselbe Paket in derselben Version stellen, wird nur eine einzige Sandbox gestartet – sie wird also von beiden Nutzern gemeinsam genutzt.</p>
<p>Des Weiteren haben wir eine PostgreSQL-Datenbank integriert, damit nicht für jede Anfrage eine neue Sandbox gestartet werden muss. Die Antwort enthält einen Hinweis darauf, ob die Ergebnisse aus dem Cache stammen oder ob sie während der Anfrage in einer Sandbox berechnet wurden.</p>]]></content:encoded>
            <category>update</category>
            <category>news</category>
            <category>NDM</category>
        </item>
        <item>
            <title><![CDATA[Erster Blog Post]]></title>
            <link>https://docs.ndm-cli.dev/de/blog/Erster-Blog-Post</link>
            <guid>https://docs.ndm-cli.dev/de/blog/Erster-Blog-Post</guid>
            <pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[{/ truncate /}]]></description>
            <content:encoded><![CDATA[
<p>Die offiziele
<a href="https://ndm-cli.dev/" target="_blank" rel="noopener noreferrer" class="">NDM-webpage</a></p>
<p>Dies ist der erste NDM Blog Post.</p>
<p>lese die Documetation um zu verstehen was <strong>NDM</strong> ist.</p>
<div class="theme-admonition theme-admonition-info admonition_RRag alert alert--info"><div class="admonitionHeading_D_CJ"><span class="admonitionIcon_FrdB"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_j_8t"><p>Das CLI-Tool ist noch nicht öffentlich</p></div></div>]]></content:encoded>
            <category>Docusaurus</category>
            <category>news</category>
            <category>NDM</category>
        </item>
    </channel>
</rss>