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.
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:
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.
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: