Tag: server

IPv6-Day

Morgen, am 8. Juni 2011, findet der diesjährige IPv6 Day statt. Wiedereinmal ein IPv6-Tag.
Und viele Sites, darunter auch die Webauftritte an der Uni Erlangen, zeigen, daß es prinzipiell längst möglich und üblich sein könnte. Via Ipv4 werden die vom RRZE betreuten Webauftritte über die Adresse 131.188.16.200 erreichbar gehalten.
Sie können jedoch auch über der IP-Adresse 2001:638:a00:188::83bc:1053 erreicht werden. Von Seitens der Apache-Server brauchte hierzu keinerlei Änderung der Konfiguration vorgenommen werden, da die ca. 600 virtuellen Hosts über NameVirtualHost und nicht über eine “flatterhafte” IP-Adresse definiert sind.
Die einzigen, die was tun mussten, waren die DNS-Admins und der Sysadmin, die entsprechende Konfigurationseinträge für DNS und Server aktivieren mussten.

Warum also ist IPv6 also überhaupt ein Problem, wenn es doch nur um lässliche Konfiguration geht? Und warum machen wir es nicht via DNS per Default? Warum ist schon wieder ein weltweiter IPv6-Tag notwendig?

Ich sehe zwei Gründe:
Zum einen ist es eine “natürliche” Scheu bzw. Vorsicht, die gerade im Netzbereich vorherscht, bei der Umstellung auf neuen Protokollen. IPv4 ist nunmal langbewährt und stabil. Man kan gelernt damit umzugehen und zu leben. IPv6 dagegen ist ungewohnt und man ist sich nicht sicher, ob es da draußen nicht doch noch wichtige Kunden oder Anwendungen gibt, die damit Probleme haben. Vergleichbar erscheint mir hier die Situation bei Webentwicklern, die vor der Entscheidung standen, endlich den IE6-Support einzustellen.
Wenn die Entscheidung getroffen wurde, muss man sie dann auch durchziehen. Auch wenn irgendwann ein paar ewig veraltete Systeme auftauchen die angeblich nicht aktualisiert werden können; Die Entscheidung, den IE6 und NS4 nicht mehr zu berücksichtigen hat sich später für alle Beteiligten als richtig und fruchtbar erwiesen.
Inzwischen haben sogar größere Firmen, wie bspw. Google, aus den Erfahrungen den Wagemut gewonnen, bei zukünftigen Websites noch viel früher den Support für alte Browsersysteme aufzugeben.

Meines Erachtens fehlt es im Bereich der Netzwerkadministration noch an einer ähnlich Erfahrung, beim Abschneiden alter Zöpfe. (Anmerkung: Stimmt aber nicht ganz. Vor IPv4 gab es auch andere Protokolle; Allerdings gibt es kaum Netzwerkadministratoren, die damals, vor über 17 Jahren, schon dabei waren. Und die Reichweite von Entscheidungen lokaler Administratoren war auch eine andere). Also: Es gibt nichts Gutes, außer man tut es.

Der andere Grund ist fast unglaubhaft: Einige Hersteller von Netzwerkgeräten und hardwarebasierten Lastverteilern bieten bis heute noch immer kein zufriedenstellenden IPv6-Support. Andere wollen sich damit eine goldene Nase verdienen, indem Sie dafür Lizenzgeld verlangen, daß die entsprechende und vorhandene Funktion in Geräten schlichtweg nur eingeschaltet werden kann.
In meinem eigenen Arbeitsbereich fällt hier die Cisco ACE Application Control Engine auf, bei der die Unterstützung von IPv6 mehr schlecht als recht ist. Und dies bei einem Gerät, welches aktuell vertrieben wird und nicht etwa vor 10 Jahren ausgeliefert wurde.

Auch hier muss es Besserung geben. Möglicherweise fehlt es auch hier nur eines Vorreiters, der es einfach per Default anbietet, damit die anderen nachziehen und auf ihre vermeintlichen finanziellen Gewinnerzielungsstrategien verzichten müssen.

Wie auch immer: Ich wünsch dem IPv6-Day alles Gute und damit ein baldiges Ende: Das wir diesen Tag hoffentlich bald nicht mehr haben brauchen, um IPv6 zu fördern, sondern das IPv6 ein Netz-Default wird.

Kommentare deaktiviert :, , , , Mehr...

Server-Umzug

Ich bin derzeit dabei ein paar meiner Server und Webpräsenzen auf ein Server umzuziehen. Dazu gehört auch dieses Blog. Wer diese Nachricht sieht, befindet sich schon auf den neuen Server. :)

Beim WordPress ist es etwas heikel, weil ich es auch auf ein Multiblog umstelle und daher ein paar Sachen neu konfigurieren und testen muss.

Kommentare deaktiviert : Mehr...

Wie nutzt man ACLs (Access Control Lists) richtig?

(Oder: “Warum zum Geier geht der sch**** nicht!?!??!?!”)

Einleitung

ACLs (Access Control Listen) sind eine Erweiterung fuer die ueblichen Unix-Zugriffsrechte von Dateien und Verzeichnisse. Waehrend die ueblichen Zugriffsrechte, die mittels chmod, chgrp und umask gesetzt werden, nur 3 Gruppen kennen (User, Group, Global), sind ACLs eigene Listen, die unabhaengig von Unix-Gruppen Benutzern verschiedene Rechte fuer Dateien und Verzeichnisse zuweisen koennen.

ACLs eignen sich hervoragend dazu, Dateien und Verzeichnisse auf Webservern zu schuetzen, die zwar vom WWW-User (also der User unter dem der Webserver laeuft) und dem Owner gelesen werden koennen sollen, aber sonst von niemanden anderem. (Und auch nicht von den CGI- und PHP-Skripten der anderen User auf dem System).
Ein typisches Problem auf Nicht-Dedizierten Servern mit mehreren Domains ist nämlich das folgende: Zwar kann ein User A seine Verzeichnisse und Dateien mittels HTACCESS gegen Webzugriffe schuetzen, doch was nutzt dies, wenn der User B ueber das Filesystem direkt die Datei lesen kann? Oder noch schlimmer: Wenn der User B ein CGI- oder PHP-Skript im Einsatz hat, welches es -bei genuegend dummer Serverkonfiguration- erlaubt, dass man beliebige Files im ganzen Dateisystem lesen kann, unabhaengig von der eigenen DocumentRoot.

Der herkoemmliche Schutz ueber CHMOD ist somit oft nicht ausreichend. Man koennte zwar auf die Idee kommen, dass der WWW-User und der jeweilige User jeweils in einer eigenen Unix-Gruppe gesetzt werden, aber dies ist auf Dauer nicht praktikabel: Fuer jeden neuen User muesste eine eigene Gruppe angelegt werden. Und der Webserver muss in diese rein. Dumm nur, dass es nicht moeglich ist, Mitglied in beliebig vielen Gruppen zu sein…

ACLs sind die Alternative und die Loesung zu dieser Situation. (Will man nicht auf eine Architektur aus dedizierten Servern umschwenken.) setfacl erlaubt das Setzen von zusaetzlichen Zugriffsrechten auf Dateien und Verzeichnissen.
Mittels getfacl kann man sich die aktuelle ACL einer Datei oder eines Verzeichnisses anzeigen lassen.

Beispiele

  1. ACL fuer eine Datei oder ein Verzeichnis (ohne Vererbung!) vergeben

    Vorheriger Status:

    -rw-r-----   1 xwolf   sbadmin           0 Jan 29 16:58 blafasel

    Benutzer xbaer soll nun ebenfalls schreiben koennen:

    > setfacl -m user:xbaer:rw-,mask:rw- blafasel

    Neue ‘ls -la’ -Anzeige:

    rw-r-----+  1 xwolf   sbadmin           0 Jan 29 16:58 blafasel

    Wir wollen es genauer wissen:

    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:xbaer:rw-         	#effective:rw-
    group::r--              #effective:r--
    mask:rw-
    other:---

    Der Benutzer hat nun das Recht erhalten, die Datei zu edieren. Ausserdem wurde eine Maske gesetzt, die festlegt, wieviel Rechte maximal ueberhaupt vergeben werden koennen: mask:rw-
    Setzt man nun fuer einen Dritten User folgendes:

          > setfacl -m user:www:rwx blafasel

    verhindert die Maske rw-, dass das ‘x’-Flag aktiv wirken kann. Dies wird auch bei der getfacl-Anzeige sichtbar:

    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:www:rwx            #effective:rw-
    user:xbaer:rw-         	#effective:rw-
    group::r--              #effective:r--
    mask:rw-
    other:---

    Man beachte den Kommentar: #effective:rw-
    Man kann mit also Hilfe der Maske, ohne das man eine moegliche Liste an usern aendert, quasi wie ein Schalter alle rechte einschraenken:

    > setfacl -m mask:r-- blafasel
    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:www:rwx            #effective:r--
    user:xbaer:rw-         	#effective:r--
    group::r--              #effective:r--
    mask:r--
    other:---
  2. Mit Hilfe der Option -d kann man einzelne User wieder aus der Liste entfernen:

    > setfacl -d user:www blafasel
    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:xbaer:rw-         	#effective:r--
    group::r--              #effective:r--
    mask:r--
    other:---
  3. Vererbbare ACLs fuer Verzeichnisse setzen

    Wenn man, wie oben beschrieben ein ACL auf ein Verzeichnis setzt, werden die ACLs nur fuer das Verzeichnis als solches wirksam. Nicht jedoch auf neue Dateien, die spaeter im Verzeichnis angelegt werden.
    Im Unterschied zum bekannten s-Bit wurde betreff ACLs etwas neues eingefuehrt: Default-ACLs.
    Die Default-ACLs koennen nur auf Verzeichnisse vergeben werden. Sie definieren, welche ACLs automatisch auf neue Unterverzeichnisse oder Dateien gesetzt werden. (Uebrigens ist die Standard-Manual an dieser Stelle etwas unzureichend. Deswegen gibt es auch hier die meisten Verwirrungen und Probleme.)
    Setzen einer vererbbaren ACL auf ein Verzeichnis:

    > ls -la
    ...
    drwxr-x---   2 xwolf   sbadmin         512 Jan 29 17:16 blub
    ...
    
    > setfacl -s user::rwx,group::r-x,mask:rwx,other:---, default:user::rwx,default:group::r-x,
    default:mask:rwx,default:other:--- blub

    Zur Erklaerung:
    Im ersten Teil ‘user::rwx,group::r-x,mask:rwx,other:—’ werden die normalen ACLs fuer das Verzeichnis gesetzt. Hier also: der normale User darf alles (rwx), die Group nur lesen (r-x), alle anderen nichts (—). Und die Maske ist so, dass zusaetzliche Eintraege spaeter alle Rechte bekommen koennen (rwx).
    Man beachte hierbei: Wenn bei der Syntax User, Group oder Other keine UID oder GUID angegeben ist, wird der Benutzer und die Group genommen, die bereits vorliegen. Also im obigen Fall User ‘xwolf’ und Group ‘sbadmin’.
    Im zweiten Teil werden die Default-ACLs definiert, die fuer neue Dateien und Verzeichnisse im blub-Verzeichniss gelten: default:user::rwx,default:group::r-x,default:mask:rwx,default:other:---
    Die Syntax sollte recht selbsterklaerend sein.
    Was ist zu beachten:

    • Beim Setzen der Default-ACLs muss das ACL mit der Option -s neu gesetzt werden.
    • Die Reihenfolge und Vollstaendigkeit der Definition ist wichtig! Vergisst man z.B. die Default-Group ‘others’, kriegt man folgende Fehlermeldung:
       > setfacl -s user::rwx,group::r-x,mask:rwx,other:---, default:user::rwx,default:user:www:r-x,
      default:user:xbaer:rwx,default:group::r-x,default:mask:rwx blub
      Missing user/group owner, other, mask entry
      aclcnt 9, file blub

      (Das kann extrem nervig werden, wenn man nicht aufpasst. An dieser Stelle sollten die Systemprogrammierer etwas merh Usability in der Fehlerausgabe machen…)

    • Beim setzen zusaetzlicher Default-Eintraege sollte man sich an die Reihenfolge halten! Auch muss man hier wieder mit der Option ‘-s’ arbeiten. Die Modify-Option ‘-m’ ist wie gesagt nicht ausreichend.

    Wenn ich nun will, dass bei der Default-ACL weitere Angaben stehen, muss ich die gesamte ACL explizit neu setzen.
    Beispelsweise moechte ich den User xbaer und www im Default haben:

    > setfacl -s user::rwx,group::r-x,mask:rwx,other:---,
    default:user::rwx,default:user:xbaer:rwx,default:user:www:r-x,
    default:group::r-x,default:mask:rwx,default:other:--- blub
    > getfacl blub
    
    # file: blub
    # owner: xwolf
    # group: sbadmin
    user::rwx
    group::r-x              #effective:r-x
    mask:rwx
    other:---
    default:user::rwx
    default:user:www:r-x
    default:user:xbaer:rwx
    default:group::r-x
    default:mask:rwx
    default:other:---

    Hier ein Beleg dafuer, dass obige Aussage mit der Vererbbarkeit stimmt:

    > cd blub
    > touch platsch
    > getfacl platsch
    
    # file: platsch
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:www:r-x            #effective:r--
    user:xbaer:rwx         #effective:rw-
    group::r--              #effective:r--
    mask:rw-
    other:---

    Das gilt auch fuer Verzeichnisse:

    > mkdir wasser
    > getfacl wasser
    
    # file: wasser
    # owner: xwolf
    # group: sbadmin
    user::rwx
    user:www:r-x            #effective:r-x
    user:xbaer:rwx         #effective:rwx
    group::r-x              #effective:r-x
    mask:rwx
    other:---
    default:user::rwx
    default:user:www:r-x
    default:user:xbaer:rwx
    default:group::r-x
    default:mask:rwx
    default:other:---

    Wie man sieht, funktioniert die Vererbbarkeit eigentlich sehr schoen. Wenn man dann mal nur aufpasst mit der Syntax des Befehls! Aber dazu gibt es eine Hilfe, wie das folgende Beispiel zeigt.

  4. Einfacheres Setzen von ACLs über ACL-Dateien

    Wie oben bemerkt ist das Setzen von ACLs, inbesondere wenn sie sich wiederholen und gleichzeitig lang ist, eine nervige und muehsame Sache. Insbesondere fuer die Finger, die nach dem Dritten fehlgeschlagenen Versuch den aufsteigenden Aerger an der Tastatur auslassen.
    (Aber vielleicht ist das Strategie von Sun. Neue Tastaturen bringen Geld…)
    Die Option -f erlaubt es, ACLs aus einer Datei zu lesen und dann zu setzen. Angenommen, ich will ein weiteres Verzeichnis mit ACls versehen, neben ‘blub’:

    >  ls -la
    drwxr-x---+  3 xwolf   sbadmin         512 Jan 29 17:30 blub
    drwxr-x---   2 xwolf   sbadmin         512 Jan 29 17:37 dumdidum

    dumdidum soll dieselben Rechte bekommen wie blub.

    1. Erste Lösung (fast schon gut):
      > getfacl blub > blub.acls
      > setfacl -f blub.acls dumdidum
      > getfacl dumdidum
      
      # file: dumdidum
      # owner: xwolf
      # group: sbadmin
      user::rwx
      group::r-x              #effective:r-x
      mask:rwx
      other:---
      default:user::rwx
      default:user:www:r-x
      default:user:xbaer:rwx
      default:group::r-x
      default:mask:rwx
      default:other:---

      Klappt, wackelt und hat Luft! Man koennte zufrieden sein. Es geht aber besser.

    2. Ohne Umweg ueber eine Datei sondern über STDIN:
      > getfacl blub | setfacl -f - dumdidum
      > getfacl dumdidum
      
      # file: dumdidum
      # owner: xwolf
      # group: sbadmin
      user::rwx
      group::r-x              #effective:r-x
      mask:rwx
      other:---
      default:user::rwx
      default:user:www:r-x
      default:user:xbaer:rwx
      default:group::r-x
      default:mask:rwx
      default:other:---

    Und auch diesmal hat es geklappt!

  5. ACLs entfernen

    Manch einer kommt mit ACLs nicht zurecht und will sie loswerden. Und das stellt sich dann als schwierig raus (insbesondere bei Verzeichnissen mit Default-ACLs), wenn man eh schon Probleme mit ACLs hat.
    Folgender Aufruf erweist sich jedoch als zuverlässig:

    > setfacl -s u::rwx,g::r--,mask:rw-,other:---

    Hierfuer lohnt es sich uebrigens ein Alias zu setzen.
    Man muss unterscheiden, ob es sich um ein Verzeichnis, eine ausführbare Datei, oder einen normale Datei handelt und sollte gegebenenfalls die x Rechte im Falle eines Verzeichnisses bei group und mask nicht zurücksetzen bzw. falls es eine normale Datei ist, bei user nicht setzen.
    Insbesondere gilt dies, wenn man mit dem Kommando ‘find’ die ACL’s eines ganzen Verzeichnisbaumes aendert. Das entfernen der ACLs für einen ganzen Teilbaum kann dann nach diesem Rezept erfolgen:

    1. Man nehme ein schönes Verzeichnis ohne ACLs oder mit den ACLs, die man für seinen Teilbaum haben will:
      getfacl good_dir > /tmp/gooddir.acls
    2. Man startet ein find auf dem Teilbaum:
      find /mein/verwurschtelter/Teilbaum -type d -exec setfacl -f /tmp/gooddir.acls {} \;

    Um ganz auf Nummer sicher zu gehen, kann man sich den Baum vorher mit tar sichern, wichtig dabei ist aber auch beim Erzeugen des tar Archivs die option -p anzugeben, da sonst die ACL´s verloren gehen.Weitere Beispiele: http://www.cs.indiana.edu/Facilities/software/ACL.html

    Was muss man bei CHMOD beachten?

    ACLs und CHMOD arbeiten eigentlich ganz gut zusammen. Man muss nur eines beachten: Die Mask einer ACL haengt an den Gruppenrechten, die man mittels CHMOD setzt.
    Beispiel:

    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:xbaer:rw-         	#effective:r--
    group::r--              #effective:r--
    mask:r--
    other:---

    Die Maske ist auf ‘r’. Ist nicht so schön fuer den User. Mit ‘ls -la’ sieht dieselbe Datei so aus:

    -rw-r-----+  1 xwolf   sbadmin           0 Jan 29 16:58 blafasel

    Und nun spielen wir mal etwas mit CHMOD:

    > chmod 664  blafasel
    > ls -la
    -rw-rw-r--+  1 xwolf   sbadmin           0 Jan 29 16:58 blafasel
    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:xbaer:rw-         	#effective:rw-
    group::rw-              #effective:rw-
    mask:rw-
    other:r--

    Wie man sieht, hat das CHMOD dafuer gesorgt, das auch die Mask ein Write-Recht bekommen hat. Dies hat dann entsprechende Wirkung auf die User-Einträge. Dies zeigt es noch besser:

    > chmod g-rw blafasel
    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:xbaer:rw-         	#effective:---
    group::---              #effective:---
    mask:---
    other:r--

    Das Setzen von Rechten auf Global und User hat dagegen keine Auswirkung auf die Mask:

    > chmod o+rw blafasel
    > getfacl blafasel
    
    # file: blafasel
    # owner: xwolf
    # group: sbadmin
    user::rw-
    user:xbaer:rw-         #effective:---
    group::---              #effective:---
    mask:---
    other:rw-

    Backup

    Einige System-Backups kennen ACLs nicht. In Folge dessen können ACls verloren gehen, wenn eine Datei recoverd wird. Um damit nicht ebenfalls alle ACLs zu verlieren, ist es unter Umständen sinnvoll, die ACL-Konfiguration der wichtigsten Files oder Verzeichnisse zu speichern.

    getfacl [datei|verzeichnis] > ACL_File

    ist hierzu die Lösung.

    Linux (SuSe)

    SuSe-Linux unterstützt seit Version 8.1. ACLs. Sowohl auf der Filesystem-Ebene, als auch innerhalb seines Samba- und NFS-Daemons.
    Vgl: http://sdb.suse.de/de/sdb/html/81_acl.html

Kommentare deaktiviert :, , , Mehr...

Die Grenzen des Webservers und darüber hinaus… – Verwaltung von mehr als 256 virtuellen Hosts unter Apache

Einführung

Wer einen Server mit mehr als 200 virtuellen Hosts betreibt wird früher oder später auf unerwartete Probleme treffen. Der Webserver verweigert seinen Dienst, Dateien an denen nichts geändert wurden, können plötzlich nicht mehr gelesen werden und all dies passiert auch noch so, daß man es nicht immer nachstellen kann.

Die Symptome und Hintergründe

Wenn der Webserver beim Aufruf von sonst zugreifbaren Dateien auf einmal nicht mehr lesbar sind und es zu einem Fehler mit einem Code über 400 kommt, kann dies folgende Gründe haben:

  1. Die Datei ist wirklich nicht vorhanden oder nicht lesbar. In der Errorlog finden sich solche Eintraege:
    [Tue Aug 27 10:34:29 2002] [error] [client XXX.XXX.XXX.XXX] File does not exist:
    /irgendwo/irgendwas/5_dokt_on.gif
    [Tue Aug 27 10:34:29 2002] [error] [client XXX.XXX.XXX.XXX] File does not exist:
    /irgendwo/irgendwas/06_sekr_on.gif
    [Tue Aug 27 10:34:29 2002] [error] [client XXX.XXX.XXX.XXX] File does not exist:
    /irgendwo/irgendwas/01_univ_on.gif

    In anderen Worten: Jemand hat einfach eine nicht vorhandene Datei aufgerufen. Entweder ist ein Link falsch, es war ein dummer User, oder aber der Webseitenbastler hat einfach vergessen eine Datei anzulegen oder korrekt zu bennen.
    Als Betreuer der Serversoftware haben wir nichts zu tun. Non est mea culpa.

  2. Es gibt eine .htaccess-Datei, die den Zugriff verhindert. Ist aber eher selten. In der Errorlog sieht dies so aus:
    [Tue Aug 27 10:19:24 2002] [error] [client XXX.XXX.XXX.XXX] client denied by server
    configuration: /EN/index.shtml
    [Tue Aug 27 10:19:29 2002] [error] [client XXX.XXX.XXX.XXX] client denied by server
    configuration: /EN/pic/pfeil3.gif

    Hier kann der Client nicht auf die Dateien zugreifen, weil es aufgrund von Serverinstellungen explizit verboten ist. Entweder gibt es eine Datei .htaccess im Webverzeichnis, der die Zugriffsrechte einschränkt, oder aber in der Konfiguration des Webserver ist eine entsprechende Einstellung. Das obige Beispiel war von einer .htaccess-Datei generiert, wo der Zugriff auf gewisse IP-Adressen beschraenkt war. Folgendes Beispiel zeigt den verbotenen Zugriff auf eine Datei, die bereits aus der httpd.conf verboten wird:

    [Tue Aug 27 10:43:04 2002] [error] [client XXX.XXX.XXX.XXX] client denied by server
    configuration: /proj/webbin/cgi-bin/formmail.pl

    Man sieht in der Log keinen Unterschied zu dem vorherigen Beispiel. Hier jedoch wurde der Zugriff in der httpd.conf durch folgende Einstellung verhindert (die uebrigens bei allen bekannten unsicheren Skripten zu empfehlen ist):

    <Location /cgi-bin/formmail*>
       Deny from all
       ErrorDocument 403 http://www.meine_domain.tld/errorskript.shtml
    </Location>
    <Location /cgi-bin/phf*>
       Deny from all
       ErrorDocument 403 http://www.meine_domain.tld/errorskript.shtml
    </Location>

    Als Webmaster kann man nun zwei Dinge tun: Die Achseln zucken und sich darüber feuen, dass der Zugriffsschutz funktionierte, oder aber diesen anpassen, wenn er zu streng ist.

  3. Alle Filesystem-Handles, die dem Apache zur Verfügung stehen, werden bereits genutzt. In der Errorlog sieht dies bei einem Solaris-System und Apache 1.3.26 wie folgt aus:
    [Tue Aug 27 09:06:57 2002] [error] [client XXX.XXX.XXX.XXX] (2)No such file or
    directory: file permissions deny server access: /irgendwo/irgendwas/infopack.pdf
    [Tue Aug 27 09:07:13 2002] [error] [client XXX.XXX.XXX.XXX] (2)No such file or
    directory: file permissions deny server access: /irgendwo/irgendwas/index_e.html

    Diese Meldungen treten dabei recht gehäuft auf… Ausserdem stellen wir bei der Ansicht der Dateien und Verzeichnisse fest: Alles ist lesbar, ggf. sogar für alle User auf dem Filesystem. Es gibt eigentlich keinen Grund, warum die Datei nicht lesbar sein sollte.

    Wenn sowas passiert haben wir möglicherweise Problem: Wir erreichen die Grenzen unseres Systems. Und wir sind da nicht die ersten. In der Bug-Datenbank von Apache finden sich bereits Hinweise und Fragen hierzu. Beispiele:

    Die dort vorgeschlagenen Lösungen dort sind jedoch nicht gerade prickelnd.

Die Grenzen des Systems

Das Problem tritt laut Apache.org (FAQ) je nach OS ab 128 bis 250 virtuellen Hosts auf, welche eigene Logdateien haben. Vergleiche:

Je nach OS ist die maximale Anzahl der virtuellen Hosts, die eigene Logdateien benutzen, ebenfalls begrenzt durch die Anzahl der verfuegbaren File-Descriptoren. Der Apache kann nicht mehr als X Files gleichzeitig geöffnet haben. Diese Anzahl haengt ab vom OS und den zur Verfügung stehenden Ressourcen, die den Webserver zugewiesen werden:

Anzahl der offenen Dateien <= Soft Limit <= Hard Limit <= Kernel Limit

Schaut man sich diese bei unterschiedlichen OS an, kommt man zu folgenden Zahlen für die maximal möglichen Filehandles, die offen sein koennen:

BSDI: 240
FreeBSD: 240
Linux: 256
Solaris: 240
AIX bis 3.2: 128
ab 4.1.5: 2000

Lösungen

Natuerlich kann man der Lösung folgen, dass man keine eigenen Logdateien mehr für die virtuellen Hosts zulaesst. Stattdessen läßt man alles in der Standardlog-Datei speichern. Diesen Tipp kann man dann auch bei der Apache-FAQ nachlesen. Schliesslich fallen damit gleich eine grosse Anzahl von Filehandles die nur für die Verwaltung der Logfiles benutzt werden, weg. Jedoch ist dieser Tipp nicht unbedingt immer gut:

Wer bereits über etwa 240 virtuelle Hosts auf den Webserver betreibt, hat in der Regel auch entsprechend viele Zugriffszahlen, worunter auch ein erkleklicher Anteil an fehlerhaften Anfragen und Brute-Force-Attacken auf CGI- und PHP-Skripten zu finden sind. Wird jeder Zugriff auf alle Hosts in einer einzigen Logdatei gespeichert, kann diese sehr schnell sehr gross werden. Wenn die Datei grösser wird, als wie das OS es verkraften kann (bei alten UNIX- und Linuxversionen und bei normalen Windowsversionen liegt die Grenze bei 2 GB), dann kann es zu einem Crash des Webservers kommen. Wenn man diese Moeglichkeit also nutzt, muss man also unbedingt darauf achten, dass man die “zentrale Logdatei” wieder aufsplittet, die Logs also nicht in eine normale Datei geschrieben werden, sondern in ein Skript, das den <STDIN> verteilt.

Apache bietet seit der Version 1.3 hierzu ein eigenes Shell-Skript an, welches in Apache-Sourceverzeichnis src/support/split-logfile zu finden ist. Damit dieses funktioniert, muss man in der httpd.conf die Einstellung für das Logfile-Format so aendern, dass der Hostname am Anfang steht.

Beispielsweise das Common Log Format:

LogFormat	"%v %h %l %u %t \"%r\" %>s %b"

und damit dann den Aufruf von split-logfile über TransferLog:

TransferLog "| /pfad/zu/split-logfile.pl"

Damit es jedoch nicht zu Nebeneffekten kommt, duerfen bei diesen Fall in den virtuellen Hosts keine eigenen TransferLog’s mehr angegeben sein, da dann die Summe der Filediscriptoren doch wieder über die kritische Grenze steigt.

Diese Lösung ist ansonsten relativ praktikabel. Sie ist jedoch nur das Verschieben des Menetekels auf spaetere Zeiten und auf einen anderen Bereich. Zudem gelten auch für diesen Prozess Filesystem-Beschraenkungen, die zur Folge haben, dass nicht alle Logdateien vollstaendig geschrieben werden.

Das Skript split-logile ist ein Perlskript, bei welchem die Summe der Filehandle abhaengig ist von den Kernel-Parametern im OS. Mit Hilfe des Shellkommandos ‘limit’ (bzw. ‘limits’ oder ‘ulimit’) kann man sich die Zahl der Gesamt zur Verfuegung stehenden Filediscriptoren anzeigen lassen. Beispiel unter Solaris:

xwolf@eisbaer: 16:28 [~] > limit
cputime         unlimited
filesize        unlimited
datasize        2097148 kbytes
stacksize       8192 kbytes
coredumpsize    0 kbytes
vmemoryuse      unlimited
descriptors     1024
xwolf@eisbaer: 16:28 [~] >

Reicht auch diese Gesamtzahl nicht aus, kann man versuchen, diese Zahl durch Neucompilierung des Kernels zu aendern. Empfehlen wuerde ich dies jedoch nicht. Grund: Ein Rechner, der als Webserver im netz erreichbar ist, ist dauernden Angriffen ausgesetzt. Dies erzwingt quasi, dass man bei erscheinen von Patches für das OS diese schnell einbindet – am Besten noch über Autopatch-Mechanismen. Viele dieser Mechanismen gehen jedoch von Standardkonfigurationen des Kernels aus. Hat man einen modifizierten Kernel, kann es unter Umstaenden notwendig sein, von Hand nachzuarbeiten. Und wann wollen Sie in Urlaub gehen? Können Sie sicher sein, daß auch alle ihre Kollegen wissen, was zu tun ist, wenn nach dem Einspielen eines Patches auf einmal ein paar Hundert Domains nicht mehr zugreifbar sind?

Eine weitere Lösungsmöglichkeit liegt darin, zwei oder mehr Apache-Webserver auf einer Hardware zu verwenden. In diesem Fall laege die Grenze der offenen Dateien im OS. Der gravierende Nachteil an dieser Methode liegt jedoch darin, dass nur eine Apache-Instanz auf den Port 80, welcher der Standardport für Web ist, lauschen darf. Alle virtuellen Hosts, die von anderen Apache-Instanzen verwaltet werden wuerden, muessten jeweils auf einen anderen Port liegen.

Meiner Meinung nach besteht die sinnvollste Lösung in einer Hardware-Erweiterung, d.h. dem Aufbau eines Webserver-Parks. In anderen Worten: Jede Server enthaelt eine einzige Apache-Installation mit jeweils maximal 220 – 240 virtuellen Hosts. Hinzu kommt ein Server für die Fallbacksicherung und ein Server als Proxy. Ein weiterer Server sollte für Datenbanken zur Verfuegung stehen.

Beispielsweise würde die Architektur bei 600 virtuellen Hosts wie folgt aussehen:

Der Fallback-Server erhält Zugriff auf alle Webbereiche und kann die Konfigurationsdateien aller Webserver lesen. Eine Überwachung sollte dafür sorgen, daß der Fallback ggf. automatisch die Funktionen eines der Hauptwebserver ersetzt.
Damit der Fallback-Server auf alle Webbereiche und die lokalen Konfigurationen zugreifen kann, muss ein Konzept vorhanden sein, wie die Verzeichnisse und Dateien angeordnet sind.

So sollten auf allen Webservern die Webdateien und Verzeichnisse beispielsweise unter dem Ordner

/proj.stand/websource

abgelegt werden. für einen virtuellen Host www.blafasel.de auf dem Server 1 beispielsweise:

/proj.stand/websource/server1/www.blafasel.de

Dieser Bereich wird auf alle angeschlossenen Server gemountet wie

/proj/websource/server1/www.blafasel.de

Dies hat auch Sicherheitstechnische Vorteile: Kunden kann der Filesystem-Zugang zu den eigentlichen Webservern verschlossen bleiben. Man erlaubt nur das Einloggen auf einen speziell dafür vorgesehenen Server. Die Webserver kann man somit dicht machen, d.h. alle unnötigen Dienste abschalten. Ein weiterer Vorteil liegt auch darin, dass eine optionale globale Suchmaschine leichten Zugriff auf alle Dateien über das Filesysten erhalten koennte.

Im DNS wird ein gesonderte Konfiguration verwendet, damit der Fallbackserver schnell und sogar automatisch anspringen kann: Alle Domainnamen sind CNAME-Records (auch Aliase genannt), die auf einen Server-Namen weisen. Dieser Server-Name ist nun mit der IP des Rechners verbunden.

Beispiel:

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ORIGIN         meine_webserver.tld
;   Definition des Servers 1
www1             IN      A       IP.ADR.ESS.E1
www2             IN      A       IP.ADR.ESS.E2

$ORIGIN         domainname1.tld
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
localhost       IN      A       127.0.0.1
www             IN      CNAME   www1.meine_webserver.tld.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ORIGIN         domainname2.tld
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
localhost       IN      A       127.0.0.1
www             IN      CNAME   www1.meine_webserver.tld.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
$ORIGIN         domainname3.tld
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
localhost       IN      A       127.0.0.1
www             IN      CNAME   www2.meine_webserver.tld.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(Die Variable $ORIGIN im obigen Beispiel ist eine Abkürzung für einen SOA-Eintrag, in welchem die Nameserver, Version, Refreshrate und andere Daten angegeben sind.)

Die Domains www.domainname1.tld und www.domainname2.tld sind nach dieser Anordnung dem Server 1 zugeordnet und www.domainname3.tld dem Server 2. Wenn nun der Server 1 ausfallen wuerde, muss allein in der Zeile

www2             IN      A       IP.ADR.ESS.E2

die IP-Adresse geaendert werden auf die Adresse des Fallbackservers. In den Eintraegen der eigentlichen Webdomains braucht man nichts aendern.

Entsprechend wie mit den Webdateien wird auch mit den Logdateien und den Serverkonfigurationen und der Serversoftware verfahren. Auf den Bereichen Serversoftware, OS und optionaler Module für die Webserver (wie FastCGI, PHP, SSL usw.) sind alle Server, zzgl. dem Fallback-Server gleichwerige Kopien.

Ein Problem, dass sich hier auftut (was aber auch schon vorher vorhanden war): Zugriffsrechte der User auf dem Filesystem. Hier muss dafür Sorge getragen werden, dass die jeweiligen Webverzeichnisse nur von den Usern selbst und dem Webserver gelesen werden koennen. Leider reicht es nicht aus, mit SUXEC zu arbeiten, da der Webserver dieses nur auf Skripten, nicht jedoch auf Verzeichnisse anwendet und PHP-Skripten überhaupt nicht durch SUEXEC erfasst werden. Lösungen sind hierfür unter Unix/Linux das Setzen von ACLs und das Nutzen von NIS-Maps. Doch dies jetzt zu beschreiben würde den Umfang dieses Artikels sprengen.

Von der Hardware her muessen Proxy und Datenbankserver hoch zuverlässig sein. Alle Webserver muessen sehr sicher gegen Hackerattacken sein. Ich empfehle hier Rechner von Sun mit Solaris, wobei Proxy und Datenbankserver speziell zugeschnitten sein sollten auf die dort laufenden Anwendungen (z.B. ist beim Proxy sehr viel RAM notwendig). Diese Server sollten Rechner der höheren Leistungsklasse (Enterprise, SunBlade1000, Suncat,..) sein. Die Webserver und der Fallbackserver sollten die gleiche Hardware aufweisen. Als Hardware reichen Server der mittleren Leistungsklasse (Enterprise, Sunblade100) mit viel RAM und jeweils mindestens 50 GB Festplattenplatz.

Kommentare deaktiviert :, , Mehr...

Interaktive Mechanismen für Webseiten

Die Erstellung von Webseiten erfolgt im Wesentlichen durch die Sprache HTML, welche primär der
Dokumentengestaltung übernimmt. Die Grundsyntax und die Semantik von HTML werden vom
World Wide Web Consortium (W3C) in den HTML-Normen festgelegt.
Obwohl diese Normen durch die verschiedenen Browserhersteller oft erweitert werden, bleiben
die funktionelle Möglichkeiten von HTML auf denen einer statischen Oberfläche.

Interaktivität, wie z.B. die Verarbeitung (aber nicht die Ausgabe!) von Formularen obliegt
anderen Mechanismen, welche wir im Folgendem vorstellen werden.

Clientseitige Mechanismen

Clientseitige Mechanismen sind Programme, bzw. Skripten, welche auf dem Rechner desjenigen ausgeführt
werden, welcher eine Seite abruft, in der Aufrufe dieser Skripten getätigt werden. Der Webserver
auf dem die Seiten liegen, wird also nicht durch diese Skripten belastet. Allerdings sind dadurch die
meisten Anwendungen, die auf Datenbanken arbeiten, nicht möglich.

Folgende Tabelle zeigt die derzeitig üblichen Verfahren im Überblick:

JavaScript ActiveX Shockwave
Beschreibung JavaScript ist eine Programmiersprache, welche vom Browser des Betrachters
interpretiert wird und so auf die Darstellung des aktuellen Dokumentes Einfluß
nimmt. JavaScript ist eine Objectorientierte Sprache, die sich bereits zu einem
Standard auf Webseiten gemausert hat.
ActiveX wurde von Microsoft als Alternative zu JavaScript auf den Markt gebracht.
ActiveX kann auf die OLE von Windows zugreifen und so direkt auf alle Programme des
Rechners einwirken. Die Sicherheit gegen unbefugte Zugriffe erfolgt im wesentlichen nur
durch die Microsoft-Lizenz für diese Skripten.
Shockwave hat sich im professionellen Webdesign durchgesetzt zur Durchführung von
komplexeren grafischen Interaktionen auf der Webseiten. Es benötigt jedoch ein Plugin.
Da es jedoch auch Programme gibt, die im wesentlichen nur aus diesem Plugin bestehen
sind mit Shockwave auch bewegte Präsentationen ohne Webzugriff und Browser
möglich.
System-Anforderungen Browser der zweiten Generation Nur Microsoft-Browser Browser mit entspr. Plugins
Kosten kostenlos kostenlos Abhängig von Software. Professionelle Software im unteren Tausenderbereich.
Verbreitung
(Wieviele Benutzer können und würden diese Techniken darstellen)
hoch gering gering-mittel, wird aber zur Zeit von diversen publikumsreichen
Webseiten gefördert und eingesetzt.
Programmier-Aufwand gering mittel mittel
Anzahl verfügbarer Resourcen hoch gering gering, zum Teil nur kommerziell
Sicherheit für den Benutzer mittel sehr gering

Microsoft hat im Sommer 1996 – 2002 begonnen, sich aus der Technologie zurückzuziehen, da
ActiveX konzeptionell unsicher ist.

mittel-hoch

Serverseitige Mechanismen

Serverseitige Mechanismen sind Funktionen und Programme, die vom Webserver ausgeführt werden
und dessen Ausgaben an den Gast der Webseite weitergeleitet werden. Im Gegensatz zu clientseitigen
Mechanismen obliegt es allein dem Server alle nötigen Zugriffe zu machen, so daß dieser
auch die Last trägt.

Serverseitige Mechanismen bieten aber den Vorteil, daß die Datenhaltung zentral ist und
die Ausgaben unabhängig von dem verwendeten Browser sind. Eine Kombination von Serverseitigen
mit Clientseitigen Mechanismen ist zudem möglich und üblich. (Zum Beispiel beim Einsatz von
komplexen Online-Umfragen).

Obwohl sich inzwischen nur mehr 4 Servertypen durchgesetzt haben (Apache, Novell, Microsoft IIE,
Netscape), ist die Zahl der verfügbaren Mechanismen um einiges größer.
Aber auch hier sind schon Trends feststellbar. Die folgende Tabelle zeigt die derzeit am häufigsten
verwendeten Techniken und Standards für die clientseitige Ausführung:

CGI SSI ASP PHP
Beschreibung Offenes Standard für die Übergabe von Daten an den Webserver, die dieser
an das entsprechende Programm weiterleitet. CGI (= Common Gateway Interface) ist nicht auf eine
Sprache festgelegt und ist somit weitgehend plattformunabhängig.
SSI (= Server Side Includes) werden vom Apache-Server zur Verfügung gestellt
und erlauben es dem Benutzer einen kleinen Satz an dynamischen Informationen weiterzugeben, wie
z.B. die Environments des Webservers oder die Systemzeiten.
Komplexe Programmierung ist nicht möglich.
ASP ist von Microsoft und verlangt entweder dessen Server oder
entsprechende Erweiterungen für andere Server. ASP verfügt über einen festgelegten
Sprachumfang, der sich an dem von ActiveX anlehnt.
Ähnlich wie ASP verfügt PHP über einen festgelegten Sprachumfang.
Im Gegensatz dazu ist PHP plattformunabhängiger als ASP und arbeitet ohne Probleme unter
gänge Server und Betriebssysteme.
Anforderungen
(Neben den Webserver)
Interpreter oder Compiler für das jeweils benutzte Programm. Ggf. Server-Module. (Linux: mod_perl!) keine ASP Erweiterungen und Module PHP Erweiterungen und Module. Wenn die Module Defaultmässig im Speicher bleiben
wird mehr RAM benötigt.
Speed
(Abhängigkeit von der Serverhardware vorrausgesetzt)
Mittel bis Hoch: Abhängig von der verwendeten Sprache.
Mit Server-Modulen (mod_cgi) sind Interpretierte Sprachen genauso schnell wie PHP.
Compilierte Programme können schneller sein.
Nur durch den Webserver bestimmt. Mittel: Stark abhängig vom verwendeten System. Mittel-Hoch: Abhängig davon welche Server-Module installiert sind.
In der Regel werden Module mitgeliefert, die bewirken, daß PHP-Skripten
nach der Ausführung im Speicher bleiben. PHP belastet die CPU mehr als CGI, wobei
aber auch dies durch entsprechende Module ‘abgeschaltet’ werden kann.
Kosten kostenlos kostenlos Abhängig vom verwendeten Server kostenlos
Verbreitung hoch mittel, wird oft in Kombination benutzt gering-mittel mittel, steigt aber an, da es gerade “in” ist
Aufwand abhängig vom Programmierer und der Sprache unwesentlich abhängig vom Programmierer abhängig vom Programmierer
Anzahl verfügbarer Resourcen sehr hoch mittel gering, zum großen Teil nur kommerziell mittel-hoch
Sicherheit nur abhängig vom Programmierer nur abhängig vom Programmierer

(Es können nur Informationen weitergegeben werden,
die ein Hacker allerdings an anderere Stelle nutzen könnte)

gering-mittel
(Alle 3 Wochen ein Exploid…)
abhängig vom Programmierer und in alten Versionen mittel
Kommentare deaktiviert :, , , , , , , , Mehr...