Openvas Authenticated Check: Paket instaliert? (Debian, bind9)

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Authenticated Check: Paket installiert? (Debian, bind9)

Dieser Artikel zeigt eine eigene NASL-VT, die per SSH prüft, ob auf einem Debian-Ziel ein bestimmtes Paket installiert ist – hier bind9. Es ist das Grundmuster jedes credentialed Compliance-Checks: Soll-Vorgabe gegen Ist-Zustand.

Einordnung

Wichtige Abgrenzung zum unauthentifizierten Netzwerk-Probe (z.B. Checkmk auf 6556):

Unauthenticated (Netzwerk-Probe)
  • Scanner verbindet sich zu einem Dienst und liest die Antwort. Kein Login nötig.
Authenticated (credentialed)
  • Scanner loggt sich per SSH ein und fragt das System direkt (hier: dpkg). Nur so

sind Paketstände, Konfigurationen und Dateirechte prüfbar.

Genau dieses Modell nutzen CIS-Benchmarks und IT-Grundschutz-Checks. Der bind9-Check ist die Minimalform davon und damit ideal als Einstieg ins Authenticated Scanning.

Das Skript

Skript anlegen
  • vi debian_bind9_installed.nasl
# debian_bind9_installed.nasl
# Authenticated Check: ist bind9 auf Debian installiert?

if(description)
{
  # Eigene Arc, NICHT die .1.0. (gehört Greenbone). Nur lokal eindeutig.
  script_oid("1.3.6.1.4.1.25623.1.7.6556002");
  script_version("2026-06-24T00:00:00+0000");
  script_tag(name:"creation_date", value:"2026-06-24 09:00:00 +0000 (Tue, 24 Jun 2026)");
  script_tag(name:"last_modification", value:"2026-06-24 09:00:00 +0000 (Tue, 24 Jun 2026)");
  script_name("Debian: bind9 Package Installed (Authenticated)");
  script_category(ACT_GATHER_INFO);
  script_family("General");
  script_copyright("Copyright (C) 2026 Thomas / Xinux");
  script_tag(name:"qod_type", value:"package");
  script_tag(name:"summary", value:"Prüft per SSH, ob das Paket bind9 installiert ist.");

  # Stellt die credentialed SSH-Session bereit und setzt ssh/login/release
  script_dependencies("gather-package-list.nasl");
  script_mandatory_keys("ssh/login/release");
  exit(0);
}

include("ssh_func.inc");

pkg = "bind9";

sock = ssh_login_or_reuse_connection();
if(!sock)
  exit(0);

# dpkg-query: "install ok installed" = wirklich installiert (nicht nur Config-Reste)
cmd = "dpkg-query -W -f='${Status} ${Version}' " + pkg + " 2>/dev/null";
res = ssh_cmd(socket:sock, cmd:cmd);
ssh_close_connection();

if(res && "install ok installed" >< res)
{
  report = "Das Paket '" + pkg + "' ist auf dem Ziel installiert: " + res;
  log_message(port:0, data:report);
  exit(0);
}

exit(0);

Die drei Stellschrauben:

script_dependencies + script_mandatory_keys
  • Die VT läuft nur, wenn der Scanner sich per SSH eingeloggt und ein Linux-Release

erkannt hat. Ohne Credentials passiert nichts – Absicht, kein Fehler.

log_message statt security_message
  • "Paket installiert" ist eine Information, kein Sicherheitsbefund. Dreht man die

Vorgabe um ("bind9 darf NICHT installiert sein"), nimmt man security_message mit einem cvss_base, damit es als Finding mit Severity erscheint.

ssh_cmd
  • Führt das Kommando wörtlich auf dem Ziel aus. Transparent und gut zum Lehren.

Syntax prüfen

Vor dem Deployen linten
  • openvas-nasl-lint debian_bind9_installed.nasl

Deployment ins Feed

Skript ablegen (lesbar für den Scanner-User)
  • sudo install -d -o _gvm -g _gvm -m 0755 /var/lib/openvas/plugins/custom
  • sudo install -o _gvm -g _gvm -m 0644 debian_bind9_installed.nasl /var/lib/openvas/plugins/custom/debian_bind9_installed.nasl
NVTI-Cache neu aufbauen
  • sudo runuser -u _gvm -- openvas --update-vt-info
Scanner neu laden
  • sudo systemctl restart ospd-openvas

Pfad/Username ggf. an die Distro anpassen (plugins_folder in /etc/openvas/openvas.conf prüfen).

Voraussetzung: SSH-Credentials (sonst läuft nichts!)

Das ist der credentialed-spezifische Teil – ohne ihn wird die VT nie eingeplant:

  1. Configuration → Credentials → neues SSH-Login anlegen (User + Passwort oder Key).
  2. Configuration → Targets → dem Ziel dieses SSH-Credential zuweisen.
  3. Eine Scan-Config verwenden, die authenticated Checks enthält (Family General
    bzw. die eigene VT aktiviert).

Erst wenn der SSH-Login beim Scan klappt, ist ssh/login/release gesetzt und die VT wird ausgeführt.

Verifikation

Zuerst von Hand auf dem Ziel gegenprüfen, was die VT erwartet
  • dpkg-query -W -f='${Status} ${Version}' bind9

Kommt "install ok installed ..." zurück, ist das Paket da und die VT muss anschlagen.

Im Scanner
SecInfo → NVTs nach Name oder OID suchen
  • erscheint die VT dort, wurde sie eingelesen.

Stolperfalle: Log-Level im Report

Wichtig beim Testen: Der Treffer kommt über log_message und erscheint im Report mit Severity Log (0.0) – nicht als farbiges Finding. Die Standard- Reportansicht blendet Log-Meldungen oft aus. Wer nur nach "Medium/High" filtert, denkt fälschlich, der Check sei nicht gelaufen.

Lösung
im Report-Filter die Severity-Stufe "Log" einschalten
  • z.B. Filter levels=hmlg (high, medium, low, g=log) setzen.

Cybersec-2 Einordnung

Dieser Check ist die Keimzelle des Authenticated-Scanning-Moduls:

Verallgemeinerung
  • "Ist Paket X installiert" → "ist Dienst Y aktiv", "hat Datei Z die richtigen Rechte",

"ist Kernel-Parameter K gesetzt". Immer dasselbe Muster: SSH-Login, abfragen, gegen eine Vorgabe vergleichen.

Soll/Ist-Logik
  • log_message für "ist da" (Info), security_message für "verstößt gegen Vorgabe" (Finding).

Damit baut man eigene Compliance-Checks – genau das, was CIS/IT-Grundschutz im Großen tun.

Lehrbogen
  • unauthenticated Probe (Checkmk) → authenticated Package-Check (dieser Artikel) →

fertige Compliance-Policy (CIS). Drei Stufen, ein Prinzip.

Sauberer Greenbone-Weg (Ausblick)

Statt selbst dpkg aufzurufen, liest der "richtige" Greenbone-Weg die schon von gather-package-list.nasl gesammelte Paketliste aus der Knowledge Base. Bei vielen Checks sauberer (ein SSH-Login für alle), aber weniger anschaulich. Für den Kurs ist der direkte ssh_cmd-Weg didaktisch besser.