Gerda geht in Pension
PHP auf den Webservern des ZID

von Peter Marksteiner (Ausgabe 05/2, Oktober 2005)

 

Kasten: WWW.UNIVIE.AC.AT - Technische Daten
Kasten: PHP & MySQL zum Nachlesen

 

Ein neuer Webserver

Vor vier Jahren wurde im Comment über den neuen Webserver WWW.UNIVIE.AC.AT berichtet, der am 8. August 2001 in Betrieb ging.1) Wegen der ständig steigenden Anforderungen und der raschen technischen Entwicklung ist ein Server nach wenigen Jahren schon veraltet, sodass heuer die nächste Erneuerung fällig war. Am 12. Juni 2005 um 9 Uhr war es deshalb wieder einmal soweit: Nach zwei Stunden Betriebsunterbrechung nahm der neue Server seine Arbeit auf. Nach außen hat sich nicht viel geändert, die Hardware ist schneller und leistungsfähiger und die Software auf dem neuesten Stand (siehe Kasten WWW.UNIVIE.AC.AT - Technische Daten).

In dem erwähnten Comment-Artikel ist auch eine Übersicht über verschiedene Techniken der Programmierung am Webserver zu finden. Nur ganz einfache Webauftritte, die aus wenigen weitgehend unveränderlichen (statischen) Seiten bestehen, kommen ohne solche Programmierung aus. Alles, was darüber hinausgeht, braucht geeignete Werkzeuge, um Dokumente dynamisch zu generieren. Die Anwendungen reichen von Gästebüchern, Diskussionsforen, Online-Anmeldesystemen bis zu kompletten eCommerce-Sites mit Lagerverwaltung, Rechnungswesen und Online-Shop. Immer mehr Bedeutung gewinnen Content Management-Systeme (CMS), mit deren Hilfe komplexe Webpräsentationen, die aus vielen einzelnen Seiten bestehen, gewartet werden können.

Eine der ältesten und immer noch sehr weit verbreiteten Techniken ist das Common Gateway Interface (CGI): Dieses definiert eine Schnittstelle zwischen der Webserver-Software und einem externen Programm, das dynamisch die Dokumente erzeugt, welche von dem Server an den Klienten (Browser) geschickt werden. Für CGI-Programme kann jede beliebige Programmiersprache verwendet werden; in der Praxis wird jedoch fast ausschließlich Perl eingesetzt. CGI und Perl wurden von Anfang an auf allen Webservern des Zentralen Informatikdienstes (WWW.UNIVIE.AC.AT, WWW.UNET.UNIVIE.AC.AT, MAILBOX.UNIVIE.AC.AT bzw. seit 2004 HOMEPAGE.UNIVIE.AC.AT) unterstützt.

Seit mehreren Jahren hat Perl als Sprache für Webapplikationen an Bedeutung verloren, während PHP immer populärer wird. Immer häufiger wurde der Wunsch nach PHP-Unterstützung auf den Webservern des ZID geäußert. Nachdem es sehr schwierig ist, CGI und PHP gemeinsam in einem Multiuser-Betrieb anzubieten, ohne die Sicherheit des gesamten Systems zu gefährden (siehe weiter unten im Abschnitt Sicherer Multiuser-Betrieb...), wird seit 2001 ein eigener Webserver GERDA.UNIVIE.AC.AT für PHP-Applikationen - jedoch ohne CGI-Unterstützung - betrieben. Das Auslagern von PHP auf einen eigenen Server war jedoch eine Notlösung. Im Zuge der Umstellung der Mailbox- und Unet-Services ist es gelungen, eine Konfiguration mit PHP- und CGI-Unterstützung zu schaffen, die den Sicherheitsanforderungen genügt. Seit Anfang des Jahres 2005 wird PHP für persönliche Homepages angeboten. Im Zuge der Hardware-Erneuerung am 12. Juni 2005 wurde eine Variante dieser Lösung auch auf WWW.UNIVIE.AC.AT implementiert, sodass PHP nunmehr auf allen Webservern des Zentralen Informatikdienstes zur Verfügung steht.

WWW.UNIVIE.AC.AT - Technische Daten

Hardware:
IBM pSeries 550 mit 4 Prozessoren und 8 GB Hauptspeicher; Sun StorEdge 3510 FC Array mit 12 Platten zu je 146 GB (1,7 TB brutto Gesamtkapazität), das über Fiber Channel (2 Gbit/s) angeschlossen ist.

Software:
Betriebssystem AIX 5.2 (64 Bit); Webserver Apache 1.3.33, PHP 4.3.11, Perl 5.8.6; Datenbank-Klienten für MySQL und Oracle; C/C++-Compiler gcc 3.3.5 und IBM VAC 5.02.

Was ist PHP?

PHP hat vor kurzem den 10. Geburtstag gefeiert: Am 8. Juni 1995 wurden die PHP Tools 1.0 veröffentlicht, ein Satz von in C geschriebenen Werkzeugen zum Bearbeiten von Webseiten, der aus einer Sammlung von Perl-Skripts mit dem Namen PHP/FI (Personal Homepage/Forms Interpreter) hervorgegangen war. In den folgenden Jahren wurde PHP ständig weiterentwickelt und wurde bald eine selbständige Sprache. Der Durchbruch kam 1998 mit der Freigabe von PHP 3.0. Diese Version war gegenüber allen Vorgängerversionen stark erweitert und begann rasch das Web zu erobern. Die Sprache erhielt auch einen neuen Namen: PHP steht nunmehr für PHP: Hypertext Preprocessor - das ist ein so genanntes rekursives Akronym, das sich selbst definiert. Praktisch gleichzeitig wurde mit der Entwicklung der nächsten Version begonnen. Aufgrund der historischen Entwicklung hatte sich in PHP mancher Ballast angesammelt, sodass der Kern der Software von Grund auf neu geschrieben wurde. Dieser neue Kern erhielt den Namen Zend Engine. PHP 4.0, das auf der Zend Engine 1.0 basiert, wurde im Mai 2000 offiziell freigegeben. Version 4 teilte jedoch das Schicksal von Version 3: Kaum war sie veröffentlicht, wurde damit begonnen, den Kern neu zu schreiben. Im Juli 2004 wurde PHP 5.0 freigegeben; diese Version beruht auf der Zend Engine 2.0. PHP 4 und PHP 5 sind nicht vollständig kompatibel. Daher wurden weltweit erst relativ wenige Applikationen auf PHP 5 umgestellt. Auch auf den Webservern des ZID ist derzeit Version 4 im Einsatz.2) Beide Versionen werden noch gewartet und weiterentwickelt, die neuesten Releases sind 4.4.0 und 5.0.4. PHP ist eine vollwertige Programmiersprache und kann für (fast) alles und jedes verwendet werden, in der Praxis wird sie jedoch beinahe ausschließlich für Webapplikationen eingesetzt. Im Wesentlichen gibt es drei Möglichkeiten, wie PHP-Programme ausgeführt werden können:

  • als selbständige Programme ohne Zusammenhang mit einem Webserver (z.B. über die Kommandozeile),
  • als CGI-Skripts,
  • Ausführung durch einen Webserver mit spezieller PHP-Unterstützung, insbesondere durch das Apache-Modul mod_php.

Wenn im Folgenden von "PHP" die Rede ist, so ist damit stets die dritte Variante gemeint. Die unmittelbare Ausführung durch den Webserver ist wesentlich effizienter als das Starten eines externen Programms über die CGI-Schnittstelle. PHP-Skripts sind üblicherweise in HTML-Dokumente eingebettet (siehe Abb. 1). Diese Skripts werden vom Webserver ausgeführt und liefern als Ergebnis meistens HTML-Code, der vom Webserver an den Klienten geschickt und von diesem grafisch dargestellt wird.

Abb. 1: Beispiel eines einfachen PHP-Skripts,

Sicherer Multiuser-Betrieb mit PHP und CGI - eine Herausforderung

Webseiten, die dynamisch von Programmen generiert werden, sind prinzipiell ein Sicherheitsrisiko, egal welche Programmiersprachen und Techniken verwendet werden: Jeder Klient auf der ganzen Welt hat dadurch die Möglichkeit, ein Programm auf dem Server auszuführen. Ein solches Programm muss sehr sorgfältig geschrieben sein, um alle möglichen Lücken abzudichten, über die ein Eindringling Schaden anrichten kann.

Je weiter verbreitet eine Software ist, desto attraktiver ist sie auch als Angriffsziel; PHP ist infolgedessen besonders gefährdet. Zahlreiche populäre PHP-Applikationen haben bekannte Sicherheitslücken, und auch wenn diese meistens von den jeweiligen Herstellern bald gestopft werden, sind dennoch auf vielen Servern die ungeschützten Versionen im Einsatz. Hacker gehen systematisch vor und durchsuchen das Web nach bekannten Lücken, über die sie eindringen können.

In einem Multiuser-Betrieb wie auf den Webservern des ZID gibt es eine weitere Schwierigkeit: Wenn jemand durch ein fehlerhaftes Skript einem Angreifer die Möglichkeit gibt, seine Daten zu zerstören, so ist das im Wesentlichen sein Problem. Viel gravierender ist es jedoch, wenn dadurch auch die Daten anderer zu Schaden kommen können.

Ein Webserver läuft mit den Berechtigungen eines bestimmten Users, und diese müssen notgedrungen ziemlich weitreichend sein: Der Server muss Lesezugriff auf alle HTML-Dokumente, Skripts usw. haben sowie Lese- und Schreibzugriff auf alle Dateien, die von Skripts angelegt und bearbeitet werden (ausgenommen CGI-Skripts mit suEXEC-Wrapper, siehe unten). Aus diesem Grund wird in der Dokumentation vieler Skripts empfohlen, alle Dateien world-writable zu machen, also Schreibzugriff generell zu erlauben. Es leuchtet ein, dass dermaßen "weltoffene" Berechtigungen vom Standpunkt der Sicherheit höchst bedenklich sind. Deshalb wurde sehr viel Arbeit investiert, die Webserver des ZID so zu konfigurieren, dass ein genereller Schreibzugriff nicht notwendig ist und die Daten aller BenutzerInnen somit vor dem - irrtümlichen oder absichtlichen - Zugriff aller anderen geschützt sind.

Für CGI-Skripts bietet der Webserver Apache eine Lösung: den so genannten suEXEC-Wrapper, der dafür sorgt, dass CGI-Skripts nicht mit den Privilegien des Webservers, sondern mit den Privilegien des Eigentümers des Skripts ausgeführt werden. Diese Berechtigungen sind viel weniger weitreichend, sodass ein unerwünschter Eindringling weniger Schaden anrichten kann.3) Auch können damit leicht Beschränkungen jener Ressourcen (CPU-Zeit, Speicher usw.) implementiert werden, die ein Skript verbrauchen darf: So wird z.B. verhindert, dass ein "wild gewordenes" Skript den ganzen Server lahm legt.

PHP bietet einige Konfigurationsparameter an, mit denen man für einen einigermaßen sicheren Multiuser-Betrieb sorgen kann:

  • Im so genannten Safe Mode dürfen PHP-Skripts nur Dateien lesen und bearbeiten, die den gleichen Eigentümer aufweisen wie das Skript selbst.
  • Mit dem Parameter open_basedir kann der Zugriff auf Dateien beschränkt werden, die sich in einem bestimmten Verzeichnis oder in dessen Unterverzeichnissen befinden.

Auf den Webservern des ZID ist der Safe Mode aktiviert, mittels open_basedir hat jeder Benutzer nur Zugriff auf sein eigenes php-Verzeichnis sowie auf das /tmp-Verzeichnis (letzteres ist für das Hochladen von Dateien erforderlich).

Nachdem CGI und PHP ganz unterschiedliche Sicherheitsanforderungen haben, laufen auf den Servern des ZID dafür zwei getrennte Webserver. Wie diese im Detail funktionieren, ist im nächsten Abschnitt beschrieben.

Die Konfiguration der Webserver des ZID

Persönliche Webseiten

Die Webserver HOMEPAGE.UNIVIE.AC.AT (für Mailbox-BenutzerInnen) und WWW.UNET.UNIVIE.AC.AT (für Unet-BenutzerInnen) sind in Wirklichkeit so genannte Proxies: Sie beantworten die Anfragen der Klienten nicht selbst, sondern leiten sie an andere Server weiter. Diese "eigentlichen" Webserver laufen auf den Fileservern FS1.UNIVIE.AC.AT (Mailbox) bzw. FS1.UNET.UNIVIE.AC.AT (Unet), wo auch die Daten aller persönlichen Homepages gespeichert sind. Durch diese Proxy-Lösung ist eine saubere Trennung von PHP und CGI sehr leicht möglich: Auf jedem der beiden Fileserver laufen zwei getrennte Webserver, von denen nur einer PHP unterstützt.4) Der Proxy leitet alle Anfragen, die Dokumente im Unterverzeichnis php5) betreffen, an diesen Server weiter. Alle anderen Anfragen werden vom zweiten Server - mit CGI-, aber ohne PHP-Unterstützung - beantwortet. Die beiden Webserver laufen als unterschiedliche Benutzer, und keiner hat Lese- oder Schreibrechte auf die Daten, auf die der andere zugreifen darf. Die Trennung in zwei Webserver hat auch den Vorteil, dass das Gesamtsystem dadurch robuster wird: Falls einer der Server Probleme hat (z.B. Performance-Einbußen durch Überlastung oder fehlerhafte Skripts), so beeinträchtigt das den anderen kaum.

Weder auf die Webserver noch auf die Fileserver ist ein direkter Zugriff mittels SSH/Telnet oder SFTP/FTP möglich. Dieser Zugriff erfolgt über die Server LOGIN.UNIVIE.AC.AT (Mailbox) bzw. LOGIN.UNET.UNIVIE.AC.AT (Unet). Dort befindet sich das Unterverzeichnis html auf einem so genannten CIFS-Filesystem.6) Das hat unter anderem zur Folge, dass das Ändern der Berechtigungen von Dateien (mit dem Unix-Befehl chmod) nicht möglich ist. Auch stimmen die Berechtigungen, die man mit dem Befehl ls -l sieht, nicht mit den "wahren" Berechtigungen am Fileserver überein. In den meisten Fällen haben alle Dokumente und Skripts - PHP oder CGI - automatisch die erforderlichen Berechtigungen. Probleme gibt es nur mit Dateien, die über PHP-Skripts angelegt werden: Diese gehören dem Benutzer, als der der Webserver läuft, und nicht dem Eigentümer des Skripts. Wegen der oben beschriebenen Restriktionen des Safe Mode kann ein PHP-Skript nicht einmal eine Datei lesen, die es selbst angelegt hat. Das und alle falschen Berechtigungen im Verzeichnis php können durch Aufruf der Webmaske www.univie.ac.at/ZID/php-perm/ repariert werden.

Instituts-Webseiten

Nachdem sich die oben beschriebene Proxy-Lösung sehr bewährt hat, wurde sie mit leichten Modifikationen am Server WWW.UNIVIE.AC.AT ebenfalls implementiert. Auch auf diesem Rechner laufen zwei Webserver: Ein Server nimmt alle Anfragen an den Standard-Port 80 entgegen und beantwortet die meisten davon selbst. Anfragen, die PHP-Unterstützung erfordern, leitet er als Proxy an den zweiten Server weiter.

Für die Konfiguration von Benutzer-Accounts gibt es drei Möglichkeiten:

  • überhaupt keine Unterstützung für PHP (das ist die Standard-Einstellung),
  • Unterstützung für PHP nur im Unterverzeichnis php,
  • überall Unterstützung für PHP. In diesem Fall können jedoch keine CGI-Skripts ausgeführt werden.

Wenn Sie einen neuen Account beantragen, geben Sie bitte an, welche dieser drei Varianten Sie wünschen. Auch nachträgliche Änderungen sind möglich.

Die beschriebene Proxy-Konfiguration hat zur Folge, dass sowohl bei persönlichen als auch bei Instituts-Webseiten einige Details anders als gewohnt funktionieren. Beispielsweise lautet der vollständige Pfadname des PHP-Verzeichnisses (z.B. zur Angabe einer .htuser-Datei)

  • auf WWW.UNIVIE.AC.AT: /u/www/php/userid
  • auf HOMEPAGE.UNIVIE.AC.AT: /home/php/userid
  • auf WWW.UNET.UNIVIE.AC.AT: /u/userx/php/userid, wobei x die letzte Ziffer der Matrikelnummer ist (z.B. /u/user7/php/a1234567)

Auch bei Weiterleitungen (Redirects) in einer

.htaccess-Datei ist für die weiterzuleitenden URLs eine

spezielle Schreibweise erforderlich; Einzelheiten dazu finden Sie unter www.univie.ac.at/ZID/phpmysql/.

Datenbanken: MySQL & Co.

Für viele Webapplikationen ist eine Datenbank die perfekte Ergänzung. Die in Kombination mit PHP mit Abstand beliebteste Datenbank ist MySQL. Zwar ist MySQL wegen einiger fehlender Features - vor allem Referenzintegrität und mangelhafter Transaktionsunterstützung - für kommerzielle Anwendungen nur bedingt geeignet, für viele Webprojekte ist es jedoch die Datenbank der Wahl: MySQL ist in einer kostenlosen OS-Version erhältlich; es ist von allen SQL-Dialekten am leichtesten zu erlernen; vor allem bei Applikationen, wo Lesezugriffe gegenüber Schreibzugriffen überwiegen, ist MySQL oft unschlagbar schnell. Für die heutzutage wohl häufigste Programmierumgebung auf Webservern wird das Akronym LAMP verwendet: Linux - Apache - MySQL - PHP. Die meisten für eine LAMP-Umgebung entwickelten Anwendungen und Pakete lassen sich ohne Probleme auf den Webservern des ZID installieren, obwohl das Betriebssystem hier AIX und nicht Linux ist. Nachdem auch das Perl-Modul DBD::MySQL installiert ist, können MySQL-Datenbanken auch von in Perl geschriebenen CGI-Skripts verwendet werden.

Verglichen mit Text-Dateien (flat files) ist bei Datenbanken der Programmieraufwand höher, macht sich aber bald durch höhere Flexibilität und bessere Performance bezahlt. Auch die oben erwähnten Probleme mit Berechtigungen von Dateien entfallen bei Datenbank-Applikationen.

Nachdem zahlreiche PHP-Applikationen dennoch ohne MySQL auskommen, wird weder für persönliche Homepages noch für Instituts-Webseiten automatisch eine MySQL-Datenbank angelegt. Das Anlegen einer Datenbank geschieht vielmehr über die Webmaske www.univie.ac.at/ZID/mysql/. Der Name der Datenbank ist gleich dem Benutzernamen, das Passwort wählen Sie selbst, und der Hostname des Datenbank-Servers lautet MYSQL.UNIVIE.AC.AT. Mit derselben Webmaske können Sie auch das MySQL-Passwort ändern oder die Datenbank wieder löschen. Für Datenbank-Anforderungen, die über die Funktion dieser Webmaske hinausgehen (z.B. mehr als eine Datenbank pro Account) wenden Sie sich bitte an die WWW-Administration.

Ein beliebtes Werkzeug zur Verwaltung von MySQL-Datenbanken ist PHPmyAdmin: Damit lassen sich über eine komfortable Webschnittstelle neue Tabellen anlegen, die Strukturen bestehender Tabellen anzeigen und vieles andere mehr. PHPmyAdmin steht unter www.univie.ac.at/ZID/phpmyadmin/ zur Verfügung.

Dokumentation & Support

Die Literatur zu PHP und MySQL ist unüberschaubar. Eine Auswahl der wichtigsten Online-Ressourcen, Lehr- und Handbücher ist - ohne Anspruch auf Vollständigkeit - im Kasten PHP & MySQL zum Nachlesen zu finden. Details zur Konfiguration und den Besonderheiten der Webserver des ZID sind unter www.univie.ac.at/ZID/www/ beschrieben (speziell zu PHP und MySQL siehe www.univie.ac.at/ZID/phpmysql/).

Bei Problemen mit PHP- oder CGI-Skripts, MySQL-Datenbanken usw. wenden Sie sich bitte an den Helpdesk (eMail: helpdesk.zid@univie.ac.at). Bitte beachten Sie, dass die Fehlersuche (Debugging) in fremden Programmen oder gar das Adaptieren von kompletten Applikationen eine komplexe und zeitraubende Aufgabe ist, die weit über die Routine-Tätigkeiten des Helpdesk hinausgeht. Wir sind bemüht, alle Probleme so weit wie möglich zu lösen, können aber keinerlei Garantien abgeben. Auf jeden Fall sind ausreichende Programmierkenntnisse erforderlich, wenn Sie PHP-Applikationen betreiben wollen.

Zum Erfahrungsaustausch und zur gegenseitigen Unterstützung hat der ZID ein Diskussionsforum zum Thema PHP & MySQL eingerichtet (nähere Informationen dazu finden Sie im Artikel Foren, die die Welt bedeuten).

Altersteilzeit für Gerda?

Der Server GERDA.UNIVIE.AC.AT wurde eigens für PHP- und MySQL-Applikationen geschaffen. Nachdem PHP und MySQL nunmehr auf allen Webservern des ZID zur Verfügung stehen, hat "die Gerda" ihre Daseinsberechtigung verloren und wird aufgelassen.

Seit Juni 2005 werden keine neuen Benutzungsberechtigungen mehr vergeben; die bestehenden Accounts sollten nach und nach auf WWW.UNIVIE.AC.AT übersiedelt werden. Dort stehen auch einige Services zur Verfügung, die aus technischen und organisatorischen Gründen auf GERDA.UNIVIE.AC.AT nicht angeboten werden konnten:

  • Secure HTTP (https),
  • vollständige Logfiles und automatische Erstellung von Zugriffsstatistiken,
  • erweiterte Möglichkeiten der Zugangskontrolle zu einzelnen Seiten (z.B. mittels Unet- oder Mailbox-Passwörtern, siehe www.univie.ac.at/ZID/www-htaccess/).

Die Webservices auf GERDA.UNIVIE.AC.AT werden im nächsten Jahr endgültig abgeschaltet, der genaue Termin wird noch bekannt gegeben werden. Nachdem die Hardware des Servers erst im November 2003 erneuert wurde,7) ist Gerda - trotz der kurzen Lebenszeiten und raschen Erneuerungszyklen im Server-Bereich - mit einem Alter von weniger als zwei Jahren noch lange keine pensionsreife alte Dame: Als Datenbank-Server MYSQL.UNIVIE.AC.AT wird sie noch längere Zeit gute Dienste tun.

PHP & MySQL zum Nachlesen

 

 

1) siehe Comment 01/3, Seite 16

2) Wann es ein Upgrade auf Version 5 geben wird, steht noch nicht fest; der Wechsel wird jedoch rechtzeitig angekündigt und Hilfe bei der Umstellung geboten werden.

Weitere Details dazu sind im Kapitel Sicherheit des eingangs erwähnten Comment-Artikels zu finden.

3) Am Server FS1.UNET.UNIVIE.AC.AT laufen aus Performance-Gründen sogar zehn Webserver, die PHP unterstützen.

4) Das Unterverzeichnis php des Verzeichnisses html ist in Wirklichkeit ein symbolischer Link. Bitte löschen Sie es nicht, dadurch geht der Link verloren!

5) siehe Artikel Fileservices: Willkommen in der Daten-Bank

6) siehe Comment 04/1, Seite 38