Apache PHP 업로드 - 소유권 및 권한

Apache PHP 업로드 - 소유권 및 권한

VPS 웹 서버(Debian 8 + Apache 2 + PHP 5.6)를 설치하는 첫 번째 단계를 제공하고 있으며 파일/폴더 권한에 대한 도움이 필요합니다.

이 주제에 대해 몇 가지 유사한 스레드(정확히 동일하지는 않음)를 찾았으며 모두 4세 또는 5세 어린이를 위한 것입니다. 그 중 일부는 더 이상 사용되지 않는 PHP 메서드를 사용하는 솔루션을 가리킵니다. 어쩌면 오늘날에는 새로운 방법이나 해결책이 있을 수도 있습니다.

글쎄, Apache 2는 www-data사용자/그룹에서 실행됩니다. 그래서 저는이라는 사용자를 생성하여 그룹에 webadmin넣고 www-data이를 기본 웹 사이트 폴더의 소유자로 구성했습니다.

adduser webadmin
usermod -a -G www-data webadmin
chown -R webadmin:www-data /var/www/website.com

권한도 변경했습니다public_html다음과 같은 폴더:

find /var/www/website.com/public_html -type f -exec chmod 644 {} +
find /var/www/website.com/public_html -type d -exec chmod 755 {} +
find /var/www/website.com/public_html -type d -exec chmod g+s {} +

업로드된 파일(정적 파일만 - 이미지)을 받을 폴더를 만들었습니다.

mkdir /var/www/website.com/public_html/uploads
chown webadmin:www-data /var/www/website.com/public_html/uploads
chmod 774 /var/www/website.com/public_html/uploads

이제 무슨 일이 일어날까요? SFTP를 사용하여 업로드하는 모든 폴더와 PHP/Html 파일( 로 기록됨 webadmin)은 webadmin물론 소유자가 됩니다. PHP를 사용하여 하위 폴더를 만들고 이미지를 업로드하면 사용자가 www-data소유자가 됩니다. 이 경우 SFTP를 통해 파일을 삭제하는 등 몇 가지 권한 문제가 발생했습니다.

webadmin사용자 및 그룹으로 실행되도록 Apache를 지정할 수 있지만 www-data보안 문제가 있을 수 있습니다(아니요?). 이 문제를 방지하기 위해 폴더를 만들고 파일을 업로드하도록 서버 또는 PHP 스크립트를 구성하는 표준 및 모범 사례가 있습니까?

답변1

문제는 새 파일을 쓸 수 없다는 것입니다. 사용하는 대신설정디렉토리에 그룹을 설정하려면 다음을 사용하십시오.전방십자인대에스이는 더 큰 유연성을 제공합니다.

이것기본 액세스 제어 목록새 파일과 디렉터리는 ACL에 정의된 권한을 부여하는 항목을 상속합니다. 설정하려면기본 액세스 제어 목록webadmin그룹 입력 허용 rwx:

setfacl -m default:g:webadmin:rwx /var/www/website.com/public_html/uploads

이 디렉토리에 생성된 새 파일은 그룹에서 읽고 쓸 수 있습니다 webadmin.


ACL이 옵션이 아닌 경우, 당신은 변경해야마스크, 새 파일에 대한 기본 UNIX 권한을 결정합니다. 신입사원을 위한 현명한 선택마스크002(세계 쓰기 가능 비트 마스크) 및 007(모든 세계 권한 비트 마스크, 즉 그룹과 소유자만 액세스할 수 있음)

아파치 설정마스크, systemd 단위 파일을 다음 위치에 복사합니다./등:

cp /lib/systemd/system/apache2.service /etc/systemd/system/

구성마스크/etc/systemd/system/apache2.service추가 하여UMask=<umask>[Service]섹션 에 . 이는 Apache에서 생성된 모든 파일에 영향을 미칩니다.

변화마스크~을 위한SFTPPHP/Apache에서 업로드된 파일/디렉터리를 변경해야 하는 경우에만 필요합니다. 기본적으로 umask는 022파일 그룹을 생성하고 전역적으로 읽을 수 있지만 그룹에 쓸 수는 없습니다. 기본값을 구성하는 가장 쉬운 방법마스크~을 위한SFTP그리고pam_umask.

사용자 정의 적용마스크특정 그룹의 사용자에게만 적용되며 다음을 사용할 때만 적용됩니다.SFTP, 추가의 /etc/pam.d/sshd:

session [default=1 success=ignore] pam_succeed_if.so user notingroup <yourgroup>
session optional                   pam_umask.so umask=<umask>

첫 번째 규칙은 사용자가 그룹에 없으면 다음 규칙을 건너뛰도록 pam에게 지시합니다 <yourgroup>. 즉, 다음 규칙은 사용자가 그룹에 있는 경우에만 적용됩니다 <yourgroup>. 두 번째 규칙은 umask를 <umask>.


부록: 이동된 기존 파일은 mv원래 권한과 소유권을 유지합니다. 파일을 복사하여 umask 및 디렉터리 setgid/ACL에 대한 기본 권한을 적용할 수 있습니다 cp -d.

답변2

표준의 좋은 점은 일반적으로 선택할 수 있는 것이 많다는 것입니다.

권한을 고려하고 웹 서버 UID가 업로드된 콘텐츠 이외의 파일을 쓸 수 없도록 방지해 주셔서 감사합니다. 업로드 디렉토리에서 PHP 실행을 완전히 비활성화하길 바랍니다. 현재 추가 권한이 있는 그룹에 Apache를 추가하고 있기 때문에 모델에 몇 가지 결함이 있습니다. 하지만 그것은 문제의 일부일 뿐입니다. 하지만 나는 당신이 묻는 질문에서 벗어났습니다.

생성한 사용자는 장치에 대한 루트 액세스 권한이 있음을 의미합니다(이를 명시적으로 언급해야 함). 하지만 자체 소프트웨어를 사용하고 있는지 아니면 기성품 패키지를 사용하고 있는지는 밝히지 않았습니다. 후자는 사용자 정의가 수행해야 하는 정기적인 패치에 영향을 미칠 수 있으므로 약간의 복잡성을 야기합니다. Apache가 대상에 대해 높은 수준의 제어권을 가지려는 유일한 uid인 경우 Apache의 파일 액세스 권한을 사용자나 그룹 대신 "other"로 설정하여 문제를 해결할 수 있습니다.

또는 업로드된 콘텐츠에 대한 액세스 권한을 다른 계정에 제공하려면 umask 000/chmod를 사용하여 파일을 666으로 변경하면 됩니다. move_uploaded_file()은 실제로 복사본을 생성하고 원본 파일을 삭제하며, 중요한 것은파일 생성은 umask를 따릅니다.. 따라서 적절하게 작성된 PHP는 웹 서버에 umask 000을 설정하여 코드를 변경하지 않고도 http 업로드를 누구나 읽고 쓸 수 있도록 저장할 수 있습니다.

또는 http 업로드에 대한 권한을 일반 사용자 계정을 사용하여 콘텐츠를 조작할 수 있는 권한으로 변경하는 쉘 스크립트를 작성한 다음 sudo를 통해 스크립트를 호출할 수 있는 웹 서버 uid 권한을 부여할 수 있습니다. 이는 move_uploaded_file() 이후 코드에서 호출되어야 합니다.

또는 다소 추악한 해결책은 권한을 수정하기 위해 스크립트에 연결된 업로드 디렉토리에 inotify 감시를 두는 것입니다(예:잉크론)

최후의 수단으로 업로드 디렉터리에서 일반 cron 작업을 실행하여 권한을 수정할 수 있습니다.

나는 사용하는 것이 좋습니다마스크방법.

관련 정보