Angenommen, eine 'Webanwendung' läuft auf einem Server (wie Apache, Nginx usw.) und ist in einer dynamischen Skriptsprache (wie PHP, Ruby usw.) geschrieben. Sie haben ein Missverständnis darüber, wer der 'Benutzer' ist.
Der Benutzer ist nicht die Person, die bei Ihrer Anwendung angemeldet ist. Dies und ihre Rolle in der Anwendung (Administrator usw.) sind für das Szenario völlig irrelevant. Der Benutzer ist der Linux-Systembenutzer, unter dem der Prozess ausgeführt wird. Der Code Ihrer Website wird nur als ein Benutzer ausgeführt - es kann der Benutzer Ihres Webservers sein (was nicht wirklich gut ist), oder es kann ein Benutzer sein, der für Ihre Website spezifisch ist (was viel besser ist).
Unter Linux gehören Benutzer zu Gruppen - wir können einen Benutzer zu einer anderen Gruppe hinzufügen und dieser Gruppe Berechtigungen zuweisen.
Bei einem guten Setup wird Ihr Server als ein Benutzer ausgeführt (nennen wir diesen Benutzer "Webserver") und Ihre dynamische Skriptsprache (z. B. über FastCGI) als ein eigener Benutzer (ein Benutzer pro Site - nennen wir unseren ersten Benutzer "Site1"). .
Um Ihre Dateien bereitzustellen, muss der Webserver darauf zugreifen können, und die Skriptsprache muss darauf zugreifen können. Das bedeutet: 'site1' und 'webserver' müssen in der Lage sein, Ihre Dateien zu lesen. Nur einer von ihnen kann jedoch die Dateien "besitzen". Der Besitzer ist der 'Benutzer' (in Benutzer, Gruppe, andere). Wir brauchen auch unsere Skriptsprache, um in das Verzeichnis schreiben zu können (und die Dateien zu lesen, die es geschrieben hat). Der Benutzer 'site1' benötigt daher Lese- und Schreibrechte. Da wir möchten, dass Gruppen- und andere Berechtigungen so restriktiv wie möglich sind, lautet unser "Eigentümer" "site1", und die entsprechenden Benutzerberechtigungen werden gelesen und geschrieben.
Da wir die Berechtigungen für unseren Webserver nicht als anderen 'Benutzer' festlegen können, werden wir 'Webserver' zur Gruppe 'Site1' hinzufügen (Sie können natürlich eine andere Gruppe mit sowohl 'Site1' als auch 'Webserver' erstellen. Alle Mitglieder dieser Gruppe erhalten die gleichen Berechtigungen. Die laxesten Berechtigungen (des Benutzers, der Gruppe oder eines anderen Satzes) werden auf einen bestimmten Benutzer angewendet, um dessen Berechtigungen zu bestimmen.
Es ist erwähnenswert, dass für ein gutes Setup keine Dateien erforderlich sein sollten, die über Ausführungsberechtigungen für eine dynamische Sprache verfügen. Die Dateien werden nicht direkt ausgeführt, sondern in einen Interpreter eingelesen. Zum Ausführen eines typischen Skripts (eines, das nichts schreibt) sind nur Leseberechtigungen erforderlich.
Die Berechtigung 'Ausführen' für Verzeichnisse hat eine andere Bedeutung - sie ermöglicht das Durchlaufen, ohne den Inhalt lesen zu können. Um eine Datei in einem Verzeichnis lesen zu können, muss ein Benutzer für JEDES darüber liegende Verzeichnis über Ausführungsberechtigungen verfügen.
Für eine Webanwendung muss jede Datei über die Leseberechtigung ihres Besitzers verfügen. Andernfalls ist die Datei ziemlich sinnlos. Unabhängig davon, ob ein Benutzer oder ein Administrator Dateien (über Ihre Webanwendung) hochlädt, benötigt der Eigentümer (dh die dynamische Sprache) Schreibberechtigungen. Bei einem effizienten Setup wird versucht, statische Dateien direkt über den Webserver bereitzustellen, da dynamische Sprachen beim Einlesen großer Dateien und beim Ausgeben des Inhalts in der Regel langsam sind. Der Webserver benötigt daher Lesezugriff auf Ihre statischen Dateien.
Daher können die minimalen Dateiberechtigungen sein:
- Eine Datei in einem Verzeichnis, in das der Benutzer statische Dateien (images / swf / js-Dateien) hochgeladen hat, befindet sich in folgendem Verzeichnis: 640
- Eine Datei in einem Verzeichnis, in das der Administrator statische Dateien (images / swf / js-Dateien) hochgeladen hat, befindet sich in folgendem Verzeichnis: 640
- Eine Datei in einem Verzeichnis, in dem sich die in der Anwendung verwendeten Bibliotheken befinden: 400 (oder 440)
- Eine Datei in einem Verzeichnis, in dem sich ausführbare / durchsuchbare serverseitige Skripts befinden: 400 (oder 440)
- Eine Datei in einem Verzeichnis, in dem die bereits vorhandenen Dateien (txt oder xml) nach Code auf der Serverseite bearbeitet werden: 640 oder 600
- (hängt davon ab, ob der Webserver diese zeitweise unverändert anzeigt)
Die minimalen Verzeichnisberechtigungen können sein:
- Ein Verzeichnis, in das der Benutzer statische Dateien (images / swf / js-Dateien) hochgeladen hat, befindet sich: 750
- Ein Verzeichnis, in das der Administrator statische Dateien (images / swf / js-Dateien) hochgeladen hat, befindet sich: 750
- Ein Verzeichnis, in dem sich die in der Anwendung verwendeten Bibliotheken befinden: 500 (oder 550) [sollte mindestens 510 sein]
- Ein Verzeichnis, in dem sich ausführbare / durchsuchbare serverseitige Skripts befinden: 500 (oder 550) [sollte mindestens 510 sein]
- Ein Verzeichnis, in dem die bereits vorhandenen Dateien (txt oder xml) serverseitig per Code bearbeitet werden: 750 oder 700
- (hängt davon ab, ob der Webserver von hier aus Dateien bereitstellt, die zeitweise unverändert sind)
Auch hier gilt: Ihr Webserver muss für jedes Verzeichnis über dem Verzeichnis, auf das er Zugriff hat, über Ausführungsberechtigungen verfügen. Selbst wenn der Webserver keine Dateien aus einem bestimmten Verzeichnis bereitstellt, sollten wir ihm Ausführungsberechtigungen erteilen.
Es ist ziemlich üblich, dem Webserver Lesezugriff auf die meisten Dateien zu gewähren (ändern Sie diese 500 auf 550). Standardmäßige "etwas sichere" Berechtigungen sind 755 für Verzeichnisse und 644 für Dateien - keine Ausführungsberechtigungen, jeder kann lesen und nur der Benutzer kann schreiben - Sie werden feststellen, dass die überwiegende Mehrheit der Dateien auf einem Linux-System über diese Berechtigungen verfügt.
Beachten Sie, dass sich die "anderen" Berechtigungen auf jeden Systembenutzer beziehen, der nicht der Eigentümer oder in der Gruppe ist (dh alle verbleibenden Systembenutzer). Die Einschränkung Ihrer "anderen" Berechtigungen ist gut, da diese Benutzer unbekannt sind - Sie haben ihnen keine explizite Berechtigung erteilt. Die anderen Berechtigungen sind auf einem kompromittierten System oft am einfachsten zu nutzen (z. B. einer der Gründe, warum / tmp ein häufiges Ziel ist).
Im Zusammenhang mit dem oben Gesagten denke ich nicht, dass Ihre letzten beiden Fragen so relevant sind. Setzen Sie Ihre Verzeichnisberechtigungen auf 550 (und Dateiberechtigungen auf 440) und erteilen Sie dem Benutzer Schreibberechtigungen für alle Verzeichnisse, in die Ihre Anwendung schreibt (dh Verzeichnis: 750; Datei: 640).
(Sie benötigen natürlich Schreibrechte, um die Dateien hochzuladen. Wenn Sie dies wünschen, können Sie diese nachträglich entfernen. Wenn jedoch jemand in ein Verzeichnis schreibt, in das nur der Eigentümer schreiben kann, ist Ihr Konto kompromittiert worden. Dies ist eines der Gründe für die Beibehaltung restriktiver Berechtigungen).