Apache + php-fpm: 풀별, 사용자 프로젝트별 적절한 권한이 있습니까?

Apache + php-fpm: 풀별, 사용자 프로젝트별 적절한 권한이 있습니까?

다양한 사용자(프로젝트당 사용자 1명)로 Apache 가상 호스트와 PHP-FPM 풀을 설정하는 올바른 방법은 무엇입니까?

  • 각 사용자/프로젝트는 파일 액세스 측면에서 서로 독립적입니다.
  • 일반 Apache/projects를 사용하여 www-data풀링된 프로젝트에 액세스할 수 없습니까?

가상 호스트와 함께 Apache를 사용하여 설정했으며 각 가상 호스트를 자체 php-fpm풀로 설정하려고 합니다.

  • Apache 가상 호스트 site1.conf:
<VirtualHost *:443>
        DocumentRoot /var/www/site1/public

        <Directory /var/www/site1/public>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

    <FilesMatch \.php$>
        # 2.4.10+ can proxy to unix socket
        SetHandler "proxy:unix:/run/php/php-fpm.site1.sock|fcgi://localhost/"
    </FilesMatch>

</VirtualHost>

  • PHP 풀 site1:
[site1]
user = site1
group = site1
listen.owner = site1
listen.group = www-data
listen.mode = 0660

  • 디렉토리는 다음에서 시작됩니다 /var/www/site1:
drwxr-xr-x 15 site1 site1 4,0K ago 31 11:48 .
drwxr-xr-x 15 site1 site1 4,0K ago 31 11:48 public

  • 그리고 사용자:
id site1
uid=1007(site1) gid=1007(site1) grupos=1007(site1),33(www-data)

virtualhost 의 다른 구성 파일과 동일하며 site2적절한 경우 변경합니다.


이제 이 구성이 작동하고 모든 파일이 제공되지만 의도한 목적에 비해 너무 개방적입니다.

우선, 공개 영역의 파일과 디렉토리는 다음을 site1사용해야 합니다.전 세계에서 읽을 수 있는라이센스(예: rwxr--r-- site1 site1 file). site1에서만 파일을 읽을 수 있도록 설정하면 모든 곳에서 HTTP 403오류가 발생합니다 EACCESS. 나는 Apache가 어느 시점에서 이러한 파일에 액세스해야 한다는 것을 이해하지만 FPM 풀의 전체 목적은 해당 액세스를 처리하는 것이라고 생각합니다.

이는 또한 프로젝트 사용자가 충분히 설정하지 않은 한 umask, 그들이 생성한 새 파일에는 충분한 권한이 없을 수 있으며 웹 서버(또는 FPM?)가 액세스할 수 있으려면 먼저 누구나 읽을 수 있도록 수동으로 설정해야 함을 의미합니다.

내 생각에 잠재적인 해결책은 Apache를 실행하는 사용자를 www-data(etc...)의 구성원으로 만드는 것입니다. 그러나 이렇게 하면 Apache에서 실행되는 다른 프로젝트에 Laravel 구성, 백엔드 커넥터와 같은 프런트엔드가 아닌 요소를 포함하여 프로젝트 파일에 대한 전체 액세스 권한이 부여됩니다. 등. 이론적으로 이것은 작동하지 않습니다.site1site2

두 번째 옵션은 Apache 사용자가 구체적으로 읽을 수 있도록 ACL()의 읽기 지시문을 사용하거나 이를 통해 각 프로젝트의 디렉터리를 설정하는 것입니다 public. 그러나 먼저 Apache에 대한 전체 경로 액세스 권한을 부여하지 않으면 이것이 어떻게 작동할지 잘 모르겠습니다. 읽기 Linux 디렉터리 경로는 다음 조건에서만 읽을 수 있으므로 프로젝트가 실행 가능합니까?www-data setgidẁww-datasetfacl모두해당 상위 경로는 입니다. 작동하지만 해당 설정이 무엇인지 완전히 모르겠습니다.

내가 볼 수 있는 유일한 다른 옵션은 다른 가상 호스트가 자체 사용자에 의해 실행되도록 Apache 자체를 설정하는 것입니다. 그러나 그러한 설정에 대한 문서는 찾을 수 없습니다. 내가 찾은 가장 가까운 것은 apache2-mpm-itk이 기능을 광고하는 이라는 것인데 실제로 Apache가 서비스를 제공할 수 있도록 허용하는 사용 가능한 구성을 찾지 못했습니다.시작이 모듈이 활성화된 경우. 실제로 Debian 9 시스템의 itk 기본 구성은 시작 시 세그폴트가 발생합니다.

올바른 구성을 달성하기 위해 내가 놓치고 있는 것은 무엇입니까? 나는 그것을 받아들인다가지다가능합니다. 적어도 일반 웹 호스트라면 누구나 그렇게 한다고 생각합니다.

답변1

최근에 성능상의 이유로 Apache 전역 읽기만 허용하는 유사한 구성을 설정했습니다. mpm_event_module을 사용합니다.

Apache와 PHP-FPM은 두 개의 독립적인 프로세스라는 점을 고려해야 합니다. 둘은 독립적인 설정과 환경을 가지며 PHP-FPM이 Apache의 권한을 관리하므로 서로 영향을 주지 않습니다.

양식을 사용하여 기존 방식으로 파일을 업로드하는 경우 Apache에는 정적 파일에 대한 읽기 또는 쓰기 권한이 필요합니다. PHP 코드를 통해 파일을 업로드하면 PHP-FPM이 시작됩니다. PHP-FPM은 PHP 코드만 처리합니다.

listen.owner = site1
listen.group = www-data
listen.mode = 0660

Apache 프로세스의 경우 .php 파일을 PHP-FPM unix 소켓에 전달(쓰기)할 수 있습니다.

user = site1
group = site1

풀은 PHP 코드를 실행하는 실제 사용자/그룹입니다. 사용자site1 기필코 아니다왜냐하면 www-data공격은 site1그룹 권한을 가진 다른 가상 호스트 디렉토리에 쓸 수 있기 때문입니다 www-data.

문제에 대한 해결책은 apache-mpm-itk입니다.

Apache가 전역적으로 읽도록 허용하면 모든 MPM(Multiprocessing Module)을 사용할 수 있습니다. apache-mpm-itk는 스레드 MPM과 호환되지 않습니다. 유일한 옵션은 mpm_prefork_module입니다. 이름에도 불구하고 apache-mpm-itk는 기술적으로 MPM이 아닙니다. 이는 개선된 프리포크입니다.

PHP-FPM의 각 풀에 대해 open_basedir 지시어를 설정하는 것을 잊지 마세요.

2020년에는 Debian 10(buster)을 추천합니다.

관련 정보