Nginx의 가상 호스트 당 사용자


31

nginx에서 가상 호스트마다 다른 사용자를 구성 할 수 있습니까?

같은 것

 server {
     user myprojectuser myprojectgroup;
     ...
 }

답변:


7

nginx 설정의 모든 서버 스탠자는 동일한 작업자 프로세스 세트에서 제공되기 때문입니다. 또한 보안 측면 에서 웹 서버에서 내용을 자동으로 쓸 수 없으므로 (예 :)가 nginx에 취약한 경우 내용이 없음을 의미하므로이를 실행하는 것이 좋습니다.chmod -R 0777 위험합니다.


2
다른 사용자로부터 사용자 파일을 숨길 수있는 방법이 없습니까? www-data는 모든 사용자의 컨텐츠를 읽을 수 있어야합니까?
Alex Netkachov

1
www-data (또는 웹 서버가 실행되는 모든 사용자)에게 파일에 액세스 할 수있게하려면 시스템의 다른 사용자가 파일에 액세스 할 수 있어야합니다.
울다

2
vhost를 설정할 때 문서 루트에 그룹 www-data0710권한 그룹을 제공하십시오 (nginx를 구성하려면 루트가 필요하므로 자동화에 필요한 권한을 설정하는 것은 문제가되지 않습니다). 그런 다음 docroot의 내용은 o+x디렉토리와 o+r파일을위한 것이어야 합니다.
womble

13
주의 : PHP 스크립트 (또는 cgi-bin 프로세스)가에서 실행될 경우, PHP 스크립트 또는 cgi-bin 프로세스 www-data를 제공 할 수있는 모든 사용자는 사용자가 액세스 할 수있는 모든 파일에 액세스 할 수 있습니다 www-data. 이것은 config.php.inc공유 컴퓨터에 데이터베이스 암호를 저장 하거나 유사한 사람에게는 명백하지 않은 것으로 보입니다 .
Ivan Vučica

2
@Ricalsin UNIX는 다중 사용자 운영 체제이며 서버에는 둘 이상의 사용자가있을 수 있습니다. 예를 들어, peterjohn. 에서에 웹 페이지를 호스팅하고 ~/public_html있습니다. 위에서 언급 한 사람들이 언급하지 않은 다른 접근 방식이 없으면 .php 스크립트는 웹 서버와 동일한 권한을가 www-data집니다. 이는 웹 서버 및 PHP 인터프리터와 마찬가지로 다른 .php 스크립트를 읽을 수 있음을 의미합니다.
Ivan Vučica

9

예. 추가 보안이 가능하며 권장됩니다 (아래 이유 참조).

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 바이러스)가 다른 웹 사이트에 액세스하지 못하도록 각 사용자를 다른 사용자와 함께 실행하는 것이 좋습니다.


5

위의 Ivan의 의견에 따라 OP에 적용되는 것으로 보입니다. 두가지:

  1. 응용 프로그램 문서 루트가 같은 것 /blah/peterWeb/html등을 /blah/johnWeb/html. NGINX와 Apache2는 둘 다 www-data를 그룹으로 실행하더라도 다른 디렉토리를 사용하거나 조작 할 수 없습니다.

  2. 각 디렉토리 트리를 고유 한 사용자 권한으로 설정하면 각 사용자가 UNIX 시스템에 ssh / login하고 디렉토리를 개인용으로 유지할 수 있습니다. 각 사용자를 www-data 그룹에 넣지 마십시오. 당신이 동의한다면, 당신의 문장은 :

    PHP 스크립트 또는 cgi-bin 프로세스를 제공 할 수있는 모든 사용자는 www-data 사용자가 액세스 할 수있는 모든 파일에 액세스 할 수 있습니다.

    보다 정확하게 다음과 같이 쓸 수 있습니다.

    apache / nginx 서버 (www-data)와 같은 그룹에 넣은 모든 사용자는 액세스 가능한 파일 (필수적으로 웹의 모든 것임)에서 원하는 모든 작업 (php 스크립트 실행 포함)을 수행 할 수 있습니다 섬기는 사람).

편집 1 : 일부 서버 관리자 문제를 해결해야합니다.이 주제를 자세히 살펴 보았습니다. Ivan의 정보가 얼마나 정확한지 몰랐습니다! 사용자에게 공유 호스팅 구성에서 스크립트를 업로드하고 실행할 수있는 기능을 제공하려면주의하십시오. 여기에 한 가지 방법 . 이 취약점을 이해했는지 확인한 Ivan의 모자 팁.


4
아뇨. Apache 프로세스 (또는 다른 웹 서버)에서 실행될 때 PHP 스크립트는 호스팅 프로세스 권한으로 실행됩니다. 많은 순진한 설정에서이 사용자는 www-data입니다. Johnny가 스크립트를 작성하고 www-data(순진한 설정에서 실행할 수있는) 스크립트를 실행할 수 있으면 Johnny 의 스크립트는 Peter의 스크립트를 읽고 Johnny로 다시 보낼 수 있습니다. 이것은 그룹과 관련이 없습니다. 적절한 해결책은 suPHP (순진하게 설정되거나 잘못 작성되면 코드가 잘못 작성되어이 모든 사용자 파일을 위험에 빠뜨릴 수 있음) 또는 교도소 또는 사용자 당 전용 웹 사용자가있는 것입니다.
Ivan Vučica 2016 년

(또한 의견 대신 답변을 추가하는 것은 StackOverflow 유형의 사이트를 남용하는 것이므로 실제로 답변을 제공하고 있다는 인상을 받으십시오. 피하십시오.)
Ivan Vučica 2016 년

@ IvanVučica 조언을 지원하는 유용한 링크를 업데이트하고 추가했습니다. 감사.
Ricalsin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.