답변:
nginx 설정의 모든 서버 스탠자는 동일한 작업자 프로세스 세트에서 제공되기 때문입니다. 또한 보안 측면 에서 웹 서버에서 내용을 자동으로 쓸 수 없으므로 (예 :)가 nginx에 취약한 경우 내용이 없음을 의미하므로이를 실행하는 것이 좋습니다.chmod -R 0777
위험합니다.
www-data
및 0710
권한 그룹을 제공하십시오 (nginx를 구성하려면 루트가 필요하므로 자동화에 필요한 권한을 설정하는 것은 문제가되지 않습니다). 그런 다음 docroot의 내용은 o+x
디렉토리와 o+r
파일을위한 것이어야 합니다.
www-data
를 제공 할 수있는 모든 사용자는 사용자가 액세스 할 수있는 모든 파일에 액세스 할 수 있습니다 www-data
. 이것은 config.php.inc
공유 컴퓨터에 데이터베이스 암호를 저장 하거나 유사한 사람에게는 명백하지 않은 것으로 보입니다 .
peter
와 john
. 에서에 웹 페이지를 호스팅하고 ~/public_html
있습니다. 위에서 언급 한 사람들이 언급하지 않은 다른 접근 방식이 없으면 .php 스크립트는 웹 서버와 동일한 권한을가 www-data
집니다. 이는 웹 서버 및 PHP 인터프리터와 마찬가지로 다른 .php 스크립트를 읽을 수 있음을 의미합니다.
예. 추가 보안이 가능하며 권장됩니다 (아래 이유 참조).
PHP-FPM을 사용하고 있다는 것을 고려하면 (아마도 가장 일반적인 것처럼) 각 도메인에 대해 다른 사용자가 소유 한 스풀을 작성할 수 있습니다.
추신 : 여기에 자세한 단계별 자습서를 작성했습니다.
https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/
1. 스풀을 작성하십시오.
스풀을 추가 /etc/php/7.0/fpm/pool.d/www.conf
하거나 .conf
각 새 스풀마다 새 파일을 작성하십시오 .
스풀 # 1 (myuser1) :
[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...
listen.owner = www-data
listen.group = www-data
스풀 # 2 (myuser2) :
[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...
listen.owner = www-data
listen.group = www-data
추신 : 귀하의 listen.owner / listen.group을 동일한 nginx 사용자 (보통 www-data )로 유지하십시오.
2. 각 스풀을 해당 서버 블록 (아파치 사용자의 가상 호스트)에 지정하십시오.
호스트 1 :
server {
...
location ~ \.php$ {
fastcgi_pass unix:/run/php/myuser1.sock;
}
...
}
호스트 2 :
server {
...
location ~ \.php$ {
fastcgi_pass unix:/run/php/myuser2.sock;
}
...
}
FPM 및 NGINX 서비스를 다시 시작하십시오.
sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart
테스트 :
현재 프로세스 사용자를 표시 하는 pinfo.php (또는 다른 이름) 파일을 작성하십시오 .
<?php
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));
또는 bash를 통해 pinfo.php 파일을 만드십시오 :
echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php
그런 다음 브라우저에서 " http : //.../pinfo.php " 를여 십시오.
여러 사용자를 사용해야하는 이유 (보안상의 이유) :
동일한 사용자 ( www-data )에서 모든 웹 사이트를 실행 하면 system () / passthru () / exec ()에 대한 PHP 호출이 모든 웹 사이트에 액세스 할 수 있습니다! NGINX는 이에 대해 귀하를 보호하지 않습니다. PHP는 예제 일 뿐이지 만 널리 사용되는 웹 서버 언어는 비슷한 호출을합니다. 해커는 " ls .. "를 사용하여 모든 웹 사이트를 탐색하고 " cp / echo / mv "를 사용하여 파일 (다른 웹 사이트 파일 포함)에 자신의 코드를 작성할 수 있습니다. 서버의 모든 웹 사이트가 동일한 사람 (예 : 귀하)의 소유인 경우에도 최종 사용자 해커 / 바이러스 (예 : Wordpress 바이러스)가 다른 웹 사이트에 액세스하지 못하도록 각 사용자를 다른 사용자와 함께 실행하는 것이 좋습니다.
위의 Ivan의 의견에 따라 OP에 적용되는 것으로 보입니다. 두가지:
응용 프로그램 문서 루트가 같은 것 /blah/peterWeb/html
등을 /blah/johnWeb/html
. NGINX와 Apache2는 둘 다 www-data를 그룹으로 실행하더라도 다른 디렉토리를 사용하거나 조작 할 수 없습니다.
각 디렉토리 트리를 고유 한 사용자 권한으로 설정하면 각 사용자가 UNIX 시스템에 ssh / login하고 디렉토리를 개인용으로 유지할 수 있습니다. 각 사용자를 www-data 그룹에 넣지 마십시오. 당신이 동의한다면, 당신의 문장은 :
PHP 스크립트 또는 cgi-bin 프로세스를 제공 할 수있는 모든 사용자는 www-data 사용자가 액세스 할 수있는 모든 파일에 액세스 할 수 있습니다.
보다 정확하게 다음과 같이 쓸 수 있습니다.
apache / nginx 서버 (www-data)와 같은 그룹에 넣은 모든 사용자는 액세스 가능한 파일 (필수적으로 웹의 모든 것임)에서 원하는 모든 작업 (php 스크립트 실행 포함)을 수행 할 수 있습니다 섬기는 사람).
편집 1 : 일부 서버 관리자 문제를 해결해야합니다.이 주제를 자세히 살펴 보았습니다. Ivan의 정보가 얼마나 정확한지 몰랐습니다! 사용자에게 공유 호스팅 구성에서 스크립트를 업로드하고 실행할 수있는 기능을 제공하려면주의하십시오. 여기에 한 가지 방법 . 이 취약점을 이해했는지 확인한 Ivan의 모자 팁.
www-data
입니다. Johnny가 스크립트를 작성하고 www-data
(순진한 설정에서 실행할 수있는) 스크립트를 실행할 수 있으면 Johnny 의 스크립트는 Peter의 스크립트를 읽고 Johnny로 다시 보낼 수 있습니다. 이것은 그룹과 관련이 없습니다. 적절한 해결책은 suPHP (순진하게 설정되거나 잘못 작성되면 코드가 잘못 작성되어이 모든 사용자 파일을 위험에 빠뜨릴 수 있음) 또는 교도소 또는 사용자 당 전용 웹 사용자가있는 것입니다.