Dateiberechtigungen für Shared-Hosting-Umgebung

  • Hallo zusammen,


    ich suche etwas Hilfe bezüglich Dateiberechtigungen in einer Shared-Hosting-Umgebung. Dabei geht es um folgendes Szenario: Ich habe einen Server, auf dem die Daten für einige Domains gehostet werden. Diese Domains gehören verschiedenen Personen und diese Personen sollen die Möglichkeit haben Dateien hinzuzufügen, zu ändern und zu löschen. Sie sollen das natürlich nur für die Domains machen dürfen, die ihnen gehören.


    Im Verzeichnis /var/www/ gibt es verschiedene Unterordner für die jeweiligen Domains, also /var/www/domainA/, /var/www/domainB/, usw. benutzer1 hat das Recht die Daten von domainA und von domainB zu verwalten. benutzer2 nur von domainB und benutzer3 nur von domainC. Als Web-Server fungiert Apache, was als www-data läuft. Pro Domain gibt es in pool.d von PHP-FPM einen Eintrag. Die User sollen ihre Daten nur per SFTP verändern können.


    Die Idee ist folgende: Ich erstelle eine Gruppe sftp und füge benutzer1, benutzer2 und benutzer3 dieser Gruppe hinzu. In der sshd-Konfiguration setze ich für die Gruppe sftp ForceCommand internal-sftp und ChrootDirectory /var/www/. Per ACL gebe ich den entsprechenden Nutzern die entsprechenden Rechte auf die entsprechenden Ordner, also z.B.


    setfacl -Rm u:benutzer1:rwX domainA domainB
    setfacl -Rm d:u:benutzer1:rwX domainA domainB


    umask hätte ich auf 0007 (o=) gesetzt, sodass other keine Rechte kriegen kann.


    Mein Problem jetzt ist folgendes. Apache und PHP sollen natürlich weiterhin daten lesen können und in speziellen Verzeichnissen soll PHP auch Daten schreiben können, z.B. ein Upload-Verzeichnis für eine Bildergalerie oder ein Log-Verzeichnis. Ich möchte aber nicht, dass alle hochgeladenen Dateien per-se schreibbar sind vom Server-Benutzer (www-data). Ich könnte hergehen und als Ownership root:www-data rekursiv angeben für alle Verzeichnisse innerhalb /var/www/ und der Gruppe Leserechte (und für Verzeichnisse auch Ausführrechte) vergeben. Vom Benutzer neu hochgeladene Dateien gehören aber ihm (sowohl UID als auch GID). Eine Idee wäre noch den Domain-Verzeichnissen das SGID-Bit zu setzen, was aber dazu führt, dass nun alles von www-data schreibbar ist und das möchte ich ja nicht. Wie kann ich das also einrichten und zwar so, dass der Benutzer selber im SFTP-Client auch angeben kann, dass z.B. /var/www/domainA/uploads/ schreibbar ist?

  • Die Frage ist: Willst Du generell nicht, dass der Webserver und die PHP-Prozesse in Verzeichnissen schreiben können?
    Sprich: Warum setzt Du nicht auf jeweils einen eigenen User für die PHP-Prozesse? Gibt es dafür einen speziellen Grund?


    Normalerweise würde ich das ohne ACL und mit einer durchdachten Benutzer/Gruppen Lösung umsetzen. Aber eventuell verstehe ich den Hintergrund Deines Spezialvorhabens (noch) nicht. Außer der Möglichkeit, dass ein Login mehrere Domains verwalten kann und eine Domain mehreren Logins zugeordnet sein könnte, sehe ich da noch keinen großartigen Vorteil.



    MfG Christian

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Ich möchte aus Sicherheitsgründen nicht, dass der Webserver und die PHP-Prozesse in sämtliche /var/www/ Verzeichnisse schreiben dürfen, sondern nur explizit wo notwendig, also z.B. in einem Uploads-Verzeichnis einer Bildergalerie, in Log-Ordnern, in Cache-Ordnern, etc. Bei Single-User-Installationen habe ich das bisher auch so geregelt, dass sämtliche Dateien innerhalb von /var/www/ root gehört haben mit 755 / 644 Berechtigungen und nur die notwendigen Ordner in denen PHP schreiben musste gehörten www-data.


    Das Szenario mit ACLs ist leider notwendig, da ich tatsächlich Benutzer habe, die mehrere Domains verwalten dürfen und umgekehrt auch einige Domains von mehreren Benutzern verwaltet werden dürfen. Meine bisherige Lösung bestand darin, dass die Benutzer sich per FTP anmelden mit der Domain als Benutzername, aber für manche Benutzer ist es zu umständlich mehrere FTP-Sessions offen zu haben.

  • chmod sollte über SFTP normal funktionieren. Angenommen der User setzt die Rechte für einen Upload-Ordner auf 0775 oder 0770. Dann könntest Du doch immer noch www-data in die Standardgruppe des Users packen, oder übersehe ich da etwas? So könnte der User über die Gruppenberechtigung steuern, wo der Webserver bzw. PHP schreiben darf. Die Standardrechte für jeden Ordner sollten dann natürlich weiterhin 0755/0750 und für Dateien 0644/0640 sein. Besitzer jeweils der User, der die Ordner erstellt oder Dateien hochgeladen hat.


    Notfalls steuere es über die World/Other Rechte. Solange die Rootebene der Domain nur für bestimmte Benutzer/Gruppen über ACL aufrufbar ist, kannst Du in Unterordnern ja beliebig die World/Other Rechte dafür missbrauchen.


    […] aber für manche Benutzer ist es zu umständlich mehrere FTP-Sessions offen zu haben.


    Dem könnte man jetzt entgegen halten, dass dann bei einem geknackten (S)FTP Account gleich mehrere Domains betroffen sind :D



    MfG Christian

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Ich hab leider Schwierigkeiten dir zu folgen. Die Idee über die Gruppe die Schreibrechte an Apache / PHP zu geben hatte ich auch, aber mir ist nicht ganz klar wie ich das anstelle. Wie sehen in deinem Vorschlag die Ownerships und Rechte von /var/www/* aus damit ein Benutzer in mehrere Domains schauen kann, aber nicht in Domains, die er nicht sehen darf, www-data wiederum in alle Domains? benutzerX:www-data und alle Benutzer Mitglied von www-data machen würde ja bedeuten, alle Benutzer haben Zugriff auf alle Domains.

  • Hätte ich das "künstliche" Problem nicht, dass ich nicht will, dass PHP überall schreibt, so könnte ich eine Gruppe pro Domain erstellen. benutzer1 in die domainA und domainB Gruppe packen, benutzer2 nur in domainB und benutzer3 nur in domainC. www-data packe ich in alle Gruppen und arbeite mit 660 / 770 Rechten.

  • Mal unabhängig von der vorherigen Fragestellung: Im Endeffekt wirst Du mit dieser Lösung sowieso noch andere Probleme bekommen. Was ist, wenn User A für Domain A eine Datei anlegt und diese User B später (völlig zurecht) bearbeiten will? Das kannst Du ohne Gruppenberechtigungen und den entsprechenden Schreibrechten kaum lösen. Für www-data blieben dann konsequenterweise nur noch die Rechte für Other. Nachfolgend trotzdem einmal meine theoretische Idee für Dein Vorhaben:


    • /var/www/domainA » root:root (chmod 0) » Rechte ausschließlich für diesen Ordner über ACL vergeben (groupA darf alles, www-data darf nur lesen; Rechte dürfen sich nicht vererben)
    • /var/www/domainA/subdir » userX:groupA (chmod 0775) » User+Group dürfen somit alles, www-data fällt unter Other und darf nur lesen. Da aber nur www-data (und groupA) über ACL auf die Rootebene der Domain zugreifen darf, ist Other=www-data.
    • /var/www/domainA/subdir/upload » userX:groupA (chmod 0777) » Alle dürfen alles machen. Alle bezieht sich hier aber wieder nur auf jene (groupA und www-data), die auf der Rootebene Zugriff über ACL auf den Domainordner haben. Kommen sie dort nicht rein, sind die tieferen Rechte ja hinfällig.


    userX ist quasi ein Platzhalter, je nachdem, welcher User die Datei hochgeladen hat. Denk Dir user1 und user2, die beide Zugriff auf domainA haben. In groupA sind alle User Mitglied, die Zugriff auf domainA haben.


    Zwei Dinge müsstest Du bei diesem Setup sicherstellen:

    • Dass die ACLs für /var/www/domain* immer richtig sind, nicht auf die Unterordner/-dateien vererbt werden und nichts über die normalen Rechte läuft, also "chmod 0" vergeben wird!
    • Dass die Standardrechte für neue Ordner/Dateien immer 0775/0664 sind, da ansonsten andere User der gleichen Domain keine Schreibrechte und der Webserver/PHP keinen Zugriff darauf haben. Das sollte sich über die umask realisieren lassen.


    Mit ACL stehe ich etwas auf Kriegsfuß, von daher ist alles rein theoretisch und ohne Praxiserfahrung! Das müsste Deinem Wunsch trotzdem am nächsten kommen. Falls ich da einen Denkfehler habe, geht es morgen weiter, gn8… :D:sleeping:



    MfG Christian


    PS: Dein gewünschtes Setup hängt dann aber immer noch davon ab, dass alle gefährlichen PHP-Funktionen (Shellzugriff, Prozessfunktionen, …) deaktiviert sind und der open_basedir entsprechend gesetzt ist. Letzteres setzt voraus, dass keine unbekannten Sicherheitslecks in PHP existieren, da das Deine einzige Barriere gegen den unerlaubten Script-Zugriff durch andere User ist. Genau deshalb bevorzuge ich persönlich getrennte User für jede PHP-Instanz.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Zitat

    Mal unabhängig von der vorherigen Fragestellung: Im Endeffekt wirst Du mit dieser Lösung sowieso noch andere Probleme bekommen. Was ist, wenn User A für Domain A eine Datei anlegt und diese User B später (völlig zurecht) bearbeiten will?


    Mit ACLs habe ich ja die Default-ACLs dafür. Die sorgen dafür, dass gleich beim Erstellen der Datei von User A die Schreibrechte auch für User B gesetzt werden. Mit Gruppen könnte ich das über SGID lösen, hätte aber dann wie gesagt das Problem, dass ich www-data auch Teil der Domain A, Domain B, etc. Gruppe machen müsste und dann hätte www-data überall Schreibrechte.