Tipps. Tricks.

Blog

MapServer • 12. April 2021

Absicherung von MapServer-Installationen

Anfang April gingen mehrere Hinweise zur Absicherung von MapServer-Installationen über die entsprechenden Mailinglisten. Das Thema selbst ist nicht neu, ebenso wenig die zur Verfügung stehenden Möglichkeiten. Um das Thema aufzugreifen und weiter zu verbreiten, hier eine Zusammenfassung der Problematik und Lösungen.

Das Problem

MapServer muss im Aufruf mitgegeben werden, wo sich die MapDatei für den jeweiligen Dienst befindet:

http://hostname/cgi-bin/mapserv?map=/data/umn/wfs/wfs_urban_areas.map&SERVICE=...

Dadurch werden verschiedene Einfallstore auf dem Server geöffnet:

  • Ein potentieller Angreifer kann zuordnen, wo auf dem Server unsere MapDateien abgelegt sind.
  • Er kann versuchen, an die Mapdateien heranzukommen und so an weitere Informationen zu gelangen, beispielsweise DB-Passwörter.
  • Er kann versuchen, irgendwo in diesem Pfad schädliche Dateien abzulegen.
  • Er kann ggf. irgendwo anders, z. B. in /tmp, schädliche Dateien ablegen und über das 'map=...' einen Dienst suggerieren, der Schadcode auf dem System des Nutzers ausführt.

Der Lösung erster Teil: Pfad zu den MapDateien verbergen

Unser Ziel ist der Aufruf eines MapServer-Dienstes nach einem der beiden folgenden Muster:

http://hostname/urbanareas? 

- oder

http://hostname/cgi-bin/mapserv?map=urbanareas&

Beides kann über die Konfiguration des WebServers erreicht werden.

Die folgenden Beispiele beziehen sich auf den Apache. Die Einträge erfolgen in eine Konfigurationsdatei des Apache - damit sie wirksam werden, muss der Apache auf dem Server neu gestartet werden. Für die Konfiguration gibt es zwei Möglichkeiten:

1. Über eine RewriteRule in der Apache-Konfiguration:

RewriteEngine on
RewriteRule ^/urbanareas?$ /cgi-bin/mapserv?map=/data/umn/wfs/wfs_urban_areas.map[QSA,PT,L]

Ein Aufruf http://hostname/urbanareas wird nun vom WebServer so umgeschrieben, dass Server-Intern der für den MapServer auswertbare Aufruf http://hostname/cgi-bin/mapserv/map=/data/umn/wfs/wfs_urban_areas.map verwendet wird. Dies führt allerdings dazu, dass in den Capabilities der umgeleitete Aufruf steht (map=/data/.../wfs_urban_areas.map), wenn in der Mapdatei die ows_onlineresource nicht angegeben ist und vom MapServer automatisch generiert wird.

2. Über Umgebungsvariablen in der Apache-Konfiguration:

SetEnv urbanareas "/data/umn/wfs/wfs_urban_areas.map"

Ist die Variable gesetzt, kann der Dienst wfs_urban_areas.map über die Adresse http://hostname/cgi-bin/mapserv?map=urbanareas erreicht werden.

Der Lösung zweiter Teil: Aufrufe mit map=/pfad/zur/mapDatei.map unterbinden

Die Möglichkeit, dem MapServer Pfade mit Dateinamen zu übergeben, kann durch das Setzen der Umgebungsvariable MS_MAP_NO_PATH (in der Apache-Konfiguration) komplett unterbunden werden:

SetEnv MS_MAP_NO_PATH 'foo'

Der Wert der Variable ist ein beliebiger String. Nun quittiert MapServer Aufrufe mit einer Pfadangabe hinter dem map= mit der Meldung Mapfile not found in environment variables and this server is not configured for full paths.

Der erste Teil der Meldung sagt uns, dass wir nun, wie im vorhergehenden Abschnitt gezeigt, unsere MapDateien über Umgebungsvariablen definieren müssen. Ein Aufruf des Dienstes über http://hostname/cgi-bin/mapserv?map=urbanareas funktioniert dann weiterhin.

Nicht ganz so strikt wie die Umgebungsvariable MS_MAP_NO_PATH wirkt sich MS_MAP_PATTERN aus. Hier wird über einen regulären Ausdruck vorgegeben, in welchem Verzeichnis die MapDateien liegen und welche Dateinamen erlaubt sind:

SetEnv MS_MAP_PATTERN "^\/data\/umn\/osm\/([^\.][_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"

Nun können ausschließlich Mapdateien aufgerufen werden, die im Verzeichnis /data/umn/osm liegen und die Dateiendung .map besitzen. Ein Aufruf einer Mapdatei in einem anderen Verzeichnis, zum Beipiel http://hostname/cgi-bin/mapserv?map=/data/umnII/osm/osm.map, führt zur MapServer-Meldung: Parameter 'map' value fails to validate.

Weitere Informationen zu diesem Thema sind auf folgenden Seiten zu finden:

Jörg Thomsen

Jörg Thomsen ist Diplom-Geograph und seit vielen Jahren im Bereich Open-Source-GIS engagiert. Seit 2016 ist er Teil des WhereGroup-Teams in Berlin. Außerdem ist er langjähriger Dozent der FOSS Academy, dem Schulungsinstitut der WhereGroup und Lehrbeauftragter im Bereich Geoinformatik an der Beuth-Hochschule.

 

Artikel teilen: