Was ist der beste Weg, um mit Berechtigungen für die Benutzer-WWW-Daten von Apache 2 in / var / www umzugehen?

215

Hat jemand eine schöne Lösung für den Umgang mit Dateien in /var/www? Wir betreiben namensbasierte virtuelle Hosts und der Apache 2-Benutzer ist www-data .

Wir haben zwei reguläre Benutzer und root. Also, wenn Sie mit Dateien herumspielen /var/www, anstatt ...

chown -R www-data:www-data

... die ganze Zeit, was ist eine gute Art, damit umzugehen?

Zusatzfrage: Wie hardcore gehst du denn mit Berechtigungen um?

In kollaborativen Entwicklungsumgebungen war dies immer ein Problem.

Gareth
quelle

Antworten:

206

Versuch, die Antwort von @ Zoredache zu erweitern , da ich es selbst probiere :

  • Erstellen Sie eine neue Gruppe (www-pub) und fügen Sie die Benutzer dieser Gruppe hinzu

    groupadd www-pub

    usermod -a -G www-pub usera ## muss -a verwenden, um an vorhandene Gruppen anzuhängen

    usermod -a -G www-pub userb

    groups usera ## Gruppen für Benutzer anzeigen

  • Ändern Sie den Besitz von allem unter / var / www in root: www-pub

    chown -R root:www-pub /var/www ## -R für rekursiv

  • Ändern Sie die Berechtigungen aller Ordner in 2775

    chmod 2775 /var/www ## 2 = Gruppen-ID festlegen, 7 = rwx für Eigentümer (root), 7 = rwx für Gruppe (www-pub), 5 = rx für Welt (einschließlich Apache-WWW-Datenbenutzer)

    Das Set Group ID ( SETGID ) -Bit (2) bewirkt, dass die Gruppe (www-pub) in alle neuen Dateien / Ordner kopiert wird, die in diesem Ordner erstellt wurden. Andere Optionen sind SETUID (4), um die Benutzer-ID zu kopieren, und STICKY (1), bei dem meines Erachtens nur der Eigentümer Dateien löschen kann.

    Es gibt eine -Rrekursive Option, die jedoch nicht zwischen Dateien und Ordnern unterscheidet. Daher müssen Sie find wie folgt verwenden :

    find /var/www -type d -exec chmod 2775 {} +

  • Ändern Sie alle Dateien in 0664

    find /var/www -type f -exec chmod 0664 {} +

  • Ändern Sie die umask für Ihre Benutzer in 0002

    Die umask steuert die Standardberechtigungen für die Dateierstellung. 0002 bedeutet, dass die Dateien 664 und die Verzeichnisse 775 haben. Wenn Sie dies festlegen (durch Bearbeiten der umaskZeile unten /etc/profilein meinem Fall), bedeutet dies, dass Dateien, die von einem Benutzer erstellt wurden, von anderen Benutzern im WWW-Verzeichnis geschrieben werden können. Gruppe ohne sie zu brauchen chmod.

Testen Sie all dies, indem Sie eine Datei und ein Verzeichnis erstellen und den Eigentümer, die Gruppe und die Berechtigungen mit überprüfen ls -l.

Hinweis: Sie müssen sich abmelden / anmelden, damit Änderungen an Ihren Gruppen wirksam werden!

Tom
quelle
6
@Tom Schön zu sehen, dass Sie dafür den findBefehl empfehlen . Ein kleiner Leistungstipp, den ich geben würde, wenn Sie viele Dateien / Verzeichnisse haben und GNU find verwenden, ist die Verwendung von +anstatt, \;damit der Befehl für mehrere Dateien ausgeführt wird, weil "es schneller ist, einen Befehl für so viele Dateien wie möglich auszuführen Dies spart Zeit, die benötigt wird, um den Befehl jedes Mal zu starten. " Es ist auch einfacher zu tippen, da kein Backslash erforderlich ist.
Aculich
2
Aktualisiert mit @ aculichs Vorschlag, + not \ zu verwenden;
Tom,
1
@SunnyJ. Versuchen Sie dies (ohne die Anführungszeichen): "find / var / www -type f -exec chmod 0664 '{}' \ +" Versuchen Sie das. Zwischen dem '{}' und dem \ + befindet sich ein Leerzeichen.
Buttle Butkus
1
warum wir anderen die Erlaubnis geben müssen, um zu sehen und auszuführen.
Kevin Parker
1
@Tomway, danke. Nur eine Anmerkung - ich denke, dass "SETUID (4) zum Kopieren der Benutzer-ID" in Ihrer Antwort falsch ist - SETUID wird ignoriert, wenn es auf Verzeichnisse in Linux / Unix - Ref
Yarin
60

Ich bin nicht ganz sicher, wie Sie die Berechtigungen konfigurieren möchten, aber dies kann Ihnen einen Ausgangspunkt geben. Es gibt wahrscheinlich bessere Wege. Ich gehe davon aus, dass Sie möchten, dass beide Benutzer unter / var / www / etwas ändern können.

  • Erstellen Sie eine neue Gruppe (www-pub) und fügen Sie die Benutzer dieser Gruppe hinzu.
  • Ändern Sie den Besitz von allem unter / var / www in root: www-pub.
  • Ändern Sie die Berechtigungen aller Ordner in 2775
  • Ändern Sie alle Dateien in 0664.
  • Ändern Sie die umask für Ihre Benutzer in 0002

Dies bedeutet, dass jede neue Datei, die von einem Ihrer Benutzer erstellt wird, Benutzername sein sollte: www-pub 0664 und jedes Verzeichnis, das erstellt wird, Benutzername: www-pub 2775. Apache erhält über die Komponente 'Andere Benutzer' Lesezugriff auf alles. Das SETGID-Bit in den Verzeichnissen erzwingt, dass alle erstellten Dateien der Gruppe gehören, der der Ordner gehört. Das Anpassen der umask ist erforderlich, um sicherzustellen, dass das Schreibbit so eingestellt ist, dass jeder in der Gruppe die Dateien bearbeiten kann.

Was das Hardcore angeht, gehe ich auf Berechtigungen. Es hängt komplett von der Site / dem Server ab. Wenn es nur 1-2 Editoren gibt und ich sie nur davor bewahren muss, die Dinge zu brechen, werde ich es einfach machen. Wenn das Geschäft etwas Komplexeres erfordert, würde ich etwas Komplexeres einrichten.

Zoredache
quelle
1
Mögliche Ergänzung - Cache- / Upload-Verzeichnisse, in die der Webserver schreiben muss, auf www-data setzen: www-data und 775.
gacrux
Funktioniert es auch, die Benutzer zur Apache-Gruppe hinzuzufügen, anstatt sich auf "andere" Berechtigungen zu verlassen? Wenn Sie nur Dateien hochladen und diese Dateien für Apache lesbar sein müssen, scheint eine dritte Gruppe nur dann nützlich zu sein, wenn Sie diese Dateien bearbeiten müssen.
Simurr
1
Gibt es eine Chance, dies ein wenig zu erweitern, @Zoredache? Ich befasse mich mit der grundlegenden Verwendung von RWX-Bits, Chmod, Chown, Adduser, Usermod, aber Sie haben mich mit der zusätzlichen ersten Ziffer für die oktalen Berechtigungen, Umasks und all dem verloren. Einige Beispielbefehle zur Veranschaulichung des beschriebenen Ansatzes sind sehr willkommen.
Tom
1
Auf diese Weise kann jeder Benutzer auf alle anderen Benutzerdateien zugreifen! Dies bedeutet, dass BenutzerA die Datei config.php von BenutzerB lesen kann, um beispielsweise seinen MySQL-Berechtigungsnachweis zu
stehlen
1
Mit acl können Sie sowohl mit Sicherheit als auch mit Zusammenarbeit umgehen :)
drAlberT
39

Ich denke, Sie werden POSIX ACL (Access Control Lists) als hilfreich empfinden. Sie ermöglichen ein detaillierteres Berechtigungsmodell im Vergleich zum Modell user: group: other. Ich habe festgestellt, dass sie sich leichter im Kopf behalten lassen, da ich expliziter sein und auch das "Standard" -Verhalten für einen Zweig des Dateisystems festlegen kann.

Beispielsweise können Sie die Berechtigungen der einzelnen Benutzer explizit angeben:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Oder Sie können dies basierend auf einer freigegebenen Gruppe tun:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

Und vielleicht möchten Sie Ihren Apache-Benutzer schreibgeschützt lassen

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Manpages:

Lernprogramm

Joe Holloway
quelle
2
Das ist der Weg ! +1
drAlberT
ACL für den Gewinn +1 ... Weitere Informationen finden
Yarin,
1
Ich frage mich, ob die Leistung von ACL im Vergleich zu den Grundberechtigungen beeinträchtigt ist.
Buttle Butkus
2
Leider fehlt ACL bei Standardinstallationen / -distributionen zu oft. Es ist mühsam, den Kernel auf allen Servern zu kompilieren, die ich verwalte, oder schlimmer noch, das Dateisystem manchmal zu ändern. Außerdem müssen Sie beim Sichern von Dateien sehr vorsichtig sein, insbesondere wenn Sie den Server wechseln. ACL ist großartig, aber die aktuelle Unterstützung ist so gering, dass ich es jedem empfehlen würde, der nicht die volle Kontrolle über alles auf dem Server und in der Umgebung hat. Aber +1, um ACL darauf hinzuweisen, wo es wirklich Sinn macht!
Ninj,
Gute Antwort +1; Ein Hinweis zum Ändern der Lese- / Schreibberechtigungen www-datafür den Apache-Prozess ( z. B.) auf Nur-Lesen für die gesamte Site (über setfacl oder chmod - oder beides) die meisten CMS zum Beispiel). Ich glaube, viele beliebte testen auch nur den Schreibzugriff auf Benutzerberechtigungsebene, nicht auf Gruppenebene. Sie können weiterhin aktualisieren, Aktualisierungen müssen jedoch manuell durchgeführt werden und es müssen benutzerdefinierte Berechtigungen für Schreibordner (logs / temp / uploads / etc) vergeben werden. Schreibgeschützt ist eine große Sicherheit, wenn Ihre Website damit funktioniert. Im Großen und Ganzen tun dies die meisten nicht.
bshea
11

Diese Frage wurde erneut gestellt , und wie auf Meta diskutiert , bieten die aktuellen Best Practices bessere Ansätze als 2009, als diese gestellt wurden. Diese Antwort versucht, einige aktuelle Lösungen für den sicheren Umgang mit kollaborativen Webentwicklungsumgebungen bereitzustellen .


Für einen sicheren Webserver und eine kollaborative Entwicklung gibt es mehr als nur die Dateiberechtigungen:

  • Separaten Benutzer für jede Site haben, dh nicht alle Sites bedienen, die verwenden www-data. Dies ist wichtig, da Apache heutzutage selten nur statische Inhaltsdateien bereitstellt, sondern dynamische Websites ausführt. Diese Antwort konzentriert sich auf PHP, da es die gebräuchlichste Sprache für Server-Sites ist, aber die gleichen Prinzipien gelten auch für die anderen.

    Wenn Sie ein Sicherheitsproblem an einem einzelnen Standort haben, kann es sich auf jeden Standort ausbreiten, der als derselbe Benutzer ausgeführt wird. Ein Angreifer kann alles sehen, was der Benutzer sieht, einschließlich der Datenbankanmeldeinformationen, und jede Site ändern, für die der Benutzer Schreibberechtigungen hat.

  • Verwenden Sie das SSH File Transfer Protocol (SFTP). Während die Verwendung von FTP aus Sicherheitsgründen aufgegeben werden sollte (da sowohl die Kennwörter als auch der Inhalt im Nur-Text-Format gesendet werden), bietet SFTP als sicherer Ersatz eine Funktion, die eine perfekte Lösung für die gemeinsame Webentwicklung darstellt.

    Nachdem Sie die Websites und einen Benutzer pro Website isoliert haben, müssen Sie Ihren Webentwicklern Zugriff gewähren, worum es bei dieser Frage geht. Anstatt ihnen die Kennwörter für diese Site-Benutzer zu geben oder wie ursprünglich vorgeschlagen über ihre persönlichen Benutzerkonten auf die Site-Dateien zuzugreifen, können Sie SSH-Schlüssel für die Anmeldung verwenden.

    Jeder Entwickler kann ein Schlüsselpaar generieren und den privaten Schlüssel geheim halten. Anschließend wird der öffentliche Schlüssel ~/.ssh/authorized_keysfür jedes Website-Benutzerkonto, an dem der Entwickler arbeitet , zur Datei hinzugefügt . Dies hat viele Vorteile für die Verwaltung der Passwörter und Anmeldungen:

    • Jeder Entwickler kann auf eine beliebige Anzahl von Websites zugreifen, ohne sich alle Kennwörter merken oder speichern zu müssen, die mit der Anordnung der Benutzer pro Website verbunden sind.

    • Sie müssen die Passwörter nicht jedes Mal ändern und freigeben, wenn jemand das Unternehmen verlässt.

    • Sie können sehr sichere Kennwörter verwenden oder die kennwortbasierte Anmeldung insgesamt deaktivieren.

  • Verwenden Sie PHP-FPM . Dies ist der aktuelle Ansatz, um PHP als Benutzer auszuführen. Erstellen Sie einen neuen Pool für jeden Benutzer, dh einen Pool pro Standort. Dies ist sowohl für die Sicherheit als auch für die Leistung am besten, da Sie auch angeben können, wie viel Ressourcen eine einzelne Site verbrauchen kann.

    Siehe zB NeverEndingSecurity's Run php-fpm mit separater Benutzer-ID und Gruppe unter Linux . Es gibt Tutorials wie HowtoForges Using PHP-FPM with Apache unter Ubuntu 16.04 , die kein PHP-FPM verwenden, um die Sicherheit durch Benutzertrennung zu erhöhen.

Esa Jokinen
quelle