Ich habe die hier beschriebene Methode erfolgreich angewendet:Von einem einzigen Benutzer verwaltetund es hat bei mir gut funktioniert. Dies ist mein Skript für alle meine Websites:
sudo chown -R WebAdmin /var/www/example.com/
sudo chgrp -R www-data /var/www/example.com/
sudo chmod -R 750 /var/www/example.com/
sudo chmod g+s /var/www/example.com/
sudo chown www-data:www-data /var/www/example.com/Uploads/
sudo chmod -R 755 /var/www/example.com/Uploads/
Ich verwalte alle Sites auf diesem Server und WebAdmin ist der allgemeine Benutzer, den ich für FTP und auch SSH verwende.
Ich habe jedoch vor kurzem einige Wordpress-Sites von einem Hosting-Unternehmen auf meinen Server verschoben und das oben genannte funktioniert nicht. Beim Aktualisieren von Wordpress oder seinen Designs/Plugins trat der folgende Fehler auf:
Um die angeforderte Aktion auszuführen, muss WordPress auf Ihren Webserver zugreifen. Geben Sie Ihre FTP-Anmeldeinformationen ein, um fortzufahren. Wenn Sie Ihre Anmeldeinformationen vergessen haben, wenden Sie sich an Ihren Webhost.
Es gibt mehrere "Fixes" wie zum BeispielDieses hierdie eher Workarounds sind und wahrscheinlich unsicher sind. Also habe ich die sicherste (soweit ich weiß) Methode verwendet und die WWW-Daten zum Eigentümer der WordPress-Sites gemacht, während die Nicht-WordPress-Sites wie bisher beibehalten wurden. Mit anderen Worten, ich habe einfach
sudo chown -R www-data /var/www/wp_example.com/
auf den WordPress-Sites. Das hat natürlich funktioniert, aber es wird mühsam, wenn ich die Website manuell pflegen muss, weil ich mich dazu als Root anmelden muss. Ich könnte die Website(s) in Zukunft auch nicht jemand anderem zur Pflege zuweisen. Beachten Sie, dass einige meiner Sites hybrid sind (teilweise WordPress und teilweise benutzerdefinierte Seiten).
Daher frage ich mich, ob es eine bessere Lösung gibt, die eleganter und allgemeiner ist, d. h., die sowohl für WordPress- als auch für Nicht-WordPress-Sites funktioniert.
Eine Möglichkeit ist, dass ich den Benutzer WebAdmin zur Gruppe www-data hinzufüge. Oder vielleicht www-data zur Benutzergruppe WebAdmin? Was ist sinnvoller und sicherer?
Antwort1
Wenn sowohl der Benutzer WebAdmin
direkt als auch der Benutzer www-data
über die Gruppe www-data
in diese Verzeichnisse schreiben muss, 750
reicht das nicht aus. Was Ihr aktuelles Design behebt, wäre:
sudo chmod -R 770 /var/www/example.com/
Sicherheitsüberlegungen
Im Allgemeinen bedeutet dies jedoch, dass jede PHP-Site unter demselben Benutzer ausgeführt wird und nach dieser Änderung jede Site die Dateien jeder anderen Site lesen und schreiben kann. Dies bedeutet, dass ein Angriff auf einer der Sites alle Sites kompromittiert.
Die Verwendung eines separaten Benutzers und PHP-FPM-Pools für jede Site würde die Sites in isolierte Bereiche aufteilen und dieses Risiko mindern. Sie könnten die Site mit demselben Benutzer verwalten, der sie betreibt:
/var/www$ ls -l
drwxr-x--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxr-x--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxr-x--- 2 example-org www-data 4096 Aug 30 7:00 example.org
Wenn der Benutzer WebAdmin
sie unbedingt alle verwalten muss, würden Sie den Benutzer zur Gruppe hinzufügen www-data
und der Gruppe Schreibberechtigungen erteilen, aber das würde ich nicht empfehlen.
/var/www$ ls -l
drwxrwx--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxrwx--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxrwx--- 2 example-org www-data 4096 Aug 30 7:00 example.org
PHP-FPM-Pools
Da ich die PHP FPM-Pools erwähnt habe, finden Sie hier eine kurze Beispielkonfiguration. Es gibt mehrere Tutorials, in denen diese Schritte ausführlich erläutert werden.
Installieren Sie PHP-FPM.
/etc/php/8.2/fpm/pool.d/example-com.conf
:[example-com] user = example-com group = example-com listen = /run/php/example-com.sock chdir = /var/www/example.com listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[disable_functions] = exec,passthru,shell_exec php_admin_flag[allow_url_fopen] = off php_admin_value[cgi.fix_pathinfo] = 1 security.limit_extensions =
Die letzte Zeile verringert die Sicherheit, damit WordPress SEO-URLs verarbeiten kann, die anderen dienen zur Erhöhung der Sicherheit. Die
pm
Parameter sollten an Ihre Bedürfnisse angepasst werden.Aktivieren Sie die Apache-Module
mpm_event
,proxy
&proxy_fcgi
.Fügen Sie den Handler zum Apache2-
<VirtualHost>
Block für die Site hinzu:<FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost" </FilesMatch> <Proxy "fcgi://localhost/"> </Proxy>
Laden Sie die Apache2- und PHP-FPM-Dienste neu oder starten Sie sie neu.