Linux 웹 서버에서 내 웹 사이트 파일 / 폴더에 어떤 권한이 있어야합니까?


309

이것은 Linux 웹 서버의 파일 권한에 관한 정식 질문 입니다.

여러 웹 사이트를 호스팅하는 Apache2를 실행하는 Linux 웹 서버가 있습니다. 각 웹 사이트에는 / var / www /에 자체 폴더가 있습니다.

/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/

기본 디렉토리 / var / www /는 root : root가 소유합니다. Apache는 www-data : www-data로 실행 중입니다. Fabrikam 웹 사이트는 Alice와 Bob의 두 개발자가 관리합니다. 두 Contoso 웹 사이트는 한 명의 개발자 인 Eve가 관리합니다. 모든 웹 사이트에서는 사용자가 이미지를 업로드 할 수 있습니다. 웹 사이트가 손상되면 가능한 한 영향이 제한되어야합니다.

Apache가 콘텐츠를 제공하고 웹 사이트가 공격으로부터 보호되며 개발자가 여전히 변경할 수 있도록 권한을 설정하는 가장 좋은 방법을 알고 싶습니다. 웹 사이트 중 하나는 다음과 같이 구성됩니다.

/var/www/fabrikam.com
    /cache
    /modules
    /styles
    /uploads
    /index.php

이 디렉토리와 파일에 대한 권한을 어떻게 설정해야합니까? 웹 사이트에서 777 권한을 사용해서는 안되는 곳을 읽었지만 어떤 문제가 발생할 수 있는지 이해하지 못합니다. 사용량이 많은 기간 동안 웹 사이트는 자동으로 일부 페이지를 캐시하고 결과를 캐시 폴더에 저장합니다. 웹 사이트 방문자가 제출 한 모든 컨텐츠는 업로드 폴더에 저장됩니다.


6
이것은하기위한 것입니다 정규 우리는 웹 사이트 권한에 대해 얻을 수있는 모든 질문에 대한 대답.
Nic

"웹 사이트에서 777 권한을 사용해서는 안된다는 것을 읽었지만 이해할 수 없습니다 ..."-독자는 여기에서 답변의 장점을 이해하거나 적어도 비교할 수 있습니까? 모든 솔루션은 특정 요구 사항을 기반으로해야합니다. 여기의 요구 사항은 충분히 구체적이지 않습니다 (위협 모델이란 무엇)
symcbean

6
Apache에 대해 문의하고 있지만 Microsoft가 일반적으로 예로 사용하는 도메인을 사용하고 있습니다.
gWaldo


답변:


342

사용할 권한을 결정할 때는 사용자가 누구이며 필요한 것이 무엇인지 정확히 알아야합니다. 웹 서버는 두 가지 유형의 사용자와 상호 작용합니다.

인증 된 사용자는 서버에 사용자 계정이 있으며 특정 권한을 제공받을 수 있습니다. 일반적으로 시스템 관리자, 개발자 및 서비스 계정이 포함됩니다. 일반적으로 SSH 또는 SFTP를 사용하여 시스템을 변경합니다.

익명 사용자는 웹 사이트 방문자입니다. 파일에 직접 액세스 할 수있는 권한은 없지만 웹 페이지를 요청할 수 있으며 웹 서버가 대신 사용합니다. 웹 서버 프로세스의 권한에주의하여 익명 사용자의 액세스를 제한 할 수 있습니다. 많은 Linux 배포판에서 Apache는 www-data사용자 로 실행 되지만 다를 수 있습니다. 사용 ps aux | grep httpd또는 ps aux | grep apache아파치가 시스템에 사용하는 것을 사용자가 볼 수 있습니다.


리눅스 권한에 대한 참고 사항

Linux 및 기타 POSIX 호환 시스템은 전통적인 유닉스 권한을 사용합니다. Wikipedia에 대한 파일 시스템 권한 에 대한 훌륭한 기사가 있으므로 여기에서 모든 것을 반복하지는 않습니다. 그러나 알아야 할 것이 몇 가지 있습니다.

실행 비트
해석 된 스크립트 (예 : Ruby, PHP)는 실행 권한 없이도 제대로 작동합니다. 바이너리 및 셸 스크립트에만 실행 비트가 필요합니다. 디렉토리를 순회 (입력)하려면 해당 디렉토리에 대한 실행 권한이 있어야합니다. 웹 서버는 디렉토리를 나열하거나 그 안의 파일을 제공하려면이 권한이 필요합니다.

기본 새 파일 권한
파일을 만들 때 일반적으로 파일을 만든 사람의 그룹 ID를 상속합니다. 그러나 때로는 새 파일이 생성 된 폴더의 그룹 ID를 상속하기를 원하므로 부모 폴더에서 SGID 비트를 활성화해야합니다.

기본 권한 값은 umask에 따라 다릅니다. umask는 새로 작성된 파일에서 권한을 빼므로 공통 값 022는 755로 파일을 작성합니다. 그룹과 협업 할 때 umask를 002로 변경하여 작성하는 파일을 그룹 구성원이 수정할 수 있도록하는 것이 유용합니다. 그리고 업로드 된 파일의 권한을 사용자 정의하려면 파일을 업로드 한 후 아파치의 umask를 변경하거나 chmod를 실행해야합니다.


777의 문제

당신이 chmod 777당신의 웹 사이트를 할 때 , 당신은 보안이 전혀 없습니다. 시스템의 모든 사용자는 웹 사이트의 파일을 변경하거나 삭제할 수 있습니다. 그러나 더 진지하게, 웹 서버는 웹 사이트 방문자를 대신하여 작동하며 이제 웹 서버는 실행중인 파일과 동일한 파일을 변경할 수 있습니다. 웹 사이트에 프로그래밍 취약점이있는 경우이를 악용하여 웹 사이트를 손상 시키거나 피싱 공격을 삽입하거나 서버로부터 정보를 도용 할 수 있습니다.

또한 서버가 잘 알려진 포트 (루트를 사용하지 않는 사용자가 월드 액세스 가능한 리스닝 서비스를 생성하지 못하게해야 함) 에서 실행되는 경우 서버는 루트로 시작해야합니다. 포트가 바인드되면 권한이 적은 계정으로). 즉, 주 실행 파일이 버전 제어의 일부인 웹 서버를 실행하는 경우 (예 : CGI 앱) 사용자의 이름을 바꿀 수 있으므로 권한 (또는 그와 관련하여 포함 디렉토리의 권한)은 그대로 둡니다. 777의 실행 파일)은 모든 사용자가 모든 실행 파일을 루트 로 실행할 수 있도록 합니다 .


요구 사항 정의

  • 개발자는 웹 사이트를 업데이트 할 수 있도록 파일에 대한 읽기 / 쓰기 액세스 권한이 필요합니다
  • 개발자는 디렉토리에서 읽기 / 쓰기 / 실행이 필요하므로 탐색 할 수 있습니다.
  • Apache는 파일 및 해석 된 스크립트에 대한 읽기 액세스 권한이 필요합니다
  • Apache는 서비스 가능한 디렉토리에 대한 읽기 / 실행 액세스 권한이 필요합니다
  • Apache는 업로드 된 컨텐츠의 디렉토리에 대한 읽기 / 쓰기 / 실행 액세스 권한이 필요합니다

단일 사용자가 유지 관리

한 명의 사용자 만 사이트를 관리해야하는 경우 웹 사이트 디렉토리에서 사용자 소유자로 설정하고 사용자에게 전체 rwx 권한을 부여하십시오. Apache는 여전히 파일을 제공 할 수 있도록 액세스 권한이 필요하므로 www-data를 그룹 소유자로 설정하고 그룹 rx 권한을 부여하십시오.

귀하의 경우, 사용자 이름이 인 Eve eve는 다음을 유지 관리하는 유일한 사용자입니다 contoso.com.

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

Apache에서 쓰기 가능해야하는 폴더가있는 경우 www-data가 쓰기 액세스 권한을 갖도록 그룹 소유자의 권한 값을 수정할 수 있습니다.

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

이 구성의 장점은 사용자와 그룹 소유자 만 웹 사이트 디렉토리를 탐색 할 수 있기 때문에 시스템의 다른 사용자가 스누핑하기가 더 어려워 지지만 불가능하지는 않다는 것입니다. 구성 파일에 비밀 데이터가있는 경우 유용합니다. umask에주의하십시오! 여기에서 새 파일을 작성하면 권한 값의 기본값은 755가됩니다. umask 027새 파일의 기본값이 640 ( rw- r-- ---)이 되도록 실행할 수 있습니다 .


사용자 그룹에 의해 유지 관리

둘 이상의 사용자가 사이트 유지 관리를 담당하는 경우 권한 할당에 사용할 그룹을 만들어야합니다. 각 웹 사이트마다 별도의 그룹을 만들고 해당 웹 사이트 이름을 따서 그룹을 지정하는 것이 좋습니다.

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

이전 예에서는 그룹 소유자를 사용하여 Apache에 권한을 부여했지만 이제는 개발자 그룹에 사용됩니다. 사용자 소유자는 더 이상 우리에게 유용하지 않으므로 루트로 설정하면 권한이 유출되지 않는 간단한 방법입니다. 아파치는 여전히 액세스 권한을 필요로하므로 우리는 다른 세계에 대한 읽기 권한을 부여합니다.

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Apache에서 쓰기 가능해야하는 폴더가있는 경우 Apache를 사용자 소유자 또는 그룹 소유자로 만들 수 있습니다. 어느 쪽이든, 필요한 모든 액세스 권한을 갖습니다. 개인적으로 개발자가 업로드 폴더의 내용을 탐색하고 수정할 수 있도록 사용자 소유자로 설정하는 것을 선호합니다.

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

이것이 일반적인 접근법이지만 단점이 있습니다. 시스템의 다른 모든 사용자는 웹 사이트에 대해 Apache와 동일한 권한을 가지므로 다른 사용자가 사이트를 탐색하고 구성 파일과 같은 비밀 데이터가 포함 된 파일을 쉽게 읽을 수 있습니다.

케이크를 먹고 먹을 수도 있습니다

이것은 더 향상 될 수 있습니다. 소유자는 그룹보다 적은 권한을 갖는 것이 합법적이므로 루트에 할당하여 사용자 소유자를 낭비하는 대신 Apache를 웹 사이트의 디렉토리 및 파일에서 사용자 소유자로 만들 수 있습니다. 이것은 단일 유지 관리자 시나리오의 반대이지만 동일하게 작동합니다.

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Apache에서 쓰기 가능해야하는 폴더가있는 경우 www-data가 쓰기 액세스 권한을 갖도록 사용자 소유자의 권한 값을 수정할 수 있습니다.

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

이 솔루션에서주의해야 할 사항은 새 파일의 사용자 소유자가 www-data로 설정되지 않고 작성자와 일치한다는 것입니다. 따라서 생성 한 새 파일은 숨길 때까지 Apache에서 읽을 수 없습니다.


* 아파치 권한 분리

앞에서 언급 한 바에 따르면 사용중인 권한의 종류에 관계없이 다른 사용자가 웹 사이트를 스누핑 할 수 있습니다. 기본적으로 모든 Apache 프로세스는 동일한 www-data 사용자로 실행되므로 모든 Apache 프로세스는 동일한 서버에 구성된 다른 모든 웹 사이트에서 파일을 읽고 때로는 변경을 수행 할 수도 있습니다. Apache를 통해 스크립트를 실행할 수있는 모든 사용자는 Apache 자체와 동일한 액세스 권한을 얻을 수 있습니다.

이 문제를 해결하기 위해 Apache 에는 권한 분리 에 대한 다양한 접근 방식이 있습니다 . 그러나 각 방법에는 다양한 성능 및 보안 단점이 있습니다. 제 생각에는 보안 요구 사항이 더 높은 사이트는 공유 서버에서 VirtualHosts를 사용하는 대신 전용 서버에서 실행해야합니다.


추가 고려 사항

이전에 언급하지는 않았지만 일반적으로 개발자가 웹 사이트를 직접 편집하도록하는 것은 좋지 않습니다. 더 큰 사이트의 경우 버전 제어 시스템의 컨텐츠에서 웹 서버를 업데이트하는 일종의 릴리스 시스템을 사용하는 것이 훨씬 좋습니다. 단일 유지 관리 방법이 이상적 일 수 있지만 자동화 된 소프트웨어를 사용하는 사람이 아닙니다.

웹 사이트에서 업로드 할 필요가없는 업로드를 허용하는 경우 해당 업로드는 웹 루트 외부에 저장해야합니다. 그렇지 않으면 사람들이 비밀로 만든 파일을 다운로드하고 있음을 알 수 있습니다. 예를 들어, 학생들이 과제를 제출할 수있게하려면 Apache가 제공하지 않는 디렉토리에 과제를 저장해야합니다. 이것은 또한 비밀을 포함하는 구성 파일에 대한 좋은 접근 방법입니다.

보다 복잡한 요구 사항이있는 웹 사이트의 경우 액세스 제어 목록 사용을 살펴볼 수 있습니다 . 이를 통해 훨씬 더 정교한 권한 제어가 가능합니다.

웹 사이트에 복잡한 요구 사항이있는 경우 모든 권한을 설정하는 스크립트를 작성할 수 있습니다. 철저히 테스트 한 다음 안전하게 보관하십시오. 어떤 이유로 든 웹 사이트를 다시 만들어야하는 경우 금의 가치가 있습니다.


10
"chmod -R 775 fabrikam.com". 대부분의 웹 사이트 내에서 실행 가능한 파일은 거의 없습니다. 예를 들어 웹 서버가 읽을 수있는 한 PHP 스크립트는 0640이 될 수 있습니다. chmod -R a + X fabrikam.com은 디렉토리에있는 모든 사람에게만 실행 권한을 부여합니다.

7
Apache는 apacheRed Hat 파생 시스템에서 사용자로 실행됩니다 .
Michael Hampton

이것은 훌륭하지만, 내가 이해하지 못하는 한 가지가 있습니다. 파일에 대한 그룹 소유권이 이미있는 경우 파일 디렉토리의 사용자 / 소유자를 아파치로 만드는 전략의 목표 나 이점을 이해하지 못합니다.
idiotprogrammer

이 답변은 포괄적이지만 DAC 권한 만 처리합니다. MAC 권한도 고려해야한다고 생각합니다.
dawud

1
이것은 훌륭한 게시물입니다. 여기 내 기여는 다음과 같습니다에 언급 된 그룹 (등의 소유자 및 DEV-는 Fabrikam로 www가 데이터를 사용의 단점 당신의 케이크를 가지고 너무 먹을 수있는 당신 도에서 제공되는 시나리오) 역 (적용 단일 사용자에 의해 관리 된다는 점에서. 시나리오에서 Apache가 폴더 또는 파일을 만들 때마다 사용자가 액세스 할 수 없으므로 파일을 원래 사용자에게 다시 가져와야합니다. 내 진술에 대해 100 % 확신하지 못해 답변을 업데이트하지 않았습니다 답변을 패치하기 전에 다른 사람들이 확인하도록

14

왜 많은 사람들이 아파치 (및 / 또는 PHP)를 할 수 있는지 제어하기 위해 리눅스 권한의 "기타"(o) 부분을 사용 (또는 권장)하는 이유가 궁금합니다. 이 올바른 부분을 "0"이외의 다른 것으로 설정하면 전 세계가 파일 / 디렉토리에서 무언가를 수행 할 수 있습니다.

내 접근 방식은 다음과 같습니다.

  • 두 명의 분리 된 사용자를 만듭니다. 하나는 SSH / SFTP 액세스 (필요한 경우)이며, 모든 파일을 소유하고 PHP FastCGI 사용자 (웹 사이트를 실행할 사용자)를위한 것입니다. 이 사용자들을 각각 bobbob-www 라고합시다 .
  • bob 은 전체 웹 사이트를 읽고 편집 할 수 있는 모든 권한 ( 폴더의 rwx , 파일의 rw- on) 을 갖 습니다.
  • PHP FastCGI 프로세스 에는 "쓰기"권한이 필요한 or 와 같은 매우 특정한 폴더를 제외하고 폴더에 대한 rx 권한과 파일에 대한 r- 권한이 필요합니다. PHP를 FastCGI를이 기능을 제공하기 위해서는으로 실행됩니다 밥-WWW , 그리고 밥-WWW는 자동으로 생성 된 추가됩니다 그룹.cache/uploads/
  • 이제 모든 디렉토리와 파일의 소유자와 그룹이 bob bob 인지 확인합니다 .
  • 심지어 우리가 FastCGI를 사용하지만 아파치는 여전히 정적 콘텐츠, 또는이 경우 읽으려고합니다 .htaccess 파일에 대해 읽기 액세스를 필요로 : 뭔가가 누락 AllowOverride보다는 다른 것으로 설정되어 있습니다 None. 사용하지 않는 것이 권리의 일부를, 내가 추가 www가 데이터 받는 사용자를 그룹.

지금:

  • 개발자가 수행 할 수있는 작업을 제어하려면, 우리는 함께 플레이 할 수 U의 권리의 일부 (그러나 아래이 노트).
  • 아파치와 PHP가 할 수있는 작업을 제어하기 위해, 우리는 함께 플레이 할 수 g의 권리의 일부.
  • O를 서버에 아무도 읽거나 웹 사이트를 편집 할 수 있도록 부분은 항상 0으로 설정됩니다.
  • bob 사용자는 자동으로 주 그룹 ( bob )에 속하므로 새 파일을 작성할 때 문제가 없습니다 .

이것은 요약하지만이 상황에서 bob 은 SSH로 허용됩니다. 웹 사이트를 수정할 수있는 사용자가 안 경우 (예. 고객은 단지 CMS 관리자 패널을 통해 웹 사이트를 수정하고 리눅스에 대한 지식이없는), 어쨌든 두 명의 사용자를 만들 수 있지만, 제공 /bin/false에 대한 셸 도하고, 로그인을 비활성화하십시오.

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

참고 : 사람들은 파일 소유자가 명령을 실행할 수 있기 때문에 u (소유자) 권한 을 제한하는 것이 쓸모없고 안전하지 않다는 것을 잊는 경향이 있습니다 chmod.

100 % 확실하지 않기 때문에 내 접근 방식에 보안 문제가 있는지 알려주십시오.

이 구성에는 문제가 있다고 생각합니다 .PHP / Apache가 새 파일 (예 : 업로드)을 만들면 bob-www : bob 에 속하고 bob 은 읽을 수만 있습니다. 디렉토리의 setuid가 문제를 해결할 수 있습니다.


리눅스는 무시한다 setuid. 새 파일은 항상 제작자가 소유합니다.
Paul

이해가 안 돼요 더 많은 개발자가 웹 사이트에서 동시에 작업 할 때 상황을 반영하지 않는 것 같습니다 bob. 유일한 사용자는 입니다. 어떻게 처리합니까? 예 : ssh를 통해 두 사용자 모두 bob으로 로그인합니다. bob (1)은 암호를 기억할 수 없다고 생각하고 다른 암호로 변경하지만 여전히 안전합니다. bob (2)는 다음에 로그인하려고 시도했지만 로그인 할 수 없습니다.
n611x007

2
@naxa 약간 좋은 시스템은 개발자가 웹 사이트를 직접 수정하지 않아야합니다. 이상적으로, 웹 사이트는 사용자 계정 'bob'이 각 (안정된) 릴리스를 자동으로 가져 와서 배포 할 수 있도록 버전 제어 상태에 있습니다. 따라서 개발자는 개발 오프 사이트를 수행하고 변경 사항이 배포 서버에 푸시되면 변경 사항이 배포됩니다. 'bob'은 원격 로그인을 포함하지 않는 네트워크 권한이 매우 제한적인 시스템 사용자입니다. iptables는 실제로 UID로 필터링하여 이와 같은 것을 필터링 할 수 있습니다.
Parthian Shot

"왜 그렇게 많은 사람들이"다른 "(o) 부분을 사용 (또는 권장)하는지 궁금합니다. 그러면 아마도 답변이 아닌 질문으로 게시했을 것입니다. 지원, 개발, 관리 계정은 또한 다른 접근이 필요하면서 의도적으로 권한 가장 낮은 수준 (시스템의 가장 노출 부분 등) 웹 서버를 실행하는 드문 일이 아니에요
symcbean

@ParthianShot은 귀하가 사이트를 관리하지 않지만 폴더가 서버에 존재하는 경우 제 3 자에게 강제로 강요 할 수 없습니다. 때때로 그들이 무엇을해야하는지 아는 것은 ftp를 사용하는 것입니다.
Peregring-lk

9

위의 우수한 답변에서 Google 순위를 감안할 때 주목해야 할 것이 하나 있다고 생각하며 답변 후에 메모를 남길 수 없습니다.

이 예를 계속하여 디렉토리 (또는 파일)에 대한 570 권한을 가진 소유자로 www-data를 사용하고 dev-fabrikam을 그룹으로 사용하려는 경우 Linux는 무시 setuid 하므로 모든 새 파일은 그들을 만든 사용자. 이것은 새로운 디렉토리와 파일을 만든 후에 다음과 비슷한 것을 사용해야한다는 것을 의미합니다.

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

Rackspace OpenStack의 Ubuntu 12.04에서 서버를 재부팅 할 때까지 권한 570을 사용할 수없는 이상한 문제가 발생하여 마술로 문제가 해결되었습니다. 겉보기에는 단순한 문제에 비해 머리카락이 점점 빠릅니다 ....


Raspbian (일명 raspberry pi)에서 lighttpd (또는 다른 웹 브라우저)에서 / var / www의 소유권을 변경하려면 반드시 재부팅해야합니다.
gbronner

@gbronner 그것이 해결하기 어려운 문제라면, 질문으로 게시하고 질문에 대한 답변을 제공하는 것을 고려할 수 있습니다. 그러나 다른 SE Q & A 사이트에서는 더 적합 할 것입니다. 제 생각 엔 유닉스와 리눅스 가 그렇게하기에 좋은 곳일 것입니다.
Paul

1
raspberrypi.stackexchange.com도 있습니다. SE 사이트가 약간의 지식을 조각난 것 같습니다.
gbronner

@gbronner lol. 나는 그것에 대해 몰랐다! U & L의 Raspbian 태그에는 120 개의 질문이 있습니다.
Paul

3

이 구성으로갑니다.

  1. 하나를 제외한 모든 디렉토리는 소유자 root및 그룹 root에 권한 세트를 업로드 합니다 0755.
  2. 모든 파일은 소유자 root및 그룹으로 root, 권한이 설정되었습니다 0644.
  3. 소유자 root, 그룹 www-data, 권한으로 설정된 디렉토리를에 업로드 합니다 1770. 스티키 비트는 그룹 소유자가 디렉토리 및 파일을 제거하거나 이름을 바꿀 수 없습니다.
  4. Inside uploads 폴더에는 www-data소유자 사용자 및 그룹이 있는 새 디렉토리와 파일을 업로드 0700하는 각 www-data사용자에 대한 권한이 있습니다.
  5. 아파치 설정 :

Apache가 파일을 읽지 않고 Apache 사용자가 업로드 폴더의 컨텐츠를 색인화 할 수 없도록 업로드 디렉토리를 거부 AllowOverride하고 삽입하십시오 .Index.htaccess

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6. php.ini구성 :

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

이 구성을 사용하면 www-data사용자가 siteDir/ /tmp및 이외의 디렉토리에 들어갈 수 없습니다 /usr/share/phpmyadmin. 또한 동일한 요청으로 업로드 할 최대 파일 크기, 최대 게시물 크기 및 최대 파일을 제어 할 수 있습니다.


3

"leo"라는 FTP 사용자가 example.com 웹 디렉토리에 파일을 업로드해야하고 "apache"사용자가 캐시 디렉토리에 uploa-files / sessions / cache 파일을 작성할 수 있어야하는 경우 다음과 같이하십시오.

이 명령은 leo를 소유자로, 그룹을 example.com에 아파치로 지정합니다. 아파치 사용자는 그룹 아파치의 일부이므로 아파치 그룹의 권한을 상속합니다.

chown -R leo : apache example.com

올바른 권한을 보장하고 보안 문제를 충족시키는 또 다른 명령.

chmod -R 2774 example.com

여기서 첫 번째 숫자 2는 디렉토리이며 생성 된 각 새 파일이 동일한 그룹 및 소유자 권한으로 유지되도록합니다. 77은 소유자 및 그룹 용이며 모든 권한을 갖습니다. 4는 다른 사람들을 위해 물마루 만 읽을 수 있음을 의미합니다.

다음은 허가 번호를 이해하는 데 도움이됩니다.

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

1

IMO는 다음을 고려해야합니다.

  • 파일을 읽는 프로세스를 신뢰하십니까? 예. PHP?

사용자가 '테스트'하는 다양한 데이터가있는 서버가 있다고 가정 해 봅시다.

'테스트'사용자에게는 다음이 있습니다.

  • 그의 데이터 $HOMEDIR
  • 그의 메일 $MAIL
  • 웹에 대한 그의 데이터 /var/www/test

이제 생각 해보자 :

  • 웹 앱은 test사용자 (PHP-FPM) 에서 실행되며 그의 파일을 삭제할 수 있습니다!
  • 웹 응용 프로그램은 test그룹 (PHP-FPM) 에서 실행됩니다 . 디렉토리에 그룹에 대해 'w'가있는 파일을 삭제하고 그룹에 대해 'r'이있는 파일을 수정할 수 있습니다. 그리고 여전히 읽을 수 있습니다-예를 들어 ssh 키!

PHP가 버그가 있다고 가정 해 보자 open_basedir. 당신 chroot은 PHP 프로세스입니까? 무엇을하지 않습니까, 모든 파일 시스템을 크롤링하기를 원하십니까?

귀하의 웹앱 프로세스, 예 : PHP-FPM은 다음과 같아야합니다.

  • 통해 특정 경로로 제한 chroot
  • 데이터 소유자의 기본 사용자 또는 기본 그룹 권한으로 실행해서는 안됩니다

따라서 당신은 할 수 있습니다 :

  • 테스트 사용자는 다음과 같습니다. test:test
  • 테스트 사용자가 보조 그룹에 있습니다 (예 : test-www
  • 웹 앱 (PHP-FPM)은 test-www:test-www
  • 웹 앱이 파일을 읽을 수있게하려면 사용자를 테스트하십시오. chmod u=rwX,g=rX,o= /var/www/test/public
  • 웹 응용 프로그램이 자신의 웹 데이터 경로에 쓸 수 있기를 원하는 경우 테스트 사용자 : chmod u=rwX,g=rwXs,o= /var/www/test/public/upload (따라서 응용 프로그램은 다음과 같이 새 파일을 만듭니다 test-www:test-www.

따라서 웹 응용 프로그램 프로세스가 허위 일 경우 그룹 읽기가 필요한 특정 파일 만 읽으며 uploaddir에만 쓸 수 있습니다 . 나는 강하게 가지고 추천 할 것 upload와 파일 시스템에 디렉토리 noexec,nodev,nosuid mount옵션을 해당 디렉토리에 새로운 희한 파일에 대한 지속적인 모니터링이 플러스도에서 새로운 프로세스 모니터링 test-wwwUID를.

Linux에서는 ACL을 사용하여 권한을 더 잘 조정할 수 있습니다. 둘 이상의 사람이 웹 데이터를 업로드해야하는 경우 웹 데이터 파일을 업로드하는 데 사용 된 계정과 사람 계정을 분리하는 것이 좋습니다. 예를 들어 새 계정을 만들려면 test-upload테스트 사용자는 ssh 키를 관리하여 어떤 사람이 ssh / sftp를 사용할 수 있는지 제한합니다. 옵션을 sshd_config알고 ExposeAuthInfo있으므로 데이터를 업로드하는 데 사용 된 ssh 키를 기록하도록 구성 할 수 있습니다.

나는 대부분의 웹 호스팅 서비스가 권한 분리에 대해 신경 쓰지 않는다는 것을 의심합니다.


PHP-FPM은 허용 chroot하고 user, group풀을 설정할 수 있습니다. 그러나 나는 php_admin_value[open_basedir]옵션을 믿지 않을 것 입니다. 또한 사용자별로 별도의 PHP-FPM 마스터를 사용하는 것이 좋습니다. ma.ttias.be/a-better-way-to-run-php-fpm 참조 데몬을 인스턴스화하는 것은 대부분의 Linux 및 * BSD 배포판에서 쉽습니다.
Jiri B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.