Wenn Sie entscheiden, welche Berechtigungen verwendet werden sollen, müssen Sie genau wissen, wer Ihre Benutzer sind und was sie benötigen. Ein Webserver interagiert mit zwei Benutzertypen.
Authentifizierte Benutzer haben ein Benutzerkonto auf dem Server und können mit bestimmten Berechtigungen ausgestattet werden. Dies umfasst normalerweise Systemadministratoren, Entwickler und Dienstkonten. Sie nehmen normalerweise Änderungen am System mit SSH oder SFTP vor.
Anonyme Benutzer sind die Besucher Ihrer Website. Sie haben zwar keine Berechtigung, direkt auf Dateien zuzugreifen, können jedoch eine Webseite anfordern und der Webserver handelt in ihrem Namen. Sie können den Zugriff anonymer Benutzer einschränken, indem Sie sorgfältig festlegen, über welche Berechtigungen der Webserverprozess verfügt. Auf vielen Linux-Distributionen wird Apache als www-data
Benutzer ausgeführt, kann jedoch unterschiedlich sein. Verwenden Sie ps aux | grep httpd
oder, um ps aux | grep apache
zu sehen, welchen Benutzer Apache auf Ihrem System verwendet.
Hinweise zu Linux-Berechtigungen
Linux und andere POSIX-kompatible Systeme verwenden herkömmliche Unix-Berechtigungen. Es gibt auf Wikipedia einen ausgezeichneten Artikel über Dateisystemberechtigungen, so dass ich hier nicht alles wiederholen werde. Aber es gibt ein paar Dinge, die Sie beachten sollten.
Das Ausführungsbit
Interpreted Scripts (zB Ruby, PHP) funktionieren ohne die Ausführungsberechtigung einwandfrei. Nur Binärdateien und Shell-Skripte benötigen das Ausführungsbit. Um ein Verzeichnis zu durchlaufen (einzugeben), müssen Sie über die Ausführungsberechtigung für dieses Verzeichnis verfügen. Der Webserver benötigt diese Berechtigung, um ein Verzeichnis aufzulisten oder darin enthaltene Dateien bereitzustellen.
Standardberechtigungen für neue Dateien
Wenn eine Datei erstellt wird, erbt sie normalerweise die Gruppen-ID des Erstellers. Manchmal möchten Sie jedoch, dass neue Dateien die Gruppen-ID des Ordners erben, in dem sie erstellt wurden, sodass Sie das SGID-Bit für den übergeordneten Ordner aktivieren.
Die Standardberechtigungswerte hängen von Ihrer umask ab. Die umask subtrahiert Berechtigungen von neu erstellten Dateien, sodass der gemeinsame Wert 022 dazu führt, dass Dateien mit 755 erstellt werden. Bei der Zusammenarbeit mit einer Gruppe ist es hilfreich, die umask in 002 zu ändern, damit die von Ihnen erstellten Dateien von Gruppenmitgliedern geändert werden können. Und wenn Sie die Berechtigungen für hochgeladene Dateien anpassen möchten, müssen Sie entweder die umask für Apache ändern oder chmod ausführen, nachdem die Datei hochgeladen wurde.
Das Problem mit 777
Wenn Sie chmod 777
Ihre Website, haben Sie überhaupt keine Sicherheit. Jeder Benutzer im System kann eine beliebige Datei auf Ihrer Website ändern oder löschen. Denken Sie jedoch ernsthaft daran, dass der Webserver im Namen der Besucher Ihrer Website handelt und dass der Webserver nun die gleichen Dateien ändern kann, die er ausführt. Wenn Ihre Website Sicherheitslücken in Bezug auf die Programmierung aufweist, können diese ausgenutzt werden, um Ihre Website zu entstellen, Phishing-Angriffe einzufügen oder Informationen von Ihrem Server zu stehlen, ohne dass Sie dies jemals merken.
Wenn Ihr Server außerdem an einem bekannten Port ausgeführt wird (der verhindern soll, dass Benutzer ohne Rootberechtigung weltweit zugängliche Abhördienste starten), muss Ihr Server von root gestartet werden (obwohl jeder vernünftige Server sofort ausfällt) auf einen weniger privilegierten Account, sobald der Port gebunden ist). Mit anderen Worten, wenn Sie einen Webserver ausführen, auf dem die ausführbare Hauptdatei Teil der Versionskontrolle ist (z. B. eine CGI-App), und dessen Berechtigungen (oder auch die Berechtigungen des enthaltenen Verzeichnisses) belassen, da der Benutzer sie umbenennen könnte Die ausführbare Datei bei 777 ermöglicht es jedem Benutzer, eine beliebige ausführbare Datei als root auszuführen .
Definieren Sie die Anforderungen
- Entwickler benötigen Lese- / Schreibzugriff auf Dateien, um die Website aktualisieren zu können
- Entwickler müssen Verzeichnisse lesen / schreiben / ausführen, damit sie sich darin bewegen können
- Apache benötigt Lesezugriff auf Dateien und interpretierte Skripte
- Apache benötigt Lese- / Ausführungszugriff auf serveable Verzeichnisse
- Apache benötigt Lese- / Schreib- / Ausführungszugriff auf Verzeichnisse für hochgeladene Inhalte
Von einem einzelnen Benutzer verwaltet
Wenn nur ein Benutzer für die Wartung der Site verantwortlich ist, legen Sie ihn als Benutzerbesitzer im Website-Verzeichnis fest und erteilen Sie dem Benutzer die vollständigen Rechte für RWX. Apache benötigt weiterhin Zugriff, damit es die Dateien bedienen kann. Legen Sie also www-data als Gruppeneigentümer fest und erteilen Sie der Gruppe Empfangsberechtigungen.
In Ihrem Fall ist Eve, deren Benutzername möglicherweise eve
lautet, der einzige Benutzer, der Folgendes verwaltet contoso.com
:
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
Wenn Sie Ordner haben, die von Apache beschreibbar sein müssen, können Sie einfach die Berechtigungswerte für den Gruppenbesitzer so ändern, dass www-data Schreibzugriff hat.
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
Der Vorteil dieser Konfiguration besteht darin, dass es für andere Benutzer im System schwieriger (aber nicht unmöglich *) wird, nachzuschauen, da nur die Benutzer und Gruppenbesitzer Ihr Website-Verzeichnis durchsuchen können. Dies ist nützlich, wenn Ihre Konfigurationsdateien geheime Daten enthalten. Sei vorsichtig mit deiner umask! Wenn Sie hier eine neue Datei erstellen, werden die Berechtigungswerte wahrscheinlich standardmäßig auf 755 gesetzt. Sie können ausführen, umask 027
sodass neue Dateien standardmäßig auf 640 ( rw- r-- ---
) gesetzt werden.
Wird von einer Benutzergruppe verwaltet
Wenn mehr als ein Benutzer für die Wartung der Site verantwortlich ist, müssen Sie eine Gruppe erstellen, die zum Zuweisen von Berechtigungen verwendet werden kann. Es hat sich bewährt, für jede Website eine eigene Gruppe zu erstellen und die Gruppe nach dieser Website zu benennen.
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
Im vorherigen Beispiel haben wir den Gruppeneigentümer verwendet, um Apache Berechtigungen zu erteilen, aber jetzt wird dies für die Entwicklergruppe verwendet. Da der Eigentümer des Benutzers für uns nicht mehr nützlich ist, können Sie auf einfache Weise sicherstellen, dass keine Berechtigungen verloren gehen, indem Sie ihn auf root setzen. Apache benötigt weiterhin Zugriff, sodass wir dem Rest der Welt Lesezugriff gewähren.
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Wenn Sie Ordner haben, die von Apache beschreibbar sein müssen, können Sie Apache entweder zum Benutzer- oder zum Gruppenbesitzer machen. In jedem Fall hat es alle erforderlichen Zugriffsrechte. Persönlich bevorzuge ich es, den Benutzer zum Eigentümer zu machen, damit die Entwickler weiterhin den Inhalt der Upload-Ordner durchsuchen und ändern können.
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
Obwohl dies ein gängiger Ansatz ist, gibt es einen Nachteil. Da jeder andere Benutzer auf dem System die gleichen Berechtigungen für Ihre Website hat wie Apache, können andere Benutzer problemlos auf Ihrer Website surfen und Dateien lesen, die möglicherweise geheime Daten enthalten, z. B. Ihre Konfigurationsdateien.
Sie können Ihren Kuchen haben und ihn auch essen
Dies kann weiter verbessert werden. Es ist völlig legal, dass der Eigentümer weniger Rechte als die Gruppe hat. Anstatt den Eigentümer des Benutzers durch Zuweisen zu root zu verschwenden, können wir Apache zum Eigentümer des Benutzers für die Verzeichnisse und Dateien auf Ihrer Website machen. Dies ist eine Umkehrung des Single-Maintainer-Szenarios, funktioniert aber genauso gut.
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Wenn Sie Ordner haben, die von Apache beschreibbar sein müssen, können Sie einfach die Berechtigungswerte für den Benutzerbesitzer so ändern, dass www-data Schreibzugriff hat.
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Eine Sache, die Sie bei dieser Lösung beachten sollten, ist, dass der Benutzer, der Eigentümer neuer Dateien ist, dem Ersteller entspricht, anstatt auf www-data gesetzt zu werden. Alle neuen Dateien, die Sie erstellen, können von Apache erst gelesen werden, wenn Sie sie erkannt haben.
* Trennung der Apache-Privilegien
Ich habe bereits erwähnt, dass es anderen Nutzern tatsächlich möglich ist, sich auf Ihrer Website umzuschauen, unabhängig davon, welche Art von Berechtigungen Sie verwenden. Standardmäßig werden alle Apache-Prozesse als derselbe WWW-Datenbenutzer ausgeführt, sodass jeder Apache-Prozess Dateien von allen anderen auf demselben Server konfigurierten Websites lesen und manchmal sogar Änderungen vornehmen kann. Jeder Benutzer, der Apache zum Ausführen eines Skripts auffordert, kann denselben Zugriff wie Apache selbst erhalten.
Um dieses Problem zu bekämpfen, gibt es in Apache verschiedene Ansätze zur Trennung von Berechtigungen . Jeder Ansatz weist jedoch verschiedene Leistungs- und Sicherheitsnachteile auf. Meiner Meinung nach sollte jede Site mit höheren Sicherheitsanforderungen auf einem dedizierten Server ausgeführt werden, anstatt VirtualHosts auf einem gemeinsam genutzten Server zu verwenden.
Weitere Überlegungen
Ich habe es vorher nicht erwähnt, aber es ist normalerweise eine schlechte Praxis, wenn Entwickler die Website direkt bearbeiten. Bei größeren Websites ist es viel besser, ein Release-System zu haben, das den Webserver über die Inhalte eines Versionskontrollsystems aktualisiert. Der Single-Maintainer-Ansatz ist wahrscheinlich ideal, aber statt einer Person haben Sie eine automatisierte Software.
Wenn Ihre Website Uploads zulässt, die nicht ausgeliefert werden müssen, sollten diese Uploads außerhalb des Webstamms gespeichert werden. Andernfalls werden möglicherweise Dateien heruntergeladen, die geheim sein sollten. Wenn Sie beispielsweise zulassen, dass Schüler Aufgaben senden, sollten sie in einem Verzeichnis gespeichert werden, das nicht von Apache bereitgestellt wird. Dies ist auch ein guter Ansatz für Konfigurationsdateien, die Geheimnisse enthalten.
Bei einer Website mit komplexeren Anforderungen sollten Sie sich mit der Verwendung von Zugriffssteuerungslisten befassen . Diese ermöglichen eine weitaus differenziertere Steuerung von Berechtigungen.
Wenn Ihre Website komplexe Anforderungen hat, möchten Sie möglicherweise ein Skript schreiben, mit dem alle Berechtigungen eingerichtet werden. Testen Sie es gründlich und bewahren Sie es gut auf. Es könnte sein Gewicht in Gold wert sein, wenn Sie jemals feststellen, dass Sie Ihre Website aus irgendeinem Grund neu erstellen müssen.