
Ich verwende Ubuntu 16.04, Apache 2.4.29 und php7.0-fpm. Ich versuche, separate Pools für mehrere Benutzer und Websites zu erstellen, sodass sie unter einem separaten Benutzer ausgeführt werden und jede Site geschützt ist, falls eine gehackt wird. Ich habe die Anweisungen einesähnlicher Beitragzu diesem Thema, aber es funktioniert nicht ganz.
Hier sind zwei Beispiel-Pool.d-Konfigurationsdateien, die ich in /etc/php/7.0/fpm/pool.d habe
benutzername1.conf
[username]
user = username1
group = username1
listen = /run/php/php7.0-fpm.username1.sock
listen.owner = www-data #(I've already tried username1 here too)
listen.group = www-data #(I've already tried username1 here too)
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
-
username2.conf
[username]
user = username2
group = username2
listen = /run/php/php7.0-fpm.username2.sock
listen.owner = www-data #(I've already tried username2 here too)
listen.group = www-data #(I've already tried username2 here too)
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Beachten Sie, dass ich php7.0-fpm und apache2 nach jeder gespeicherten Conf-Datei neu geladen habe. Darüber hinaus sind hier meine beiden Apache VirtualHost-Dateien:
website1.com.conf (mit username1)
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.website1.com
ServerAlias website1.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =website1.com [OR]
RewriteCond %{SERVER_NAME} =www.website1.com
RewriteRule ^ https://www.website1.com%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi-username1 .php
Action php7-fcgi-username1 /php7-fcgi-username1
Alias /php7-fcgi-username1 /usr/lib/cgi-bin/php7-fcgi-username1
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-username1 -socket /run/php/php7.0-fpm.username1.sock -pass-header Authorization
<Directory "/usr/lib/cgi-bin">
Require all granted
</Directory>
</IfModule>
ServerAdmin [email protected]
ServerName www.website1.com
ServerAlias website1.com
DocumentRoot /home/username1/website1.com
DirectoryIndex index.html index.php
<Directory /home/username1/website1.com>
Options +SymLinksIfOwnerMatch
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{HTTP_HOST} ^website1.com
RewriteRule (.*) https://www.website1.com/$1 [R=301,L]
<IfModule mod_fastcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler php7-fcgi-username1
</FilesMatch>
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.website1.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.website1.com/privkey.pem
website2.com.conf (mit username2)
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.website2.com
ServerAlias website2.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =website2.com [OR]
RewriteCond %{SERVER_NAME} =www.website2.com
RewriteRule ^ https://www.website2.com%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<VirtualHost *:443>
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi-username2 .php
Action php7-fcgi-username2 /php7-fcgi-username2
Alias /php7-fcgi-username2 /usr/lib/cgi-bin/php7-fcgi-username2
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-username2 -socket /run/php/php7.0-fpm.username2.sock -pass-header Authorization
<Directory "/usr/lib/cgi-bin">
Require all granted
</Directory>
</IfModule>
ServerAdmin [email protected]
ServerName www.website2.com
ServerAlias website2.com
DocumentRoot /home/username2/website2.com
DirectoryIndex index.html index.php
<Directory /home/username2/website2.com>
Options +SymLinksIfOwnerMatch
AllowOverride None
Require all granted
RewriteEngine On
RewriteCond %{HTTP_HOST} ^website2.com
RewriteRule (.*) https://www.website2.com/$1 [R=301,L]
<IfModule mod_fastcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler php7-fcgi-username2
</FilesMatch>
</IfModule>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.website2.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.website2.com/privkey.pem
</VirtualHost>
Hier ist eine Liste aller Apache-Mods, die ich aktiviert habe:
Apache-Mods aktiviert
authn_core.load@ --> /etc/apache2/mods-available/authn_core.load
authn_file.load@ --> /etc/apache2/mods-available/authn_file.load
authz_core.load@ --> /etc/apache2/mods-available/authz_core.load
authz_host.load@ --> /etc/apache2/mods-available/authz_host.load
authz_user.load@ --> /etc/apache2/mods-available/authz_user.load
autoindex.conf@ --> /etc/apache2/mods-available/autoindex.conf
autoindex.load@ --> /etc/apache2/mods-available/autoindex.load
deflate.conf@ --> /etc/apache2/mods-available/deflate.conf
deflate.load@ --> /etc/apache2/mods-available/deflate.load
dir.conf@ --> /etc/apache2/mods-available/dir.conf
dir.load@ --> /etc/apache2/mods-available/dir.load
env.load@ --> /etc/apache2/mods-available/env.load
fastcgi.conf@ --> /etc/apache2/mods-available/fastcgi.conf
fastcgi.load@ --> /etc/apache2/mods-available/fastcgi.load
filter.load@ --> /etc/apache2/mods-available/filter.load
headers.load@ --> /etc/apache2/mods-available/headers.load
http2.load@ --> /etc/apache2/mods-available/http2.load
mime.conf@ --> /etc/apache2/mods-available/mime.conf
mime.load@ --> /etc/apache2/mods-available/mime.load
mpm_event.conf@ --> /etc/apache2/mods-available/mpm_event.conf
mpm_event.load@ --> /etc/apache2/mods-available/mpm_event.load
negotiation.conf@ --> /etc/apache2/mods-available/negotiation.conf
negotiation.load@ --> /etc/apache2/mods-available/negotiation.load
proxy.conf@ --> /etc/apache2/mods-available/proxy.conf
proxy.load@ --> /etc/apache2/mods-available/proxy.load
proxy_fcgi.load@ --> /etc/apache2/mods-available/proxy_fcgi.load
reqtimeout.conf@ --> /etc/apache2/mods-available/reqtimeout.conf
reqtimeout.load@ --> /etc/apache2/mods-available/reqtimeout.load
rewrite.load@ --> /etc/apache2/mods-available/rewrite.load
security2.conf@ --> /etc/apache2/mods-available/security2.conf
security2.load@ --> /etc/apache2/mods-available/security2.load
setenvif.conf@ --> /etc/apache2/mods-available/setenvif.conf
setenvif.load@ --> /etc/apache2/mods-available/setenvif.load
socache_shmcb.load@ --> /etc/apache2/mods-available/socache_shmcb.load
ssl.conf@ --> /etc/apache2/mods- available/ssl.conf
ssl.load@ --> /etc/apache2/mods-available/ssl.load
status.conf@ --> /etc/apache2/mods-available/status.conf
status.load@ --> /etc/apache2/mods-available/status.load
unique_id.load@ --> /etc/apache2/mods-available/unique_id.load
userdir.conf@ --> /etc/apache2/mods-available/userdir.conf
userdir.load@ --> /etc/apache2/mods-available/userdir.load
Das Problem: Es scheint, dass nur eine Seite auf diese Weise richtig funktioniert. Eine zweite Seite bekommt einen 500-Fehler im Browser. Ich bekomme Fehlermeldungen wie diese:
[Fri Mar 09 00:01:36.965019 2018] [fastcgi:error] [pid 31964:tid 134959322724992] (2)No such file or directory: [client ***.***.***.***:47348] FastCGI: failed to connect to server "/usr/lib/cgi-bin/php7-fcgi-username2": connect() failed
[Fri Mar 09 00:01:36.966129 2018] [fastcgi:error] [pid 31964:tid 139355612722992] [client ***.***.***.***:47348] FastCGI: incomplete headers (0 bytes) received from server "/usr/lib/cgi-bin/php7-fcgi-username2"
Wenn ich mir außerdem das Verzeichnis /var/run/php ansehe, sehe ich:
php7.0-fpm.sock
php7.0-fpm.username1.sock
php7.0-fpm.pid
# (without php7.0-fpm.username2.sock)
In meinem „/home“-Verzeichnis ist „www-data“ der Gruppenbesitzer für alle Benutzer und ihre Websites:
drwx--x--- 11 username1 www-data 4096 Mar 3 07:25 username1
drwx--x--- 11 username2 www-data 4096 Mar 3 07:25 username1
Sagen Sie mir, wie es weitergehen soll. Ich werde etwa 30 Benutzer haben, die etwa 60 Websites betreiben. Ich brauche Apache, um die Websites als Benutzer auszuführen (anstelle von www-data). Das muss so gemacht werden, dass ein Hacker, der in eine Wordpress-Site eindringt, nicht über www-data auf die übrigen Benutzer und ihre Websites zugreifen und sie infizieren kann. Wenn ein Hacker eindringt, muss der Schaden auf nur einen Benutzer beschränkt sein.
Antwort1
Die erste Zeile Ihrer beiden pool.d
Konfigurationen ist gleich [username]
. Deshalb werden sie als eine einzige Konfiguration behandelt und Sie sehen nur /run/php/php7.0-fpm.username1.sock
. Bearbeiten Sie die erste Zeile, sodass sie den tatsächlichen Benutzernamen als Poolnamen enthält.