Zugriffsrechte (Apache): Unterschied zwischen den Versionen

Aus schokokeks.org Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
Lars (Diskussion | Beiträge)
K Umlaute
Zeile 1: Zeile 1:
Beim Betrieb eines Webservers besteht immer eine Gratwanderung zwischen zu starker Einschr
Beim Betrieb eines Webservers besteht immer eine Gratwanderung zwischen zu starker Einschränkung (sodass manche Websites nicht mehr funktionieren) und zu großer Gefahr für die restlichen Daten auf dem Server.
 
==Der Benutzer ''apache''==
 
Der Webserver (das Programm '''apache''') läuft unter dem Benutzernamen '''apache''' und hat damit die selben Rechte wie ein normaler Benutzer und nicht die Rechte eines Administrators. Das bedeutet, der Webserver kann nur Daten lesen und schreiben, wenn man ihm dies explizit erlaubt. So wie jeder Benutzer nur Daten von anderen Benutzern lesen darf, wenn diese das explizit erlauben.
 
In einer ungesicherten Umgebung, würde das bedeuten, dass sämtliche CGI-Scripte von beliebigen Nutzern immer als Benutzer '''apache''' ausgeführt werden. Im Umkehrschluss bedeutet dies, dass man mit einem CGI-Programm wunderbar die Quelltexte der anderen Benutzer durchstöbern kann.
 
==Was wir dagagen tun...==
 
Da wir diese Vorstellung nicht gut finden, haben wir uns zu folgendem Sicherheits-Konzept entschieden:
 
===PHP===
 
PHP läuft als Apache-Modul und daher weitehin als Benutzer '''apache''' und zwar aus Performance-Gründen. Damit läuft er automatich ebenfalls unter der Benutzerkennung '''apache'''. Dadurch wäre laut oben genanntem Problem der Zugriff auf Dateien anderer Leute möglich.
 
Damit das nicht so ist, vewenden wir den safe_mode und die open_basedir-Einschränkung. Dadurch können mit einem PHP-Script nur Dateien geöffnet werden, die dem gleichen Systembenutzer gehören wie das laufende Script. mit der open_basedir-Einschränkung wird zudem für jede Domain festgelegt, wie weit ein Script im Verzeichnisbaum nach oben gehen darf. Wenn dort z.B. ''/home/bernd'' steht, darf das Script nur Dateien innerhalb des Verzeichnisses ''/home/bernd'' lesen und schreiben. Natürlich auch dort nur die, die für den Systembnutzer '''apache''' les- bzw. schreibbar sind.
 
===CGI===
 
Für Scripte, die nach dem ''Common Gateway Interface'' vom Webserver ausgeführt werden, verwenden wir '''SuExec'''. Ein CGI kann technisch aus jedem belibigen Script- oder Programmtyp bestehen. Damit ist es möglich, eigene Programme (binaries) oder Scripte in beliebigen, installierten Scriptsprachen (z.B. Perl, Python, Bash) zu schreiben.
 
Durch '''SuExec''' werden diese Programme dann immer unter dem Systembneutzer ausgeführt, den wir in der Konfiguration für die jeweilige Domain angeben. Das bedeutet, jedes CGI läuft unter dem Account des Benutzers, dem die Domain unter der es läuft, gehört.
 
Mit diesen Einschränkungen wird wirksam verhindert, dass ein Benutzer die Daten anderer Benutzer lesen oder gar schreiben kann.
 
==Dateisystem-Rechte==
 
Da im Benutzer-Verzeichnis sowohl Mails gelagert werden als auch die Websites, sollte man die Zugriffsrechte des Benutzers '''apache''' sinnvoll einrichten. Dazu gehört z.B. auch, dass der Benutzer '''apache''' nur auf die Dateien Zugriff hat, auf die er Zugriff haben soll.
 
Um diese Rechte gezielt regeln zu können, verwenden wir ACLs (''Access Control Lists''). Um dem Webserver den Zugriff auf das Verzeichnis ''/home/bernd/websites'' zu gestatten, werden folgende Befehle verwendet:
 
:<pre>setfacl -m u:apache:x /home/bernd /home/bernd/websites
setfacl -m default:u:apache:rx /home/bernd/websites</pre>
 
'''Zur Erklärung''':
Der Befehl '''setfacl -m''' setzt eine ACL für das angegebene Verzeichnis. die Angabe '''u:apache:x''' lässt den Webserver das Verzeichnis betreten, aber nicht den Inhalt anzeigen. So kann der Webserver nicht sehen, was sich alles im Benutzerverzeichnis befindet sondern kann nur das Home-Verzeichnis "durchlaufen", wenn er weiss, in welches Unterverzeichnis es will.
 
Die Zweite Zeile erstellt eine Standard-ACL, die für alle neu erzeugten Dateien und Verzeichnisse unterhalb des angegebenen Verzeichnisses gilt. Das bedeutet, der Webserver bekommt automatisch Zugriff auf die dort liegenden Verzeichnisse und Webseiten. Die Standard-ACL wird dabei an untergeordnete Verzeichnisse vererbt.
 
'''Achtung:'''
Die Vererbung funktioniert nur für dort neu erstellte Dateien und Verzeichnisse. Wenn man Dateien von einem anderen Ort dorthin verschiebt, wird deren alte ACL übernommen, diese kann eventuell noch nicht die gewünschten Einträge enthalten.
 
Mit dem Befehl '''getfacl <Datei oder Verzeichnis>''' kann man sich die aktuelle ACL anschauen.

Version vom 30. Dezember 2004, 01:06 Uhr

Beim Betrieb eines Webservers besteht immer eine Gratwanderung zwischen zu starker Einschränkung (sodass manche Websites nicht mehr funktionieren) und zu großer Gefahr für die restlichen Daten auf dem Server.

Der Benutzer apache

Der Webserver (das Programm apache) läuft unter dem Benutzernamen apache und hat damit die selben Rechte wie ein normaler Benutzer und nicht die Rechte eines Administrators. Das bedeutet, der Webserver kann nur Daten lesen und schreiben, wenn man ihm dies explizit erlaubt. So wie jeder Benutzer nur Daten von anderen Benutzern lesen darf, wenn diese das explizit erlauben.

In einer ungesicherten Umgebung, würde das bedeuten, dass sämtliche CGI-Scripte von beliebigen Nutzern immer als Benutzer apache ausgeführt werden. Im Umkehrschluss bedeutet dies, dass man mit einem CGI-Programm wunderbar die Quelltexte der anderen Benutzer durchstöbern kann.

Was wir dagagen tun...

Da wir diese Vorstellung nicht gut finden, haben wir uns zu folgendem Sicherheits-Konzept entschieden:

PHP

PHP läuft als Apache-Modul und daher weitehin als Benutzer apache und zwar aus Performance-Gründen. Damit läuft er automatich ebenfalls unter der Benutzerkennung apache. Dadurch wäre laut oben genanntem Problem der Zugriff auf Dateien anderer Leute möglich.

Damit das nicht so ist, vewenden wir den safe_mode und die open_basedir-Einschränkung. Dadurch können mit einem PHP-Script nur Dateien geöffnet werden, die dem gleichen Systembenutzer gehören wie das laufende Script. mit der open_basedir-Einschränkung wird zudem für jede Domain festgelegt, wie weit ein Script im Verzeichnisbaum nach oben gehen darf. Wenn dort z.B. /home/bernd steht, darf das Script nur Dateien innerhalb des Verzeichnisses /home/bernd lesen und schreiben. Natürlich auch dort nur die, die für den Systembnutzer apache les- bzw. schreibbar sind.

CGI

Für Scripte, die nach dem Common Gateway Interface vom Webserver ausgeführt werden, verwenden wir SuExec. Ein CGI kann technisch aus jedem belibigen Script- oder Programmtyp bestehen. Damit ist es möglich, eigene Programme (binaries) oder Scripte in beliebigen, installierten Scriptsprachen (z.B. Perl, Python, Bash) zu schreiben.

Durch SuExec werden diese Programme dann immer unter dem Systembneutzer ausgeführt, den wir in der Konfiguration für die jeweilige Domain angeben. Das bedeutet, jedes CGI läuft unter dem Account des Benutzers, dem die Domain unter der es läuft, gehört.

Mit diesen Einschränkungen wird wirksam verhindert, dass ein Benutzer die Daten anderer Benutzer lesen oder gar schreiben kann.

Dateisystem-Rechte

Da im Benutzer-Verzeichnis sowohl Mails gelagert werden als auch die Websites, sollte man die Zugriffsrechte des Benutzers apache sinnvoll einrichten. Dazu gehört z.B. auch, dass der Benutzer apache nur auf die Dateien Zugriff hat, auf die er Zugriff haben soll.

Um diese Rechte gezielt regeln zu können, verwenden wir ACLs (Access Control Lists). Um dem Webserver den Zugriff auf das Verzeichnis /home/bernd/websites zu gestatten, werden folgende Befehle verwendet:

setfacl -m u:apache:x /home/bernd /home/bernd/websites

setfacl -m default:u:apache:rx /home/bernd/websites

Zur Erklärung: Der Befehl setfacl -m setzt eine ACL für das angegebene Verzeichnis. die Angabe u:apache:x lässt den Webserver das Verzeichnis betreten, aber nicht den Inhalt anzeigen. So kann der Webserver nicht sehen, was sich alles im Benutzerverzeichnis befindet sondern kann nur das Home-Verzeichnis "durchlaufen", wenn er weiss, in welches Unterverzeichnis es will.

Die Zweite Zeile erstellt eine Standard-ACL, die für alle neu erzeugten Dateien und Verzeichnisse unterhalb des angegebenen Verzeichnisses gilt. Das bedeutet, der Webserver bekommt automatisch Zugriff auf die dort liegenden Verzeichnisse und Webseiten. Die Standard-ACL wird dabei an untergeordnete Verzeichnisse vererbt.

Achtung: Die Vererbung funktioniert nur für dort neu erstellte Dateien und Verzeichnisse. Wenn man Dateien von einem anderen Ort dorthin verschiebt, wird deren alte ACL übernommen, diese kann eventuell noch nicht die gewünschten Einträge enthalten.

Mit dem Befehl getfacl <Datei oder Verzeichnis> kann man sich die aktuelle ACL anschauen.