Openvas Authenticated Check: Paket installiert? (Debian, bind9)
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:
- Configuration → Credentials → neues SSH-Login anlegen (User + Passwort oder Key).
- Configuration → Targets → dem Ziel dieses SSH-Credential zuweisen.
- 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.