
저는 Ubuntu 16.04, Apache 2.4.29 및 php7.0-fpm을 사용하고 있습니다. 여러 사용자와 웹사이트에 대해 별도의 풀을 생성하여 별도의 사용자로 실행하고 각 사이트가 해킹당할 경우 보호되도록 하려고 합니다. 나는 A의 지시를 따랐다.비슷한 게시물이 주제에 관해서는 제대로 작동하지 않습니다.
다음은 /etc/php/7.0/fpm/pool.d에 있는 두 가지 예제 pool.d conf 파일입니다.
사용자 이름1.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
-
사용자 이름2.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
각 conf 파일을 저장한 후 php7.0-fpm 및 apache2를 다시 로드했습니다. 또한 다음은 두 개의 Apache VirtualHost 파일입니다.
website1.com.conf (사용자 이름1 포함)
<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 (사용자 이름2 포함)
<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>
다음은 내가 활성화한 모든 Apache 모드 목록입니다.
Apache Mod 활성화됨
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
문제: 이 방법으로 한 사이트만 제대로 작동하는 것 같습니다. 두 번째 사이트는 브라우저에서 500 오류를 받습니다. 다음과 같은 오류가 발생합니다.
[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"
또한 /var/run/php 디렉토리를 보면 다음이 표시됩니다.
php7.0-fpm.sock
php7.0-fpm.username1.sock
php7.0-fpm.pid
# (without php7.0-fpm.username2.sock)
내 "/home" 디렉터리에서 "www-data"는 모든 사용자와 해당 웹사이트의 그룹 소유자입니다.
drwx--x--- 11 username1 www-data 4096 Mar 3 07:25 username1
drwx--x--- 11 username2 www-data 4096 Mar 3 07:25 username1
여기서 어디로 가야 하는지 알려주세요. 약 30명의 사용자가 약 60개의 사이트를 운영하게 될 것입니다. www-data 대신 사용자로 웹사이트를 실행하려면 Apache가 필요합니다. 해커가 Wordpress 사이트에 침입하는 경우 www-data를 사용하여 나머지 사용자와 해당 웹사이트에 액세스하고 감염시킬 수 없도록 하는 방식으로 수행되어야 합니다. 해커가 침입한 경우 피해는 한 명의 사용자에게만 국한되어야 합니다.
답변1
두 구성의 첫 번째 줄은 pool.d
동일합니다 [username]
. 그렇기 때문에 단일 구성으로 처리되고 /run/php/php7.0-fpm.username1.sock
. 실제 사용자 이름을 풀 이름으로 포함하도록 첫 번째 줄을 편집합니다.