SecureInstall
From MapbenderWiki
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.
- 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
- Oracle Instantclient als ReadHead Packages von http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html als ReadHead Packages downloaden
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.
