erzwingen, dass WordPress / PHP beim Erstellen neuer Dateien und Verzeichnisse das Setgid-Bit beachtet

534
chr0mag

Ich hoste mehrere WordPress-Sites auf einem LEMP-VPS.

  • Jede Site verfügt über eine eigene Wordpress-Installation (befindet sich unter /srv/http/domain/wordpress), ein eigenes Benutzerkonto ( Site-User ) und einen eigenen PHP-Fpm- Pool, der als Site-User ausgeführt wird .
  • Nginx wird unter dem http- Konto ausgeführt, und alle Dateien unter /srv/http/domain/wordpresshaben Site-User: http- Besitzrechte mit den Berechtigungen 0640 (Dateien) und 2750 (Verzeichnisse).

Jeder Benutzer hat also vollen RW- Zugriff auf seine eigenen Dateien / Verzeichnisse, aber keinen Zugriff auf die Dateien / Verzeichnisse anderer Sites. Nginx kann nur auf die Dateien / Verzeichnisse jeder Site zugreifen.

Ich benutze das Setgid- Bit, um zu erzwingen, dass neue Verzeichnisse /srv/http/domain/wordpressdie http- Gruppe erben, sodass Nginx Lesezugriff auf diese hat. Dies funktioniert erwartungsgemäß, wenn Dateien über SFTP erstellt werden.

Dies erscheint mir vernünftig und ich kann Plugins, Themes und WordPress erfolgreich über die WP-Admin- Benutzeroberfläche aktualisieren . Jedes Mal, wenn ich eine Aufgabe ausführte, bei der WordPress neue Dateien / Verzeichnisse erstellt - grundsätzlich immer dann, wenn ich ein Plugin / Design installiere oder aktualisiere oder Wordpress selbst aktualisiere - der resultierende Dateieigentümer ist site-user: site-user . Ich möchte, dass die neu erstellten Dateien / Verzeichnisse das setgid- Bit respektieren und Dateien / Verzeichnisse mit site-user: http erstellen, sodass Nginx diese Dateien ohne mein Zutun lesen kann.

Ich habe in der wp-config.php- Datei jeder Site Folgendes festgelegt :

  • define( 'FS_CHMOD_DIR', ( 02750 & ~ umask() ) );
  • define( 'FS_CHMOD_FILE', ( 0640 & ~ umask() ) );

Dies zwingt die Berechtigungen zu dem, was ich will, hat aber keinen Einfluss auf den Besitz.

Ich habe dies und das gelesen, aber die "Lösung" erfordert die Änderung von PHP-Code, um die Verwendung zu vermeiden. Diesmove_uploaded_file() ist in Ordnung, wenn Sie Ihren eigenen PHP-Code schreiben, aber ich werde nicht anfangen, WordPress-PHP-Dateien zu ändern. Ich bin nicht einmal sicher, dass dies die Quelle meines Problems ist.

Ich verstehe auch, dass ich die Berechtigungen lockern und sie auf 755 (Verzeichnisse) und 644 (Dateien) setzen konnte, sodass Nginx Dateien lesen konnte, unabhängig davon, ob sie die Gruppenzugehörigkeit besaßen, aber aus Sicherheitsgründen versuche ich, die Welt lesbar zu vermeiden Dateien auf einem gemeinsam genutzten Server.

Wie kontrolliere ich den Besitz von Dateien, die mit WordPress / PHP erstellt wurden?

1
Bitte lesen Sie das WordPress-Tag, das Sie hinzugefügt haben. Sie stellen eine Off-Topic-Frage. Siehe [Zum Thema] (https://superuser.com/help/on-topic). Fragen zu wordpress.com gehören zu [WebApps.SE]. Fragen zur Installation und Pflege von WordPress gehören zu [WordPress.SE] DavidPostill vor 6 Jahren 0
Das ist umstritten. Ich lese dies als Dateisystem- / Berechtigungsproblem. Möglicherweise mit dem Webserver zu tun. Ich öffne mich vorerst wieder. Nachdem Sie mit @DavidPostill darüber gesprochen haben, wie Sie vorgehen sollen, verschieben Sie es auf die entsprechende Website, falls das Thema hier nicht angezeigt wird. Journeyman Geek vor 6 Jahren 0
Ich habe ähnliche Dinge mit Apache gemacht und im Grunde müssen Sie Nginx so einstellen, dass er die `http`-Gruppe besitzt. Weitere Informationen finden Sie hier (https://serverfault.com/questions/433265/how-do-i-change-the-nginx-user). JakeGould vor 6 Jahren 0
@JakeGould - Nginx-Arbeitsthreads werden unter http: http user / group ausgeführt, wie im ursprünglichen Beitrag angegeben. Das Problem besteht darin, dass Dateien, die von Wordpress (eigentlich PHP) neu erstellt wurden, HTTP-Gruppenrechte besitzen, sodass Nginx sie lesen kann. chr0mag vor 6 Jahren 0
@DavidPostill - Entschuldigung David. Ich glaube nicht, dass dies ein Wordpress-spezifisches Problem ist, sondern mehr mit PHP und dem allgemeinen Einrichten Ihres LEMP-Stacks, einschließlich der Dateiberechtigungen für Linux. chr0mag vor 6 Jahren 0

1 Antwort auf die Frage

1
chr0mag

Ich habe dazu ein paar Lösungen gefunden:

  1. Neue, von Wordpress erstellte Dateien (eigentlich PHP) werden vom Benutzer und Gruppenrichtlinien in der Konfigurationsdatei des php-fpm- Pools angegeben, unter der PHP ausgeführt wird. Um neu erstellte Dateien für Site-User zu erzwingen : http- Eigentum, da ich ursprünglich gehofft hatte, Sie könnten einfach user = site-user und group = http in Ihrer standortspezifischen php-fpm- Pool-Konfigurationsdatei festlegen. Dies funktioniert, indem neu erstellte Dateien den Gruppeneigentum haben, nach dem ich gesucht habe. Aus sicherheitstechnischer Sicht wird jedoch der Zweck der Erstellung separater php-fpm- Pools für jede Site teilweise missachtet, da jeder Site-Benutzer möglicherweise PHP-Dateien erstellen kann, die über Lesezugriff auf die Dateien / Verzeichnisse einer anderen Site verfügen.

  2. Einfachere und sicherer als # 1 oben ist, um alles eine Website Dateien / Verzeichnisse, die von im Besitz zu haben Website-Benutzer: Website-Benutzer (statt Website-User: http wie ich ursprünglich geplant hatte), und fügen Sie dann den http Benutzer zu die Site-User- Gruppe . Mit 640 (Dateien) und 750 (Ordnern) Berechtigungen für alle Sites gewährt nginx auf diese Weise den schreibgeschützten Zugriff auf die Dateien jeder Site, sofern dies erforderlich ist, und gleichzeitig ist es jedem Benutzer nicht gestattet, die Dateien einer anderen Site mit Ausnahme der eigenen zu lesen.

Option 2 erfordert keine Verwendung des setgid- Bits, was die Dinge vereinfacht, es muss jedoch Folgendes in die Datei wp-config.php eingefügt werden:

  • define( 'FS_CHMOD_DIR', ( 0750 & ~ umask() ) );
  • define( 'FS_CHMOD_FILE', ( 0640 & ~ umask() ) );

Ohne die obigen Zeilen werden von WordPress / PHP weltweit lesbare Dateien (644) und Ordner (755) erstellt.

Tolle, selbst beantwortete Frage !!! JakeGould vor 6 Jahren 0