SecureInstall

From MapbenderWiki

Jump to: navigation, search

Web-Gis Installation in einer sicheren Umgebung

Hinweis: Dieses How-To bislang ist nur ein Entwurf und für fortgeschrittene Anwender konzipiert, es wird keinerlei Anspruch auf Vollständigkeit oder Richtigkeit der Angaben übernommen.

Im folgenden wird die Installation einer Web-Gis Umgebung beschrieben, wobei ein besonderes Augenmerk auf sicherheitstechnische Anforderungen gelegt wurde. Diese Seite soll als Ergänzung, nicht als Ersatz für die Dokumentation der einzelnen Komponenten in dieser Wiki dienen.

Contents

Installation des WebGIS Servers

  • Installation des Grundsystems - hier: Debian GNU Linux /etch
  • Einrichten des Netzwerks
  • Update der sources und Upgrade des Basissystems, Check ob Sicherheitsupdates eingetragen sind
   #cat /etc/apt/sources.list
   #apt-get update; apt-get upgrade
  • Entfernen nicht benötigter Kompononten (X, Wörterbücher, acpid, dhcp)
    • Telnet aus:
 #/usr/sbin/update-inetd --disable telnet 
    • rsh, rlogin sind symlinks in /usr/bin, die auf ssh zeigen, rcp zeigt auf scp. Damit sind unverschlüsselte logins nicht möglich.
  • Optional: Installation nützlicher Tools
    • screen - Virtuelle Terminals auf der Konsole
    • lsof - Analyse der Ressourcen laufender Prozesse
    • htop - Huebsche Anwendung zu Darstellung laufender Prozesse und Ressourcenverbrauch
    • ntp - Systemzeit durch remote Server setzen
    • iproute - Netzwerk-tools

NTP Konfiguration

Um sicherzustellen, dass die Systemzeit der realen Zeit entspricht wird die Zeit mit einem Zeitserver syncronisiert. Hierfür wird das Programm NTP verwendet. Die Konfiguration erfolgt unter: /etc/ntp.conf

Benutzermanagement

  • Verwenden von Schattenpasswörtern
  #shadowconfig on 
  • Neue Benutzergruppen anlegen:
   #addgroup remote
   #addgroup wheel
  • Systembenutzer anlegen (Beispielhaft: myadmin)
   #useradd myadmin 

  • Gruppenzuweisung (wheel darf mit su Idendität wechseln, remote darf von fern einloggen, siehe PAM)
    #gpasswd -a myadmin wheel
    #gpasswd -a myadmin remote
  • Benutzer für Applikation 'Mapbender' anlegen, Passwort sperren (auch für apache), Standard Shell auf /bin/false setzen. Die letzten beiden Schritte dienen dazu, den login als 'mymb' zu verhindern. Andere Benutzer die nur von Diensten benötigt werden (www-data, myms) werden genauso gesperrt.
   #adduser mymb
   #passwd -l mymb       # lock password
   #chsh -s /bin/false mymb

Für weitere Anwendungen werden weitere Benutzer nach dem gleichen Muster angelegt.

Konfigurieren von Pluggable Authentication Modules (PAM)

   #vi /etc/pam.d/login 
   auth     requisite  pam_securetty.so # Root login von fern deaktivieren
   session  required   pam_limits.so # Beschränkungen für Benutzer aktivieren
   password   required   /lib/security/pam_cracklib.so retry=4 minlen=6 # Komplexe Passwörter erfordern, maximale Anzahl an Versuchen
   #vi /etc/pam.d/passwd
   password   required   pam_unix.so nullok obscure min=6 max=11 md5 # Passwortbeschränkungen aktivieren
   
   #vi /etc/securetty
   # Allow root login only on standard consoles (tty1-tty6) 
   tty1
   tty2
   tty3
   tty4
   tty5
   tty6
  
   #vi /etc/security/access.conf
   -:ALL EXCEPT wheel sync:LOCAL # nur Gruppe wheel darf lokal einloggen
   -:remote:ALL EXCEPT LOCAL # nur Gruppe remote darf von fern einloggen
   
   #vi /etc/pam.d/su
   auth sufficient pam:rootok.so # root darf su ohne Passwort verwenden
   auth requisite pam_wheel.so group=wheel # nur Gruppe wheel darf su verwenden
   
   #vi /etc/pam.d/ssh
   auth requisite pam_securetty.so 
   
   #vi /etc/pam.d/other
   auth     required       pam_securetty.so
   auth     required       pam_unix_auth.so
   auth     required       pam_warn.so
   auth     required       pam_deny.so
   account  required       pam_unix_acct.so
   account  required       pam_warn.so
   account  required       pam_deny.so
   password required       pam_unix_passwd.so
   password required       pam_warn.so
   password required       pam_deny.so
   session  required       pam_unix_session.so
   session  required       pam_warn.so
   session  required       pam_deny.so

Konfigurieren der Protokollierung

  • Konfiguration der /etc/login.defs

Fehlgeschlagene login Versuche, sowie erfolgreiche logins werden protokolliert. Unbekannte Benutzernamen ebenfalls, sowie die Verwendung des Kommandos su. Die Logdateien sind unter /etc/faillog und /etc/sulog zu finden. Da Benutzer gelegentlich das Passwort statt des Benutzernamens angeben und dieser fehlgeschlagene Login Versuch dann protokolliert wird, werden die Dateirechte aus Sicherheitsgründen auf 640 gesetzt.

 FAILLOG_ENAB            yes
 LOG_UNKFAIL_ENAB        yes
 LOG_OK_LOGINS           yes
 SYSLOG_SU_ENAB          yes
 SYSLOG_SG_ENAB          yes
 SULOG_FILE      /var/log/sulog
 LOGIN_RETRIES           5 # Nur Fallback da in PAM als 4 definiert
 DEFAULT_HOME    no        # Login nur möglich wenn in das /home Verzeichnis gewechselt werden kann.
 CONSOLE console:tty01:tty02:tty03:tty04 # Wieder fallback: Root logins nur auf tty1-4

Secure Shell zum Fern-Login

     #vi /etc/ssh/sshd_config
     Host *
     Port 22
     Protocol 2
     UsePAM yes
     AllowGroups wheel
     PermitRootLogin no
     PermitEmptyPasswords no

Webserver

  • Installation von Apache2:
  #apt-get install apache2 
  • Installation von Postgres Erweiterungen für php:
  #apt-get install php5-pgsql
  • Apache Konfiguration: /etc/apache2/apache2.conf Hinweis: Um den WebServer zu 'härten' muss diese Konfiguration im einzelnen beleuchtet werden, was den Rahmen dieses How-To's sprengt. Hierfür ist die Dokumentation zu rate zu ziehen.
  • Installation von php5 mit fastcgi und suexec:

PHP-Skripte laufen mit mod_cgi immer mit den Rechten des Apache-Benutzers. Außerdem ist mod_php nicht threadsave. Dies stellt ein Sicherheitsrisiko dar. Es wird daher auf die Verwendung von mod_php verzichtet. Alternativ wird mod_fcgid in Kombination mit suexec verwendet. Dies ermöglicht eine individuelle php-Konfiguration für jede Applikation. Ausserdem hat jede Applikation einen ihr eindeutig zugewiesenen Skript-Benutzer. Im Falle dass eine Applikation kompromittiert würde, wird hierduch gewährleistet, dass kein Zugriff auf andere Applikationen besteht. '

   #apt-get install php5-cgi libapache2-mod-fcgid apache2-mpm-worker # installiert fcgid und php5 mit cgi Unterstützung
   #a2enmod fcgid  # aktiviert das Modul fcgid
   #a2enmod suexec # hiermit können php scripte als konfigurierter Benutzer ausgeführt werden 

  • VHost Konfiguration

Für jede Applikation wird ein individueller VHost (=Virtual Host : 'Virtueller Anbieter') konfiguriert, also eine eigene Adresse unter der die Applikation aufgerufen wird. Im gezeigten Beispiel wird die Unterscheidung nach Ports vorgenommen. Ebenso ist es möglich, die VHosts auf verschiedene www-Adressen beziehungsweise verschiedene Subdomains zu legen. In der VHost-Konfiguration wird u.a. das Document-Root, also das Stammverzeichnis festgelegt, ebenso die Ausführbarkeit von Skripten sowie dessen Benutzer. Für jede Seite wird eine eigene Konfigurationsdatei angelegt, die sich im Verzeichnis /etc/apache2/sites-available befindet. Das Aktivieren bzw. Deaktivieren der Seiten wird über die Befehle

  #a2ensite [SEITENNAME]

zum Aktivieren und

  #a2dissite [SEITENNAME]

zum Deaktivieren realisiert.

Anschließend ist der Web-Server mit dem Befehl

  #/etc/init.d/apache2 force-reload

neu zu initialisieren.

Beispiele für VHost Konfigurationen folgen an späterer Stelle.


  • FCGI-Wrapper zum Starten der PHP Scripte

Der Wrapper ist eine ausführbare Datei (shell-script), die die Systemvariable 'PHPRC' setzt, in der das Verzeichnis angegeben ist in der sich die jeweilige Konfigurationsdatei für PHP (php.ini) befindet. Anschließend wird PHP aufgerufen. Der Wrapper muss als Besitzer in den Dateirechten den jeweiligen Script Benutzer eingetragen haben. Dies führt zu der Problematik, dass dieser sich selbst Schreibrechte auf diese Datei erteilen könnte. Um dies zu vermeiden wird das 'immutable bit' gesetzt. Dies bewirkt, dass die Dateirechte nicht mehr verändert werden können (Nicht einmal vom Superuser root). Um die Dateirechte dennoch zu verändern, muss der Superuser das immutable bit zuvor entfernen.

Beispiel eines Wrappers:(Für jede Applikation die PHP Scripte ausführen muss, wird ein eigener Wrapper erstellt):

 #cat /var/www/mapbender/conf/php5-fcgid-htdocs
  #!/bin/sh
  PHPRC="/var/www/mapbender/conf/"
  export PHPRC
  exec /usr/bin/php5-cgi
  • Rechtezuweiseung des Wrappers und setzen des immutable bits:
  #chown mymb.mymb php5-fcgid-htdocs
  #chmod 550 php5-fcgid-htdocs
  #chattr –V +i php5-fcgid-htdocs
  • Konfigurationsdatei von php

Die Standard Konfigurationsdatei von PHP ist für Entwicklungszwecke, nicht für Produktivsysteme entworfen. Um einen besseren Sicherheitsstandard zu erreichen, muss diese Datei im Detail angepasst werden. Die genaue Beschreibung der einzelnen Einstellungen können der PHP Dolkumentation entnommen werden.

  • APC

APC it ein 'Alternativer PHP Cache', ein Op-Code Cache der PHP Dateien im Arbeitsspeicher hält und somit dafür sorgt, dass diese schneller geladen werden können. Hiermit wird vermieden dass die Scripte bei jedem Aufruf neu geparsed werden müssen. Allerdings wird mit APC insgesamt mehr Speicher verbraucht als ohne.

  1. apt-get install apache2-threaded-dev libapr1-dev libaprutil1-dev libdb4.4-dev libldap2-dev libpcre3-dev libpcrecpp0 libsqlite3-dev uuid-dev php-pear
  #pear upgrade PEAR
  #ln -s /usr/bin/apxs2 /usr/bin/apxs (Symbolischer Link , damit pecl das apxs auch findet)
  #pecl install apc
  
  Installiert: '/usr/lib/php5/20060613+lfs/apc.so'
  extension=apc.so zur php.ini hinzufügen
 Definitionen der Erweiterungen:

PEAR = PHP Extension and Application Repository pecl = PHP Extension Community Library - Teil von PEAR apxs = APacheeXtenSion Tool, kennt Pfade, Optionen etc. von apache, zur Installation von 3rd Party Tools

Anpassen der Konfiguration:

  #vi /usr/share/php/pearcmd.php
  @ini_set('allow_url_fopen', false);
  @ini_set('memory_limit', '64M');

Konfiguration und Performance Tuning in der entsprechenden php.ini der Applikation (nur ein Beispiel!):

  [APC]
  apc.enabled = 1
  ;apc.shm_segments = 1
  apc.shm_size = 30
  apc.num_files_hint = 1000
  apc.user_entries_hint = 4096
  apc.ttl = 0
  apc.user_ttl = 0
  apc.gc_ttl = 3600
  apc.cache_by_default = 1
  apc.max_file_size = 5M
  ; Pruefe ob Datei veraendert -> set to 0 not to check!
  apc.stat = 1
  apc.write_lock = 1
  apc.include_once_override = 1

Secure Sockets Layer - Verschlüsselte Verbindung

Der Web Client Mapbender überträgt Daten und Passwörter unverschlüsselt, was im Hinblick auf die Sicherheit inakzeptabel ist. Unter anderem aus diesem Grund wird der gesamte Datenverkehr vom Web-Server verschlüsselt. Hierzu wird das HTTPS Protokoll verwendet.

  • Erstellen eines privaten Schlüssels (1024 bit, Triple-DES, PEM formatiert), ablegen des Passworts in einer Datei, schützen der Datei, Kontrolle des Schlüssels:
  #cd /root/cert
  #openssl genrsa -des3 -out MeinZertifikat.key 1024
  #echo MYPASSWORD > pass-phrase
  #chmod 400 pass-phrase
  #chattr -V +i pass-phrase
  #openssl rsa -noout -text -in MeinZertifikat.key

  • Erstellen eines Certificate Signing Request. Nach der Unterzeichnung durch die Certificate Authority (CA) erhält man das Zertifikat. Die .csr Datei ist dann nicht mehr relevant.
  #openssl req -new -key MeinZertifikat.key -out MeinZertifikat.csr
  #openssl req -noout -text -in MeinZertifikat.csr

  • Zu Testzwecken kann das Zertifikat selbst signiert werden. Dieses Zertifikat erzeugt eine Warnung im Browser und ist daher nicht für eine produktive Umgebung geeignet.
  #openssl req -new -x509 -nodes -sha1 -days 365 -key MeinZertifikat.key -out MeinZertifikat.crt
  #openssl x509 -noout -text -in interim.crt
  [...]
  C=DE, ST=Bayern, L=Muenchen, O=Hofbraeuhaus, CN=10.20.30.40:443/emailAddress=diesistkeine@email.de
  [...]
  • Kopieren des (vorläufigen) Schlüssels und Zertifikates nach /etc/apache2/ssl, setzen der Rechte (root.mymb 640)
  • Kontrollieren der Konfigurationsdatei für das SSL Modul: /etc/apache2/mods-available/ssl.conf
  • Aktivieren des SSL Moduls:
  #a2enmod ssl
  • Ggf. anpassen der Konfigurationsdatei des Listeners: /etc/apache2/ports.conf
  • Anpassen der /etc/apache2/sites-available/default

In den Abschnitt <VirtualHost [...] > :

  #    SSL
       SSLEngine On
       SSLCipherSuite HIGH:MEDIUM
       SSLCertificateFile    /etc/apache2/ssl/MeinZertifikat.crt
       SSLCertificateKeyFile /etc/apache2/ssl/MeinZertifikat.key

Serverseitige Kompression

Für bessere Performanz ist für die Anwendung 'Mapbender' das Aktivieren serverseitiger Kompression unerlässlich. Hierfür wird folgende Konfiguration innerhalb des VHost Abschnittes vorgenommen:

  # Insert filter
  SetOutputFilter DEFLATE
  # Netscape 4.x has some problems...
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  # Netscape 4.06-4.08 have some more problems
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  # Don't compress images
  SetEnvIfNoCase Request_URI \
  \.(?:gif|jpe?g|png)$ no-gzip dont-vary
  # Make sure proxies don't deliver the wrong content
  Header append Vary User-Agent env=!dont-vary

Damit das Ganze auch funktioniert müssen folgende Module aktiviert werden:

  #a2enmod deflate
  #a2enmod headers

Zusammenfassend ein Beispiel für eine VHost Konfiguration:


  meinpc:/home/myadmin# cat /etc/apache2/sites-available/mapbender
  # Mapbender
  NameVirtualHost *:443
  <VirtualHost *:443>
       ServerAdmin diesistkeine@email.de
       SuexecUserGroup mymb mymb
       DocumentRoot /var/www/mapbender/http
  #    SSL
       SSLEngine On
       SSLCipherSuite HIGH:MEDIUM
       SSLCertificateFile    /etc/apache2/ssl/interim.crt
       SSLCertificateKeyFile /etc/apache2/ssl/interim.key
       <Directory /var/www/mapbender/http>
               Options -Indexes +MultiViews +ExecCGI
               AddHandler fcgid-script .php
               FCGIWrapper /var/www/mapbender/conf/php5-fcgid-htdocs .php
               DirectoryIndex index.php
               AllowOverride None
               Order allow,deny
               allow from all
  #            Serverseitige Kompression
               SetOutputFilter DEFLATE
               BrowserMatch ^Mozilla/4 gzip-only-text/html
               BrowserMatch ^Mozilla/4\.0[678] no-gzip
               SetEnvIfNoCase Request_URI \
                \.(?:gif|jpe?g|png)$ no-gzip dont-vary
               Header append Vary User-Agent env=!dont-vary
       </Directory>
  # User defined log files:
       ErrorLog /var/log/apache2/mapbender.error.log
       LogLevel warn
       CustomLog /var/log/apache2/access.log combined
       ServerSignature Off
  </VirtualHost>

Logdateien

Folgende Logdateien halten die Zugriffe, Fehler und Benutzer der WebGIS Applikationen fest:

Verzeichnis: /var/log/apache2

access.log - Alle Zugriffe
error.log  - Anwendungsunabhängig Fehler des Web Servers (kann im VHost umgeleitet werden
suexec.log - Zugriffe und Fehler der Benutzeridentität beim Zugriff auf alle Applikationen

PostgreSQL

PostgreSQL ist ein freies, objektrelationales Datenbanksystem. PostGIS ist ein freies geographisches Informationssystem, welches Postgres um geographische Objekte und Funktionen erweitert. Im folgenden wird die Installation und Benutzerverwaltung des Datenbanksystems auf dem Web-GIS Server beschrieben.

Installation als Debian Paket

Die Installation von Postgres und PostGIS erfolgt über das Paketmanagementsystem von Debian. Der Nachteil dabei ist, dass eine nicht ganz aktuelle Version installiert wird. Die Vorteile bestehen in der automatisierten Erfüllung aller Abhängigkeiten, dem vereinfachen von Updates und der vom Distributor geprüften Stabilität.

  #apt-get install postgresql-8.1 postgresql-common postgresql-client-8.1 postgresql-client-common postgis postgresql-8.1-postgis ssl-cert

Das Installationsverzeichnis von Postgres ist /usr/lib/postgresql/8.1. BR Die PostGIS Dateien liegen unter /usr/share/postgresql-8.1-postgis/.

Bei der Installation als Paket wird automatisch der Nutzer postgres mit angelegt. Um den direkten Login als postgres zu verhindern, wird dessen Passwort gesperrt:

  #passwd -l postgres

Um postgres zu werden bleibt nun nur noch die Möglichkeit als superuser root den Befehl

su postgres

zu verwenden.

Starten und Stoppen des Datenbankservers

Bei der Installation wurde weiterhin ein init-script angelegt. Hierdurch kann die Datenbank komfortabel hoch- und runtergefahren werden.

  #/etc/init.d/postgresql-8.1 {start|stop|restart|reload|force-reload|status|autovac-start|autovac-stop|autovac-restart}

Die Process-ID(PID) Datei, die den laufenden Prozess markiert, ist hier zu finden:

  #/var/run/postgresql/8.1-main.pid

Log Datei

Die Log Datei findet sich unter:

  /var/log/postgresql/postgresql-8.1-main.log

Konfigurationsdateien

Die Hauptkonfigurationsdatei liegt hier:

  /etc/postgresql/8.1/main/postgresql.conf

Hier werden als Beispiel folgende grundlegende Einstellungen getroffen:

  listen_addresses = 'localhost' #Netzwerkverbindungen nur vom eigenen Host zulassen
  port = 5432                    #Port to listen
  max_connections = 100          #Anzahl gleichzeitiger Clients beschränken
  unix_socket_group = 'postgres'
  unix_socket_permissions = 0770 
  authentication_timeout = 60            
  ssl = true
  password_encryption = on
  autovacuum = on  

Benutzer und Authentifizierung

Es wird ein Benutzer angelegt, der Besitzer der Datenbank 'mapbender' werden soll. Hierzu wird als Systembenutzer 'postgres' das Interface der Datenbank aufgerufen:

  #psql template1

Wobei template1 eine bereits existierende Datenbank ist. Der Befehl zum Anlegen des Benutzer lautet:

  #create user mymb password 'MYPASSWORD';

Wobei dem Benutzer keine allgemeingültigen Rechte zugeteilt werden.

In folgenden Dateien wird festgelegt wer Zugriff auf die Datenbank erhält und wie die Authentifizierung erfolgt:

  hba_file = '/etc/postgresql/8.1/main/pg_hba.conf'       # host-based authentication file
  ident_file = '/etc/postgresql/8.1/main/pg_ident.conf'   # IDENT configuration file

Einstellungen: postgres hat lokal ohne Passwortabfrage Zugriff, der Benutzer 'mymb' darf nach Passwortabfrage auf die Datenbank 'mapbender' zugreifen. Allerdings nur lokal, z.B. nach einer Anmeldung am System via ssh. Sonstige Nutzer aus dem Netz sind gesperrt.

  #cat /etc/postgresql/8.1/main/pg_hba.conf
  #TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
  #"local" is for Unix domain socket connections only
  local   all         postgres                          ident sameuser
  local   mapbender   mymb                             md5
  #IPv4 local connections:
  host    mapbender   mymb       127.0.0.1/32          md5
  

PostGIS

Template erstellen

Mit folgendem Befehl wird als user postgres eine Datenbankvorlage erstellt, aus der später alle PostGIS Datenbanken hervorgehen:

  #createdb -U postgres -T template1 -E Latin1 postgis_template

Jetzt wird die prozedurale Sprache PL/pgSQL für dieses Template aktiviert:

  #createlang plpgsql postgis_template

Abschließend werden die PostGIS Scripte in das Template geladen:

  #psql -U postgres -f /usr/share/postgresql-8.1-postgis/lwpostgis.sql -d postgis_template
  #psql -U postgres -f /usr/share/postgresql-8.1-postgis/spatial_ref_sys.sql -d postgis_template

Datenbank aus Vorlage erzeugen

Mit folgendem Befehl kann nun eine neue Datenbank mit den PostGIS Erweiterungen aus der oben erzeugten Vorlage erstellt werden:

  #createdb -U [USER] -T postgis_template [DBNAME] -E [ENCODING]

Web Administrationsoberfläche phpPgAdmin

Um eine benutzerfreundliche Datenbankoberfläche zur Wartung und Kontrolle der Datenbank zu haben, kann die Web-basierte Oberfläche phppgadmin installiert werden. Diese Anwendung wird als eigene Web Seite zur Verfügung gestellt. Dies ermöglicht es, die Oberfläche zu deaktivieren so lange diese nicht gebraucht wird und nur dann zu aktivieren, wenn tatsächlich Wartungsarbeiten an der Datenbank erforderlich werden. Das Aktivieren erfolgt direkt im Web-Server Apache und kann nur von einem entsprechend befugten Benutzer in der Kommandozeile des Betriebssystems, nicht über das Web vorgenommen werden. Zur Aktivierung der Seite ist weiterhin ein Neustart des Web Servers erforderlich. Dies bedingt, durch die Verschlüsselung die Eingabe des Passwortes des Zertifikates.

Schritte zur Installation:

  • Systembenutzer 'mypg' anlegen und login sperren
  • Dem Benutzer 'mypg' Gruppenrechte 'www-data' zuweisen
  • Wrapper konfigurieren: /var/www/pgppgadmin/conf/php5-fcgid-htdocs
  • php.ini konfigurieren: /var/www/phppgadmin/conf/php.ini
  • Listener konfigurieren: /etc/apache2/ports.conf
  • Seite im Apache einrichten: /etc/sites-available/phppgadmin (SSL verschlüsselt) -> a2ensite phppgadmin
  • Paket von der Seite: http://phppgadmin.sourceforge.net herunterladen und entpacken: /var/www/pgppgadmin/www
  • Setzen der Rechte

Mapbender

Mapbender ist ein Web-Client zum Darstellen und Bearbeiten von Kartendiensten. Er stellt eine Web-Oberfläche bereit, über die verschiedene 'GUIs' konfiguriert werden können. Ein 'GUI' ist die Schnittstelle zum Benutzer. Es beinhaltet einen oder mehrere Kartendienste und verschiedene Funktionen über die diese Karten bedient werden können.

Download der Verzeichnisstruktur

  #wget http://www.mapbender.org/download/mapbender[VERSION].zip
  #unzip mapbender_[VERSION].zip

Anschließend müssen die Rechte der Dateien auf die Benutzer angepasst werden:

||/var/www/mapbender || root.root || 751 || Basisverzeichnis || ||/var/www/mapbender/conf || mymb.mymb || 750 || Verzeichnis für Konfigurationsdateien || ||/var/www/mapbender/conf/* || myadmin.mymb || 640 || Konfigurationsdateien || ||/var/www/mapbender/http || myadmin.mymb || 750 || Document Root || ||/var/www/mapbender/http/* || myadmin.mymb || 640 || Web Dateien ||

Konfiguration des Web-Servers

Wie oben beschrieben

Erzeugen der Datenbank

Zunächst wird als Systembenutzer 'postgres' der über Datenbank Administratorrechte verfügt, eine neue, leere Datenbank erstellt. Hierbei wird der Datenbankbenutzer 'mymb' als Besitzer festgelegt. Die Datenbank wird auf der oben beschriebenen Vorlage basierend erstellt, um die PostGIS Erweiterungen zu aktivieren. Die Zeichencodierung wird analog dem Web-Server auf den ISO Standard gesetzt. (Im gezeigten Beispiel ISO, im Allgemeinen besser: UTF-8).

Hinweis: Für die Dauer des Erstellens der Datenbank bekommt der Benutzer mymb Superuserrechte zugewiesen, die nach dem erfolgreichen Abschluss sofort wieder entzogen werden. Dies vereinfacht das Erstellen.

  #createdb -U mymb -O mymb -T postgis_template mapbender -E Latin1
  #psql -d mapbender -U mymb -W -f resources/db/postgresql/pgsql_schema.sql 
  #psql -d mapbender -U mymb -W -f resources/db/postgresql/iso/pgsql_data.utf8.sql
  #psql -d mapbender -U mymb -W -f resources/db/postgresql/pgsql_serial_set_sequences.sql

Konfigurationsdatei

Nun ist die Mapbender Konfigurationsdatei anzupassen, um die Verbindung zur Datenbank herstellen zu können. Zunächst wird die Vorlage kopiert:
  #cp -p conf/mapbender.conf-dist conf/mapbender.conf

Nun werden die Anpassungen für die Datenbank vorgenommen und die Datei mapbender.conf gespeichert.


UMN Mapserver, Installation und Konfiguration

Detailed instructions on how to compile mapserver on unix can be found here. Der Mapserver ist von der Homepage als Quellcode herunterzuladen und zu compilieren. Hierbei ist es wichtig, alle benötigten Komponenten mit zu berücksichtigen. Im gezeigten Beispiel wurde die die Unterstützung für Oracle und SDE mit kompiliert. Für einfache Anwendungen kann alternativ eine vom Distributor vorcompilierte Version des Mapservers verwendet werden.

  • Download der aktuellen Version und entpacken nach /opt/mapserver/src5.2.0:
  #wget http://download.osgeo.org/mapserver/mapserver-5.2.0.tar.gz
  #tar -xzvf mapserver-5.2.0.tar.gz

Installation benötigter Debian Pakete

  • gcc - C Compiler
  • libc6. libc6-dev - Standardbibliotheken mit Erweiterung
  • flex - Generator für lexikalische Analysen
  • m4 - Makroprozessor (ähnlich SVR4)
  • bison - Parsergenerator
  • pkg-config - Compile und Link-Flag Management für Bibliotheken
  • freetype - Portable font engine
  • libpng - Lesen und schreiben von PNG Dateien (Portable Network Graphics)
  • libjpeg - Pakete zum Manipulieren von jpg / jpeg Grafikdateien
  • libtiff - Tiff (Tag Image File Format) Bibliothek # für gdal, nicht explizit in configure aufrufen, um Probleme zu vermeiden
  • libagg - AntiGrain Geometry graphical toolkit
  • XpmFreeXpmImage - Operationen des XPM Pixmap formates - Benötigt Grundkomponenten des X11 Systems
  • libiconv - iconv kompatible Routine (Internationalisation)
  • libz - Kompressionsbibliothek (zlib)
  • gd - GD Grafikbibliothek
  • proj - Kartografische Projektions und Filter Bibliothel
  • gdal - Geospacial Data Abstraction Library (sehr viele Abängigkeiten)
  • ogr - Teil von Gdal
  • postgis - Datenbank, siehe [wiki:WebGIS/postgres Postgres]
  • geos - Verarbeitet Geometrien
  • curl - Komandozeilenwerkzeug um URL's zu transferieren
  • sos - OGC SOS Server Support
  • libxml2 - Bibliothek um XML Dokumente zu parsen
  • fribidi - Unterstützung für Rechts-nach-Links Labels
  • FastCGI - Alternative zum apache mod_php (Schneller, sicherer, läuft mit eigenem user als Dämon)
  • PHP5 - Wird für PHP / Mapscript gebraucht
  • libstdc++ - Standard C++ Bibliothek, wird vom SDE Clienten gebraucht
  #apt-get install apt-get install zip unzip bzip2 ftp libreadline-dev build-essential gcc libc6 libc6-dev flex m4 bison pkg-config libfreetype6 libfreetype6-dev libpng12.0 libpng12.0 libjpeg62 libjpeg62-dev libagg-dev libxpm4 libxpm-dev libtiff4 libtiff4-dev libiconv-hook1 libiconv-hook-dev libgd2-xpm libgd2-xpm-dev proj gdal-bin libgdal1-1.3.2 libgdal1-1.3.2-dev libcurl3-dev libgeos-dev libxml2-dev libfribidi-dev libfcgi-dev libfcgi0c2 php5 php5-dev libstdc++5 libstdc++5-3.3-dev


Externe Software

Oracle Instant Client

  • Benötigte Ressourcen installieren:
  #apt-get install alien unixodbc libaio1

Es hat sich gezeigt, dass der beschriebene Weg nur mit untenstehender Version fehlerfrei funktioniert

   instantclient-odbc-linux32-10.2.0.3-20061115.zip
   oracle-instantclient-devel-10.2.0.3-1.i386.rpm
   oracle-instantclient-basic-10.2.0.3-1.i386.rpm
   oracle-instantclient-sqlplus-10.2.0.3-1.i386.rpm
  • Diese Dateien in Debian pakete konvertieren und installieren:
   #alien *.rpm
   #dpkg -i *.deb
  • Variablen konfigurieren und Pfade eintragen:
   #echo /usr/lib/oracle/10.2.0.3/client/lib > /etc/ld.so.conf.d/oracle.conf
   #ldconfig
   #echo export TNS_ADMIN=/etc/oracle >> /etc/profile
   #echo export export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib:/usr/include/oracle/10.2.0.3/client >> /etc/profile
   #echo export NLS_LANG="GERMAN_GERMANY.WE8MSWIN1252" >> /etc/profile
   #source /etc/profile
  • /etc/oracle konfigurieren. => Kopieren von tnsnames.ora, sqlnet.ora
  • odbcinst.ini und odbc.ini in /etc erstellen
  • Instantclient entpacken, Bibliothek an die richtige Stelle kopieren, Script ebenso , Script ausführbar machen
  • ggf. Datenbankserver in die /etc/hosts eintragen
   #unzip instantclient-odbc-linux32-10.2.0.3-20061115.zip
   #cp instantclient_10_2/libsqora.so.10.1  /usr/lib/oracle/10.2.0.3/client/lib/
   #cp instantclient_10_2/odbc_update_ini.sh /usr/lib/oracle/10.2.0.3/client/
   #chmod u+x /usr/lib/oracle/10.2.0.3/client/odbc_update_ini.sh

Test:

   #sqlplus USER\PASS@DSN
   SQL*Plus: Release 10.2.0.3.0 - Production on Mo Aug 4 11:08:02 2008
   Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.
   Verbunden mit:
   Oracle Database 10g Release 10.2.0.1.0 - Production
   SQL>_
   #isql -v DSN USER PASS
   +---------------------------------------+
   | Connected!                            |
   |                                       |
   | sql-statement                         |
   | help [tablename]                      |
   | quit                                  |
   |                                       |
   +---------------------------------------+
   SQL>_
  • Nun noch einige Links setzen, damit ./configure auch alle Bibliotheken findet:
    #ln -s /usr/include/oracle/10.2.0.3/client/nzerror.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/nzt.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/occiAQ.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/occiCommon.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/occiControl.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/occiData.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/occi.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/occiObjects.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/oci1.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/oci8dp.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ociap.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ociapr.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ocidef.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ocidem.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ocidfn.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ociextp.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/oci.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ocikpr.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ocixmldb.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/odci.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/oratypes.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/orid.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ori.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/orl.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/oro.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/ort.h /usr/lib/oracle/10.2.0.3/client/sdk/include/
    #ln -s /usr/include/oracle/10.2.0.3/client/xa.h /usr/lib/oracle/10.2.0.3/client/sdk/include/

SDE Client

* Kopieren des SDE Clients (sdk) von der Original CD
* Entpacken nach /opt/sde
* Eintragen des Pfades in die Parameter von configure
* Verlinken der Bibliotheken, da Mapserver diese sonst nicht findet (auch nicht, wenn diese korrekt in den LD_LIBRARY_PATH eingetragen sind):
   #ln -s /opt/sde/sdeexe92/lib/libsde.so /usr/lib/
   #ln -s /opt/sde/sdeexe92/lib/libpe.so /usr/lib/
   #ln -s /opt/sde/sdeexe92/lib/libsg.so /usr/lib/

Aufruf von configure:

  #!/bin/bash
  /usr/src/mapserver_5.2.0/configure \
  --enable-ignore-missing-data \
  --enable-debug \
  --with-httpd=/usr/sbin/apache2 \
  --with-fastcgi=/usr \
  --with-php=/usr/include/php5 \
  --with-threads \
  --with-gd=/usr \
  --with-freetype \
  --with-png \
  --with-jpg \
  --with-zlib \
  --with-agg \
  --with-xpm \
  --with-libiconv \
  --without-pdf \
  --without-eppl \
  --with-gdal \
  --with-ogr \
  --with-proj=/usr \
  --with-postgis \
  --with-wmsclient \
  --with-wfsclient \
  --with-wfs \
  --with-wcs \
  --with-zlib \
  --with-xpm=/usr/X11R6 \
  --with-geos \
  --with-mygis \
  --with-curl \
  --with-sos \
  --with-pkg-config \
  --with-oraclespatial=/usr/lib/oracle/10.2.0.3/client \
  --with-sde=/opt/sde/sdeexe92 \
  --with-sde-version=92 \
  --with-fribidi-config=yes
  • Compilieren der mapserver binary:
   #make

Test:

   #./mapserv
   #This script can only be used to decode form results and
   #should be initiated as a CGI process via a httpd server.

Die Binary ist jetzt erstellt und kann in das entsprechende CGI Verzeichnis kopiert werden.

  • Kopieren der Mapserver Binary und setzen der Rechte:
   #cp /usr/src/mapserver_5.2.0/mapserv /var/www/mapserver/
   #chown mymsuser.mymsgrp /var/www/mapserver/mapserv
   #chmod 750 /var/www/mapserver/mapserv
  • Kopieren der mapscript Komponente in das php extension Verzeichnis (nur, falls notwendig)
   #cp /usr/src/mapserver_5.2.0/mapscript/php3/php_mapscript.so /usr/lib/php5/20060613+lfs/

Verschlüsselung von Login-Daten

Ist die Verbindung zur Datenbank nicht verfügbar, so wird vom Mapserver eine Fehlermeldung ausgegeben. Diese enthält den Connection String, welcher wiederum das Verbindungs Passwort enthält. Aus diesem Grund werden die Passwörter verschlüsselt im Mapfile abgelegt. Hierzu wird zunächst ein Schlüssel erzeugt:

  #/usr/src/mapserver_5.2.0/msencrypt -keygen /path/to/MeinSchluessel.key

Um nun einen String zu verschlüsseln wird folgender Befehl verwendet:

  #/usr/src/mapserver_5.2.0/msencrypt -key /path/to/MeinSchluessel.key MEINPASSWORT


Im Mapfile muss nun der Schüssel folgendermassen angegeben werden:

  CONFIG MS_ENCRYPTION_KEY "/path/to/MeinSchluessel.key"

Alle sensiblen Daten im CONNECTION String (Servername, Port, Schema, Username, Passwort) können nun durch den verschlüsselten Hash in geschweiften Klammern {} ersetzt werden.

Die Mapserver Referenz schreibt zur Behandlung der entschlüsselten Informationen: Note that the decrypted string will never be stored in the layerObj, it will be kept local to the function that opens the connection and destroyed as soon as the function is done with it. This is to prevent exposing the decrypted information in error messages or in calls to msSaveMap().

Kapselung des 'map=' CGI Parameters

Um den Ort des Mapfiles nicht in den Browseraufruf zu packen wird der Mapserver über einen Wrapper aufgerufen. Dieser bedindet sich im Verzeichnis des mapservers: /var/www/mapserver

Das Script schaut folgendermaßen aus:

  #!/bin/sh
  MAPSERV="/var/www/mapserver/mapserv"
  MAPFILE="/path/to/MyMapfile.map"
  if [ "${REQUEST_METHOD}" = "GET" ]; then
    if [ -z "${QUERY_STRING}" ]; then
        QUERY_STRING="map=${MAPFILE}"
        else
        QUERY_STRING="map=${MAPFILE}&${QUERY_STRING}"
     fi
          exec ${MAPSERV}
  else
          echo "Sorry, I only understand GET requests."
      fi
  exit 1
  # End of Script

Der Aufruf erfolgt dann ohne den map= parameter, erwa so:

  http://myserver.com/MyWrapper.cgi?VERSION=1.1.1&REQUEST=getCapabilities&SERVICE=wms

Die Wrapper haben jeweils die Dateirechte 500 (Schreibschutz) und haben das immutable bit gesetzt, damit die Rechte auch nicht geändert werden können.


OWSProxy

Der OWSProxy ist ein PHP Modul, dass Teil des Mapbender Releases ist. Es dient zum Zugriff auf gesicherte Geodatendienste. Geodatendienste die mit dem UMN Mapserver bereitgestellt werden, können prinzipiell von jedem im Netz angefragt werden, vorausgesetzt, die Position des dazugehörigen MAP-Files ist bekannt. Um zu verhindern, das der Dienst ungewollt verwendet wird, wird der direkte Zugriff von außen gesperrt. Statt dessen erfolgt der Zugriff ausschließlich über den OWSProxy. Dieser verhält sich wie ein Geodatendienst und nutzt das Benutzermanagement von Mapbender. Bei einer Anfrage auf den OWSProxy prüft dieser die Authentifikation des Benutzers anhand der Mapbender Session, leitet die Anfrage an den Mapserver weiter und gibt das Ergebnis an den Client zurück.

Grundinstallation

Module

Zunächst werden durch die folgenden Befehle die verwendeten Module im Apache geladen:

  #a2enmod rewrite
  #a2enmod proxy
  #a2enmod proxy_http

Einrichten und Aktivieren der Webseite

Das Basisverzeichnis des OWSProxy ist hier beispielhaft: /var/www/mapbender/owsproxy/ . Hierfür wird ein neuer VHost: /etc/apache2/sites-available/owsproxy eingerichtet, der anschließend mit

  #a2ensite owsproxy

aktiviert wird. Der Zugriff is nur SSL-verschlüsselt möglich. Die Rewrite Rule am Ende übersetzt die Anfragen des Mapbender und leitet diese an den Proxy weiter. Als suexec Benutzer wurden die identischen Benutzer wie auch die des Mapbender gewählt. Das Logging des Rewrite Moduls dient Debugging Zwecken und sollte für die produktive Version deaktiviert werden.


  # OWSPROXY
  NameVirtualHost *:444
  <VirtualHost *:444>
       ServerAdmin diesistkeine@email.de
       SuexecUserGroup mymb mymb
       DocumentRoot /var/www/mapbender/owsproxy
  #    SSL
       SSLEngine On
       SSLCipherSuite HIGH:MEDIUM
       SSLCertificateFile    /etc/apache2/ssl/MeinZertifikat.crt
       SSLCertificateKeyFile /etc/apache2/ssl/MeinZertifikat.key
       <Directory /var/www/mapbender/owsproxy>
               Options -Indexes +MultiViews +ExecCGI
               AddHandler fcgid-script .php
               FCGIWrapper /var/www/mapbender/owsproxy/conf/php5-fcgid-htdocs .php
               DirectoryIndex index.php
               AllowOverride None
               Order allow,deny
               allow from all
       </Directory>
  ReWriteEngine On
  RewriteRule  ^.*owsproxy.([^i][\w\d]+)\/([\w\d]+)\/?$ https://10.20.30.40:444/http/index.php?sid=$1\&wms=$2\& [P,L,QSA]
  #RewriteLog "/var/log/apache2/owsproxy.rewrite.log"
  #RewriteLogLevel 2
       ErrorLog /var/log/apache2/owsproxy.error.log
       LogLevel warn
       CustomLog /var/log/apache2/access.log combined
       ServerSignature Off
  </VirtualHost>

Einrichten des Wrappers

Analog zur Mapbender Installation wird in /var/www/mapbender/owsproxy/conf/ der fcgid-wrapper und die dazugehörige php.ini abgelegt.

Konfiguration des Proxies

Bei der Konfiguration des Proxies ist es notwendig, den Zugriff prinzipiell zu gestatten und die SSL-Verschlüsselung zu aktivieren. Weiterhin ist es möglich, den Zugriff auf bestimmte IP Adressbereiche einzuschränken. Die Konfigurationsdateien des Apache2 sind modularsiert, die den Proxy betreffende Datei ist folgende: /etc/apache2/mods-available/proxy.conf

  <IfModule mod_proxy.c>
       ProxyRequests off
       SSLProxyEngine on
  # This config allows the global use of this proxy
       <Proxy *>
  #            AddDefaultCharset on
               Order Allow,Deny
               Allow from all
       </Proxy>
  # This config restricts access to a distinct LAN
  #    <Proxy *>
  #            Order Deny,Allow
  #            Deny from all
  #            Allow from 10.20.30
  #    </Proxy>
        ProxyVia Off
  </IfModule>
  • NB: Die mapbender.conf enthält ebenfalls die hardcodierte URL des owsproxies

Sichern des Geodatendienstes

Um zu verhindern, dass der Geodatendiesnt direkt aufgerufen wird, wird folgende Apache Direktive in die .htaccess Datei in das mapserver Verzeichnis gestellt:

  <Files MeinWrapper1.cgi,MeinWrapper1.cgi>
     order deny,allow
     deny from all
     allow from localhost
  </Files>

Damit wird der Zugriff nur vom lokalen Server erlaubt. Dies resultiert darin, dass der Proxy, der ja auf dem Server läuft, zugreifen darf, direkte Zugriffe von außen aber geblockt werden.

Wird der mapserver direkt angesprochen (also nicht über o.g. wrapper) und der map= parameter gesetzt, so wird der Zugriff auf das Mapfile durch die Dateirechte verhindert. Damit ist der Zugriff auf den Geodatendienst ausschließlich über den Poxy möglich und dadurch nur für authentifizierte Benutzer.

Views
Personal tools