15 Das Greenbone Management Protocol nutzen

Die Schwachstellenverwaltung des Greenbone Security Managers (GSM) ist auch über das Greenbone Management Protocol (GMP) verfügbar.

Greenbone Networks stellt Greenbone Vulnerability Management Tools (gvm-tools) bereit, um diese Funktion mit GMP verfügbar zu machen (siehe Kapitel 15.3). Dieses Anwenderhandbuch deckt gvm-tools bis zu Version 2.0.0 beta ab.

Die neueste GMP-Version ist unter https://docs.greenbone.net/API/GMP/gmp-21.04.html dokumentiert.

15.1 Änderungen am GMP

GMP wird regelmäßig aktualisiert, um Änderungen in der Funktionalität, die durch den zugrunde liegenden Dienst bereitgestellt werden, anzuwenden und eine einheitliche und umfassende Oberfläche zur Verfügung zu stellen.

Updates führen zu einer neuen Version von GMP. Jede neue Version enthält eine Liste hinzugefügter, veränderter oder entfernter Protokollelementen (Befehle oder Attribute). Die neueste Version der Liste ist unter https://docs.greenbone.net/API/GMP/gmp-21.04.html#changes verfügbar.

Abhängig von den Änderungen ist die veraltete Version noch für einige Zeit verfügbar. Während dieser Übergangsphase sind sowohl die veraltete als auch die neue Version erhältlich.

Die Liste kann bei der frühstmöglichen Vorbereitung auf kommende Veränderungen helfen. Sie stellt nicht die komplette Liste an bevorstehenden Veränderungen dar.

15.2 GMP aktivieren

Bevor GMP genutzt werden kann, muss es auf dem GSM aktiviert werden.

Während die Web-Oberfläche GMP lokal auf der Appliance nutzt, kann standardmäßig nicht remote über das Netzwerk auf GMP zugegriffen werden.

Der Remote-GMP-Dienst kann mithilfe des GOS-Administrationsmenüs aktiviert werden (siehe Kapitel 7.2.4.2).

Allgemein wird der Zugriff auf GMP mit SSL/TLS authentifiziert und verschlüsselt. Dieselben Benutzer wie für die Web-Oberfläche werden genutzt. Die Benutzer unterliegen denselben Beschränkungen und haben dieselben Berechtigungen.

15.3 Die gvm-tools nutzen

Die Greenbone Vulnerability Management Tools (gvm-tools) sind eine Sammlung von Werkzeugen, die Zugang zu den Funktionen des Greenbone Management Protocols (GMP) bereitstellen. GMP-Skripte, die mit gvm-script ausgeführt werden, benutzen die API, die von der Bibliothek python-gvm zur Verfügung gestellt wird.

Bemerkung

python-gvm wird bei der Installation von gvm-tools automatisch installiert.

Die gvm-tools sind als Befehlszeilenschnittstelle (CLI) und als Python-Shell für Microsoft Windows und jedes andere Betriebssystem, das Python unterstützt (einschließlich Linux), verfügbar.

Bemerkung

Sowohl gvm-tools als auch python-gvm verwenden ein anderes Versionsschema als GOS, sodass die Versionen von gvm-tools, python-gvm und GOS nicht unbedingt identisch sind.

Es wird empfohlen, die neuesten Versionen von gvm-tools und python-gvm zu verwenden.

Die gvm-tools können vom GitHub-Repository des Projekts heruntergeladen werden. Python 3.5 oder höher wird benötigt. Um gvm-tools zu installieren, müssen die Anweisungen unter https://github.com/greenbone/gvm-tools#installation befolgt werden.

Zusätzlich sind die gvm-tools als statisch verknüpfte EXE-Dateien für alle unterstützten Versionen von Microsoft Windows verfügbar.

Die EXE-Versionen der gvm-tools benötigen Python nicht und können direkt von Greenbone Networks heruntergeladen werden:

Wichtig

Externe Links zur Greenbone-Downloadseite unterscheiden Groß- und Kleinbuchstaben.

Großbuchstaben, Kleinbuchstaben und Sonderzeichen müssen exakt so, wie sie in den Fußnoten stehen, eingegeben werden.

Bemerkung

Die gvm-tools sind unter der GNU General Public License v3.0 lizensiert und können möglicherweise für andere Anwendungsfälle, basierend auf dem Quellcode, angepasst und gebaut werden.

15.3.1 Mit gvm-cli.exe zugreifen

GMP ist XML-basiert. Jeder Befehl und jede Antwort ist ein GMP-Objekt.

Das Kommandozeilenprogramm gvm-cli.exe, das von Greenbone Networks angeboten wird, bietet direktes Senden und Empfangen von XML-Befehlen und -Antworten.

gvm-cli.exe unterstützt die folgenden Verbindungen:

  • SSH
  • TLS
  • Unix Domain Socket

gvm-cli.exe unterstützt zahlreiche Befehlszeilenoptionen, die wie folgt angezeigt werden können:

$ gvm-cli -h
usage: gvm-cli [-h] [-c [CONFIG]]
             [--log [{DEBUG,INFO,WARNING,ERROR,CRITICAL}]]
             [--timeout TIMEOUT] [--gmp-username GMP_USERNAME]
             [--gmp-password GMP_PASSWORD] [-V] [--protocol {GMP,OSP}]
             CONNECTION_TYPE ...

optional arguments:
  -h, --help            show this help message and exit
  -c [CONFIG], --config [CONFIG]
                        Configuration file path (default: ~/.config/gvm-
                        tools.conf)
  --log [{DEBUG,INFO,WARNING,ERROR,CRITICAL}]
                        Activate logging (default level: None)
  --timeout TIMEOUT     Response timeout in seconds, or -1 to wait
                        indefinitely (default: 60)
  --gmp-username GMP_USERNAME
                        Username for GMP service (default: '')
  --gmp-password GMP_PASSWORD
                        Password for GMP service (default: '')
  -V, --version         Show version information and exit
  --protocol {GMP,OSP}  Service protocol to use (default: GMP)

connections:
  valid connection types

  CONNECTION_TYPE       Connection type to use
    ssh                 Use SSH to connect to service
    tls                 Use TLS secured connection to connect to service
    socket              Use UNIX Domain socket to connect to service

Obwohl gvm-cli.exe noch mehr Befehlszeilenoptionen unterstützt, werden die zusätzlichen Optionen nur angezeigt, wenn der Verbindungstyp angegeben wird:

$ gvm-cli ssh -h
usage: gvm-cli ssh [-h] --hostname HOSTNAME [--port PORT]
                 [--ssh-username SSH_USERNAME]
                 [--ssh-password SSH_PASSWORD] [-X XML] [-r] [--pretty]
                 [--duration]
                 [infile]

positional arguments:
  infile                File to read XML commands from.

optional arguments:
  -h, --help            show this help message and exit
  --hostname HOSTNAME   Hostname or IP address
  --port PORT           SSH port (default: 22)
  --ssh-username SSH_USERNAME
                        SSH username (default: 'gmp')
  --ssh-password SSH_PASSWORD
                        SSH password (default: 'gmp')
  -X XML, --xml XML     XML request to send
  -r, --raw             Return raw XML
  --pretty              Pretty format the returned xml
  --duration            Measure command execution time

Alle aktuellen GSM-Appliances, die GOS 6 unterstützen, nutzen SSH zum Verschlüsseln von GMP. Die Nutzung von TLS ist veraltet, wird nicht offiziell unterstützt und könnte in zukünftigen Versionen entfernt werden.

Die gvm-tools sind hauptsächlich für den Batch-Modus (batch processing, scripting) hilfreich.

Mit gvm-cli.exe kann GMP einfach genutzt werden:

gvm-cli --xml "<get_version/>"
gvm-cli --xml "<get_tasks/>"
gvm-cli < file

15.3.1.1 Den Client konfigurieren

Für die Nutzung des Befehls gvm-cli ist das Einloggen in die Appliance nötig.

Die benötigten Informationen werden entweder mithilfe von Befehlszeilenoptionen oder einer Konfigurationsdatei (~/.config/gvm-tools.conf) geliefert.

Um dem GMP-Benutzer Befehlszeilenoptionen zur Verfügung zu stellen, können die folgenden Befehle genutzt werden:

  • --gmp-username
  • --gmp-password

Alternativ kann eine Konfigurationsdatei ~/.config/gvm-tools.conf, die die Informationen enthält, erstellt werden:

[Auth]
gmp_username=webadmin
gmp_password=kennwort

Diese Konfigurationsdatei wird nicht standardmäßig gelesen. Die Befehlszeilenoption --config oder -c muss hinzugefügt werden, um die Konfigurationsdatei zu lesen.

15.3.1.2 Einen Scan mithilfe des Befehls gvm-cli starten

Ein typisches Beispiel für die Nutzung von GMP ist der automatische Scan eines neuen Systems.

In diesem Beispiel wird angenommen, dass ein Intrusion Detection System (IDS) genutzt wird, das die Systeme in der Demilitarisierten Zone (DMZ) überwacht und unmittelbar neue Systeme und unübliche TCP-Ports, die noch nicht genutzt wurden, entdeckt. Falls solch ein Fall beobachtet wird, sollte das IDS mithilfe eines Skripts automatisch einen Scan des neuen Systems einleiten.

Dafür kann der Befehl gvm-cli genutzt werden, obwohl der Befehl gvm-pyshell oder die Nutzung selbst geschriebener Python-Skripte geeigneter sein könnte (siehe Kapitel 15.3.2.1). Die Verarbeitung der XML-Ausgabe wird durch Python besser unterstützt, als durch die Nutzung der Shell.

Startpunkt ist die IP-Adresse des neuen, verdächtigen Systems. Auf dem GSM muss ein Ziel für diese IP-Adresse erstellt werden.

Der Befehl create_target ist hier beschrieben:

https://docs.greenbone.net/API/GMP/gmp-21.04.html#command_create_target.

  1. Falls die IP-Adresse in der Variable IPADDRESS gespeichert ist, entsprechendes Ziel wie folgt erstellen:
$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 \
--xml "<create_target><name>Suspect Host</name>\
<hosts>$IPADDRESS</hosts></create_target>"

<create_target_response status="201" status_text="OK, resource
created" id="4574473f-a5d0-494c-be6f-3205be487793"/>
  1. Aufgabe wie folgt erstellen:
$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 \
--xml "<create_task><name>Scan Suspect Host</name> \
<target id=\"4574473f-a5d0-494c-be6f-3205be487793\"></target> \
<config id=\"daba56c8-73ec-11df-a475-002264764cea\"></config></create_task>"


<create_task_response status="201" status_text="OK, resource
created" id="ce225181-c836-4ec1-b83f-a6fcba70e17d"/>

→ Die Ausgabe ist die ID der Aufgabe. Diese wird für das Starten und Überwachen der Aufgabe benötigt.

Die anderen vom Befehl genutzten IDs können durch Nutzung der folgenden Befehle, die die verfügbaren Ziele und Scan-Konfigurationen anzeigen, erhalten werden:

$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 --xml "<get_targets/>"

$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 --xml "<get_configs/>"

Bemerkung

Die Ausgabe der Befehle ist XML.

  1. Aufgabe wie folgt starten:
$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 \
--xml '<start_task task_id="ce225181-c836-4ec1-b83f-a6fcba70e17d"/>'

→ Die Verbindung wird vom GSM getrennt. Die Aufgabe läuft.

  1. Status der Aufgabe wie folgt anzeigen:
$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 \
--xml '<get_tasks task_id="ce225181-c836-4ec1-b83f-a6fcba70e17d"/>'

<get_tasks_response status="200" status_text="OK"><apply_overrides>
...<status>Running</status><progress>98<host_progress>
<host>192.168.255.254</host>98</host_progress></progress>.../>

→ Sobald der Scan abgeschlossen ist, kann der Bericht heruntergeladen werden.

Dafür wird die ID benötigt, die beim Erstellen der Aufgabe ausgegeben wurde. Außerdem muss ein sinnvolles Berichtformat eingegeben werden.

  1. IDs für die Berichtformate wie folgt anzeigen:
$ $ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 --xml '<get_report_formats/>'
  1. Bericht wie folgt laden:
$ gvm-cli --gmp-username webadmin --gmp-password kennwort ssh \
--hostname 192.168.222.115 \
--xml '<get_reports report_id="23a335d6-65bd-4be2-a83e-be330289eef7" \
format_id="35ba7077-dc85-42ef-87c9-b0eda7e903b6"/>'

Tipp

Um die Daten vollständig und automatisch zu verarbeiten, kann die Aufgabe mit einer Benachrichtigung kombiniert werden, die den Bericht, basierend auf den gegebenen Bedingungen, weiterleitet.

15.3.2 Mit gvm-pyshell.exe zugreifen

Das Kommandozeilenprogramm gvm-pyshell.exe, das von Greenbone Networks angeboten wird, bietet direktes Senden und Empfangen von XML-Befehlen und -Antworten mithilfe von Python-Befehlen. Die Befehle sorgen für das Erzeugen und Parsen der XML-Daten.

Das Werkzeug unterstützt die folgenden Transportkanäle:

  • TLS
  • SSH
  • Socket

Während die aktuellen GSM-Appliances (GOS 6) SSH nutzen, um GMP zu schützen, haben ältere Appliances TLS und Port 9390 für den Transport von GMP genutzt. Die gvm-tools können sowohl mit dem älteren als auch mit dem aktuellen GOS genutzt werden.

Die gvm-tools sind hauptsächlich für den Batch-Modus (batch processing, scripting) hilfreich.

Die Konfiguration der Authentifizierung des Befehls gvm-pyshell kann in einer Datei im Home-Verzeichnis des Benutzers gespeichert werden. Die Syntax ist in Kapitel 15.3.1.1 erklärt.

Die Python-Implementierung folgt der GMP-API (https://docs.greenbone.net/API/GMP/gmp-21.04.html). Optionale Argumente in der API sind durch ein ? gekennzeichnet. Das folgende Beispiel erklärt die Nutzung der Python-Funktion:

gmp.create_task("Name","Config","Scanner","Target",comment="comment")

Tipp

Während zwingend notwendige Parameter in der korrekten Reihenfolge eingegeben werden können und automatisch identifiziert werden, können sie auch mithilfe ihres Bezeichners angegeben werden:

gmp.create_task(name="Name",config_id="Config",scanner_id="Scanner",
target_id="Target",comment="comment")

15.3.2.1 Einen Scan mithilfe des Befehls gvm-pyshell starten

Ein typisches Beispiel für die Nutzung von GMP ist der automatische Scan eines neuen Systems.

In diesem Beispiel wird angenommen, dass ein Intrusion Detection System (IDS) genutzt wird, das die Systeme in der Demilitarisierten Zone (DMZ) überwacht und unmittelbar neue Systeme und unübliche TCP-Ports, die noch nicht genutzt wurden, entdeckt. Falls solch ein Fall beobachtet wird, sollte das IDS mithilfe eines Skripts automatisch einen Scan des neuen Systems einleiten.

Der Befehl gvm-pyshell ist dafür sehr geeignet. Die Verarbeitung der XML-Ausgabe wird durch Python besser unterstützt als durch Nutzung der Shell.

Startpunkt ist die IP-Adresse des neuen, verdächtigen Systems. Auf dem GSM muss ein Ziel für diese IP-Adresse erstellt werden.

Der Befehl create_target ist hier beschrieben:

https://docs.greenbone.net/API/GMP/gmp-21.04.html#command_create_target.

  1. Die folgenden Zeilen zeigen die Befehle, die benötigt werden, wenn gvm-pyshell genutzt wird:
$ gvm-pyshell \
--gmp-username webadmin --gmp-password kennwort \
ssh --hostname 192.168.222.115
GVM Interactive Console 2.0.0 API 1.1.0. Type "help" to get information about
  functionality.
>>> res=gmp.create_target("Suspect Host", make_unique=True, \
  hosts=['192.168.255.254'])
>>> target_id = res.xpath('@id')[0]

Die Variable target_id enthält die ID des erstellten Ziels. Diese ID kann genutzt werden, um die zugehörige Aufgabe zu erstellen.

Bemerkung

Die Erzeugung der Aufgabe erfordert den folgenden Angaben:

  • target_id
  • config_id
  • scanner_id
  • task_name
  • task_comment
  1. Alle verfügbaren Scan-Konfigurationen können wie folgt angezeigt werden:
>>> res = gmp.get_configs()
>>> for i, conf in enumerate(res.xpath('config')):
...    id = conf.xpath('@id')[0]
...    name = conf.xpath('name/text()')[0]
...    print('\n({0}) {1}: ({2})'.format(i, name, id))
  1. Alle verfügbaren Scanner können mithilfe der gleichen Methode angezeigt werden. Falls nur die integrierten Scanner genutzt werden, sind die folgenden IDs fest codiert:
    • OpenVAS-Scanner: 08b69003-5fc2-4037-a479-93b440211c73
    • CVE-Scanner: 6acd0832-df90-11e4-b9d5-28d24461215b
  1. Aufgabe wie folgt erstellen:
>>> res=gmp.create_task(name="Scan Suspect Host",
... config_id="daba56c8-73ec-11df-a475-002264764cea",
... scanner_id="08b69003-5fc2-4037-a479-93b440211c73",
... target_id=target_id)
>>> task_id = res.xpath('@id')[0]
  1. Aufgabe wie folgt starten:
>>> gmp.start_task(task_id)

→ Die aktuelle Verbindung wird unmittelbar geschlossen. Zusätzliche Befehle sind nicht erforderlich.

Alle Befehle können in ein Python-Skript eingefügt werden, das von der Python-Shell aufgerufen werden kann:

len_args = len(args.script) - 1
if len_args is not 2:
    message = """
    This script creates a new task with specific host and vt!
    It needs two parameters after the script name.
    First one is name of the target and the second one is the
    chosen host. The task is called target-task

    Example:
        $ gvm-pyshell ssh newtask target host
    """
    print(message)
    quit()

target = args.script[1]
host = args.script[2]
task = target + " Task"

# Full and Fast
myconfig_id = "daba56c8-73ec-11df-a475-002264764cea"

# OpenVAS Scanner
myscanner_id = "08b69003-5fc2-4037-a479-93b440211c73"

res=gmp.create_target(target, True, hosts=host)
mytarget_id = res.xpath('@id')[0]

res=gmp.create_task(name=task,
                    config_id=myconfig_id,
                        scanner_id=myscanner_id,
                            target_id=mytarget_id)
mytask_id = res.xpath('@id')[0]

gmp.start_task(mytask_id)

15.3.3 Beispielskripte

Die gvm-tools bringen eine Sammlung von Beispielskripten mit sich, welche vom Befehl gvm-script genutzt werden können.

Aktuell sind die folgenden Skripte für die gvm-tools Version 2.0.0 verfügbar (https://github.com/greenbone/gvm-tools/tree/master/scripts):

  • application-detection.gmp.py: Dieses Skript zeigt alle Hosts mit der gesuchten Anwendung.
  • cfg-gen-for-certs.gmp.py: Dieses Skript erstellt eine neue Scan-Konfiguration mit VTs basierend auf einem gegebenen CERT-Bund-Advisory.
  • clean-sensor.gmp.py: Dieses Skript entfernt alle Ressourcen, abgesehen von aktiven Aufgaben, von einem Sensor.
  • create-dummy-data.gmp.py: Dieses Skript erstellt Dummy-Daten.
  • DeleteOverridesByFilter.gmp.py: Dieses Skript entfernt Übersteuerungen von einem Filter.
  • monthly-report2.gmp.py: Dieses Skript zeigt alle Schwachstellen, die auf dem Bericht eines vorgegebenen Monats basieren. Geeignet für GOS 4.x.
  • monthly-report.gmp.py: Dieses Skript zeigt alle Schwachstellen, die auf dem Bericht eines vorgegebenen Monats basieren. Geeignet für GOS 3.1.
  • nvt-scan.gmp.py: Dieses Skript erstellt eine neue Aufgabe mit einem bestimmten Host und einem bestimmten VT, die eine fest codierte Basis-Konfiguration nutzt.
  • startNVTScan.gmp.py: Dieses Skript erstellt interaktiv eine neue Aufgabe mit einem bestimmten Host und einem bestimmten VT.
  • SyncAssets.gmp.py: Dieses Skript lädt Assets in die Asset-Datenbank hoch.
  • SyncReports.gmp.py: Dieses Skript lädt Berichte von einem GSM herunter und lädt sie mithilfe von Container-Aufgaben in einen zweiten GSM hoch.

Tipp

Diese Skripte können als Startpunkt für die Entwicklung benutzerdefinierter Skripte dienen.

15.4 Statuscodes

GMP nutzt Statuscodes, die HTTP-Statuscodes ähnlich sind. Die folgenden Codes werden genutzt:

2xx:

Das Kommando wurde erfolgreich übertragen, verstanden und akzeptiert.

200: OK
201: Resource created
202: Request submitted
4xx:

Es liegt ein Benutzerfehler vor.

400: Syntax-Fehler

Dies beinhaltet verschiedene Syntaxfehler. Oft fehlen Elemente oder Attribute im GMP-Befehl. Der Statustext zeigt zusätzliche Informationen.

Aktuell wird dieser Statuscode auch für fehlende oder falsche Authentifizierungen genutzt.

401: Authenticate First
Dieser Fehlercode wird für eine fehlende oder falsche Authentifizierung genutzt. Aktuell wird noch der Wert 400 genutzt.
403: Access to resource forbidden
Dieser Fehlercode wird genutzt, wenn nicht genug Berechtigungen vorhanden sind. Oft wird stattdessen 400: Permission denied angezeigt.
404: Resource missing
Die Ressource konnte nicht gefunden werden. Die Ressourcen-ID ist leer oder falsch.
409: Resource busy
Dieser Fehlercode tritt beispielsweise dann auf, wenn die Synchronisierung des Feeds gestartet wird, während sie bereits läuft.
5xx:

Es liegt ein Serverfehler vor.

500: Internal Error
Dies kann durch Einträge, die die interne Puffergröße übersteigen, ausgelöst werden.
503: Scanner loading NVTs
Der Scanner lädt gerade VTs aus seinem Speicher. Die Anfrage sollte zu einem späteren Zeitpunkt noch einmal gestellt werden.
503: Service temporarily down
Möglicherweise läuft der Scanner-Daemon nicht. Oft wird dieses Problem durch abgelaufene Zertifikate hervorgerufen.
503: Service unavailable
Der GMP-Befehl ist auf dem GSM gesperrt.