Webhosting mit ACLs

Die bekannten Unix-Rechte 644 oder 755 mögen für das Hosting eines einzelnen Projekts oder mehrerer Projekte, auf die man Shell-Zugriff hat, ausreichen. Wenn man aber Usern anbietet, ihre Site zu hosten gelangt man damit schnell an einen Punkt, wo diese Rechte einfach nicht mehr ausreichen.

Wenn zum Beispiel das CMS Joomla eine Komponente oder ein Modul über das Webinterface installiert bekommt so haben die Dateien, die installiert werden, als „Owner“ den User, unter dem der Webserver läuft (meist www-data). Andererseits hat ein manuell über FTP eingespieltes Template als „Owner“ den Hosting-Nutzer. Auf den meisten Systemen kommt dazu eine default-umask von 022, die allen neu erstellten Dateien ausschließlich Schreibrechte für den Ersteller/Besitzer der Datei zugesteht. Das könnte man zwar theoretisch ändern, würde damit aber die Sicherheit bei mehreren Nutzern kompromittieren (z.B. indem man die Nutzer und www-data einer Gruppe zuordnet, die Schreibrechte hat).

Alles in allem eine sehr unbefriedigende Lösung. Aber es gibt Abhilfe: ACLs (Access Control Lists) erlauben die feingranulare Einstellung der Rechte auf Nutzerebene wie auch in Gruppen. Mit ihnen lassen sich Konstrukte schaffen wie „www-data und Hostingnutzer haben rwx-Rechte“ – und das auch für neu erstellte Dateien. Doch der Reihe nach.

Für die Nutzung von ACLs unter Ubuntu/Debian braucht es einen einigermaßen modernen Kernel (>2.5.46, ob man diesen Kernel von 2002 noch „einigermaßen modern“ nennen kann lasse ich jetzt mal dahingestellt ;)) und die Partitionen müssen mit ext2 oder höher formatiert sein. In der /etc/fstab muss bei den Mountoptions aller Partitionen, mit denen ACLs genutzt werden sollen, der Parameter acl hinzugefügt werden, z.B.:

1
2
3
4
5
6
7
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
UUID=c1234f7f-fb32-4199-342a-4a12342f9a9d       /               ext3    defaults,usrquota,acl   0       1
UUID=f12349d1-d7e1-4ce5-4f3w-ddf971234b7       /boot           ext2    defaults        0       2
UUID=a1234b2b-b6bb-4572-33df-9351234335a0       none            swap    sw              0       0

Für die Bootpartition und die Swap-Partition brauchen wir natürlich keine ACLs, daher erfolgt der Eintrag nur auf der ersten Festplatte. Nach einer Änderung an der fstab muss das System neu gestartet werden um die Mountoptions zu übernehmen. Alternativ kann man natürlich auch den entsprechenden Mountpoint aushängen und manuell mit dem zusätzlichen Parameter neu mounten.

Als nächstes gehen wir in das Verzeichnis, welches die neuen ACLs erhalten soll und vergeben sie entsprechend unseren Wünschen:

1
2
3
cd /var/www/vhosts/username/
setfacl -R -m u::rwX,u:www-data:rwX,u:username:rwX .
setfacl -R -d -m u::rwX,u:www-data:rwX,u:username:rwX .

Die Zeile 2 des Codeschnipsels sorgt dafür, dass die User www-data und username Lese-, Schreib- und Ausführungsrechte für bereits bestehende Dateien/Ordner im Verzeichnis und allen Unterverzeichnissen erhalten. Das groß geschriebene „X“ sorgt dabei für eine automatische Berechnung der Maske, ohne die es zu Einschränkungen im Zugriff kommen kann. Zeile 3 macht das Gleiche wie Zeile 2, nur für neu erstellte Objekte (Parameter d = default). Mit Hilfe dieses Konstrukts hat man eine Umgebung geschaffen, in der der Nutzer sich mit FTP und PHP-Fileuploads austoben kann und doch die Sicherheit des Systems gewahrt bleibt. Zugleich haben andere Nutzer nach wie vor keinen Zugriff auf die Dateien und Ordner von Benutzer username.

Für den „Hausgebrauch“ reichen diese Befehle schon aus, um ein komfortables Arbeiten zu ermöglichen. Wer aber noch mehr erfahren möchte, dem sei die Seite über ACLs im Ubuntu-Wiki empfohlen. Dort wird u.a. ausführlich erklärt, wie man mit Gruppenrechten hantiert, wie man erstellte ACLs wieder los wird und wie man ein Backup seiner Listen anlegen kann.