WWW 폴더에 대한 리눅스 권한을 설정하는 방법?


69

업데이트 된 요약

/ var / www 디렉토리는 다음을 소유합니다 root:root. 즉, 아무도 사용할 수 없으며 완전히 쓸모가 없습니다. 우리 모두는 실제로 작동하는 웹 서버를 원하므로 아무도 "루트"로 로그인하지 않아야하므로이 문제를 해결해야합니다.

두 엔터티 만 액세스해야합니다.

  1. PHP / Perl / Ruby / Python 은 폴더와 파일을 많이 생성하므로 폴더와 파일에 액세스해야합니다 (예 :) /uploads/. 이 스크립팅 언어는 nginx 또는 아파치 (또는 PHP 용 FastCGI와 같은 것)에서 실행되어야합니다.

  2. 개발자

그들은 어떻게 접근합니까? 나는 누군가 어딘가에서 전에 이것을 한 것을 알고 있습니다. 그러나 수십억 개의 웹 사이트가 있다면이 주제에 대한 더 많은 정보가있을 것이라고 생각할 것입니다.


777은 소유자 / 그룹 / 기타에 대한 전체 읽기 / 쓰기 / 실행 권한이라는 것을 알고 있습니다. 따라서 임의의 사용자에게 모든 권한을 부여하므로 이것이 올바르게 필요 하지 않은 것 같습니다 .

어떤 권한을 사용할 필요가있다 /var/www그래서 :

  1. git 또는 svn과 같은 소스 제어
  2. "웹 사이트"와 같은 그룹의 사용자 ( 또는 "www-data"에 추가됨 )
  3. 아파치 나 라이트와 같은 서버
  4. 그리고 PHP / Perl / Ruby

거기에서 파일과 디렉토리를 읽고 만들고 실행할 수 있습니까?

내가 맞다면 Ruby와 PHP 스크립트는 직접 "실행"되지 않고 인터프리터에게 전달된다. 따라서 파일에 대한 실행 권한이 필요하지 않습니다 /var/www...? 따라서 것 올바른 권한을 것 같다 chmod -R 1660할 것이다

  1. 이 네 가지 엔티티가 공유 할 수있는 모든 파일
  2. 실수로 실행 불가능한 모든 파일
  3. 디렉토리에서 다른 사람을 완전히 차단
  4. 이후의 모든 파일에 대해 권한 모드를 "고정"으로 설정

이 올바른지?

업데이트 1 : 파일과 디렉토리에 다른 권한이 필요할 수 있음을 깨달았습니다. 위의 파일에 대해 이야기 했으므로 디렉토리 권한이 무엇인지 확실하지 않습니다.

업데이트 2 :/var/www 위의 네 가지 엔티티 중 하나가 항상 여러 수준의 폴더와 하위 폴더를 추가 (및 때로는 제거)함에 따라 변경 사항 의 폴더 구조가 크게 향상되었습니다. 또한 다른 3 개의 엔터티에 대한 읽기 / 쓰기 액세스 권한이 필요한 파일을 만들고 제거합니다. 따라서 권한은 파일과 디렉토리 모두에 대해 위의 네 가지 작업을 수행해야합니다. 그들 중 누구도 실행 권한이 필요하지 않기 때문에 (위의 ruby ​​/ php에 대한 질문 참조) rw-rw-r--이 4 개의 엔티티가 신뢰할 수있는 직원 (# 2 참조)과 다른 모든 사용자 가 실행하기 때문에 권한이 필요하고 완전히 안전 하다고 가정 합니다. 시스템에는 읽기 권한 만 있습니다.

업데이트 3 : 개인 개발 컴퓨터 및 개인 회사 서버용입니다. 공유 호스트와 같은 임의의 "웹 고객"이 없습니다.

업데이트 4 : slicehost 의이 기사 는 www 폴더에 대한 권한을 설정하는 데 필요한 것을 설명하는 데 가장 좋습니다. 그러나 PHP 또는 svn / git을 사용하는 사용자 또는 그룹 apache / nginx와 그 변경 방법을 잘 모르겠습니다.

업데이트 5 : 마침내이 모든 것을 작동시키는 방법을 찾았습니다 (아래 답변). 그러나 이것이 올바른 올바른 방법인지는 모르겠습니다. 그러므로 나는 현상금을 시작했습니다. www 디렉토리를 보호하고 관리하는 가장 좋은 방법을 가진 사람이 승리합니다.

답변:


47

더 많은 연구를 한 후에는 다른 대답 (아마도 더 좋은 방법)이 www 폴더를 설정하는 것 같습니다.

  1. sudo usermod -a -G developer user1 (각 사용자를 개발자 그룹에 추가)
  2. sudo chgrp -R developer /var/www/site.com/ 개발자들이 거기서 일할 수 있도록
  3. sudo chmod -R 2774 /var/www/site.com/ 개발자 만 파일을 작성 / 편집 할 수 있도록합니다 (다른 / 세계는 읽을 수 있음)
  4. sudo chgrp -R www-data /var/www/site.com/uploads www-data (apache / nginx)가 업로드를 만들 수 있도록합니다.

때문에 git사용자가이를 호출 무엇으로 실행 한 후 한 사용자가 "개발자"그룹에서와 같이 그들은 자식 저장소를 폴더, 편집 PHP 파일을 생성하고 관리 할 수 있어야한다.

참고 : (3) 단계에서 : 2774의 '2'는 디렉토리에 대해 '그룹 ID'를 설정하는 것을 의미합니다. 이로 인해 새 파일과 그 안에 작성된 하위 디렉토리가 사용자의 기본 그룹 대신 상위 디렉토리의 그룹 ID를 상속합니다. 참조 : http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories


나에게 합리적으로 보인다.
wazoox

좋은. 어쩌면 내가 더 많은 사람들과 함께 이것을 확인할 수 있다면이 접근법을 사용할 것입니다. 내가 사람들을 짜낼 수 있었던 가장 좋은 대답 인 것 같습니다.
Xeoncross

파일의 소유자가 누구인지 지정하지 않았습니다. 루트로 두시겠습니까? 그런 다음 sudoers 만 업로드 폴더를 편집 할 수 있습니다 (아마 의도하지 않은 것).
Nic

예, 루트는 소유자로 남아 있습니다. 그러나 그룹 소유자는 이제 "개발자"이고 wrx 권한이 있으므로 모든 개발자 (및 apache / nginx)도 읽을 수 있습니다. sudo가 필요 없습니다.
Xeoncross

7
주목해야 할 또 하나의 것은 umask입니다. 많은 시스템의 기본 umask는 022이며, 새 파일에 대한 그룹 및 공용의 쓰기 권한을 제거합니다. 002 (공개 쓰기 금지) 또는 007 (공개 액세스 금지)을 원한다고 생각합니다. 디렉토리에 액세스해야하는 모든 프로세스에 대해 Apache 구성 및 / 또는 시작 스크립트에서 umask를 설정할 수 있습니다. 개발자를 위해 기본적으로 설정되도록 이것을 / etc / profile 또는 / etc / bashrc에 추가하는 것을 잊지 마십시오
Mark Porter

8

"올바른지"확실하지 않지만 다음은 서버에서 수행하는 작업입니다.

  • / var / www에는 각 웹 사이트의 폴더가 있습니다.
  • 각 웹 사이트에는 지정된 소유자가 있으며 웹 사이트 디렉토리에있는 모든 파일 및 폴더의 소유자로 설정됩니다.
  • 웹 사이트를 유지 관리하는 모든 사용자는 웹 사이트 그룹에 배치됩니다.
  • 이 그룹은 디렉토리에있는 모든 파일 및 폴더의 그룹 소유자로 설정됩니다.
  • 웹 서버 (예 : PHP)가 작성해야하는 모든 파일 또는 폴더는 소유자가 아파치를 실행하는 사용자 인 www-data로 변경되었습니다.

내용을 나열 할 수 있도록 디렉토리에서 실행 비트를 활성화해야합니다.


그러면 git / svn 또는 PHP는 어떻게 새 폴더를 생성합니까?
Xeoncross

2
PHP는 웹 서버와 동일한 사용자 컨텍스트에서 실행되므로 웹 서버가 소유 한 모든 디렉토리에 파일과 폴더를 작성할 수 있습니다. 일반적으로 이와 같은 몇 개의 폴더 만 있습니다 (예 : / uploads /). git / svn에 대해 잘 모르겠습니다. 웹 사이트를 제어하는 ​​그룹 계정에 추가 할 수 있습니까?
Nic

분명히 git은 다른 도구와 마찬가지로 사용자가 실행하는 것처럼 실행됩니다.
Xeoncross

그런 다음 git 사용자를 아파치 그룹에 추가하고 폴더 그룹에 쓰기 권한을 부여하십시오.
David Rickman

방금 git에는 사용자가 없습니다. 현재 사용자로 사용하고 있습니다.
Xeoncross

7

더 많은 연구를 한 후에 git / svn 도구 는 사용자가 사용하는 도구 로 실행되므로 문제가되지 않습니다. (그러나 git / svn 데몬은 다른 문제입니다!) git으로 생성 / 복제 한 모든 것은 내 권한을 가지고 있으며 git 도구는 /usr/bin이 논문에 맞는 것으로 나열되었습니다 .

힘내 권한이 해결되었습니다.

www 디렉토리에 액세스해야하는 모든 사용자 www-data를 아파치 (및 nginx)가 실행되는 그룹 에 추가하여 사용자 권한을 해결할 수있는 것 같습니다 .

따라서이 질문에 대한 하나의 대답 은 다음과 같습니다.

기본적 /var/www으로 소유 root:root하며 아무도 파일을 추가하거나 변경할 수 없습니다.

1) 그룹 소유자 변경

먼저 "root"그룹 대신 "www-data"가 소유하도록 www 디렉토리 그룹을 변경해야합니다.

sudo chgrp -R www-data /var/www

2) www-data에 사용자 추가

그런 다음 현재 사용자 (및 다른 사람)를 www-data 그룹에 추가해야합니다

sudo usermod -a -G www-data demousername

3) CHMOD www 디렉토리

소유자 (루트)와 "www-data"그룹의 모든 사용자 만 파일 및 디렉토리를 rwx (읽기 / 쓰기 / 실행) 할 수 있도록 권한을 변경하십시오 (다른 사람도 액세스 할 수 없음 ).

sudo chmod -R 2770 /var/www

이제 액세스 권한이있는 사용자 (예 : "www-data"그룹)가 생성 한 모든 파일과 디렉토리는 아파치와 php로 읽고 쓸 수 있습니다.

이 올바른지? PHP / Ruby가 생성 한 파일은 어떤가요? www-data 사용자가 액세스 할 수 있습니까?


6
PHP로 모든 웹 파일을 쓸 수 있다는 생각이 마음에 들지 않습니다. 스크립트 취약점이 있으면 노출 가능성이 높아집니다.
Nic

좋아, PHP를 사용하여 많은 텍스트, tar, 로그 및 이미지 파일 (폴더 포함)을 만들므로 모든 것이 쓰기 가능해야한다고 가정했습니다. 그러나, 아마도 당신의 권리와 PHP는 할 수 있어야한다 이 생성 FILES CHANGE 모든 PHP 애플리케이션의 99 %가 결코 스크립트 파일을 수 없기 때문에 해가 될 것입니다. 다른 선택은 특정 디렉토리 PHP 쓰기 액세스 (/ uploads /) 만 허용하는 것 같습니다. PHP는 여전히 거기에 나쁜 것을 만들 때 사용할 수 있기 때문입니다. 어떤 아이디어?
Xeoncross

2
스크립트와 데이터를 별도로 유지하십시오. 침입자가 / uploads /에 무언가를 떨어 뜨려도 실행 가능하지 않아야합니다. 계층의 보안이 핵심입니다.
Nic

6

고정 성은 권한 상속이 아닙니다. 디렉토리의 고정 성은 파일 소유자 또는 디렉토리 소유자 만 권한이 달리 말하더라도 디렉토리에서 해당 파일의 이름을 바꾸거나 해당 파일을 삭제할 수 있음을 의미합니다. 따라서 / tmp /에 1777이 있습니다.

클래식 유닉스에서는 파일 시스템을 기반으로하는 권한 상속이없고 현재 프로세스의 umask 만 있습니다. * BSD 또는 디렉토리에 setgid가있는 Linux에서 새로 작성된 파일의 그룹 필드는 상위 디렉토리의 그룹 필드와 동일하게 설정됩니다. 더 많은 것을 위해서는 디렉토리에 'default'ACL을 사용하여 ACL을 살펴보고 권한을 상속받을 수 있습니다.

* 사용자가 시스템에 액세스 할 수있는 대상 * 위협 모델이 무엇인지 정의하여 시작해야합니다.

예를 들어 여러 고객과 웹 호스팅을하고 있고 서로 파일을 보지 않으려는 경우 모든 사용자에 대해 공통 그룹 "웹 커스"와 0705의 디렉토리 모드를 사용할 수 있습니다. 웹 서버 프로세스 ( 하지 "webcusts"에서)는 다른 파마를 볼 수와 허용; 고객은 서로의 파일을 볼 수 없으며 사용자는 자신의 파일을 엉망으로 만들 수 있습니다. 그러나 이것은 당신이 허용하는 순간 당신은 CGI 나 PHP를 의미 않는 프로세스가 (책임에 대한 여러 사용자 -에 - 하나의 호스트에 대한 어쨌든 좋은 연습) 특정 사용자로 실행되었는지 확인합니다. 그렇지 않으면 고객은 CGI를 통해 서로의 파일을 엉망으로 만들 수 있습니다.

그러나 웹 사이트의 런타임 사용자가 웹 사이트의 소유자와 동일하면 스크립트의 보안 허점 인 경우 악용 자로부터 콘텐츠를 보호 할 수없는 문제가 있습니다. 전용 호스트가이기는 곳으로, 정적 컨텐트 소유자와 다른 런타임 사용자를 가질 수 있고 다른 사용자와의 상호 작용에 대해 크게 걱정할 필요가 없습니다.


좋은 대답입니다. MacOS X에서 시스템은 SGID 비트가 디렉토리에있는 것처럼 자동으로 작동합니다. 고정 비트는 일반적으로 파일을 쓸 수있는 경우에만 파일을 제거 할 수 있음을 의미합니다. 즉, 누구나 / tmp에서 공개적으로 쓰기 가능한 파일을 제거 할 수 있습니다. MacOS X에서 / tmp는 사용자의 개인 디렉토리에 대한 심볼릭 링크이므로 결국 공유가 없습니다.
Jonathan Leffler 5

답변 주셔서 감사합니다. 추가 정보로 질문을 업데이트했습니다.
Xeoncross

Jonathan : 고정 비트는 디렉토리의 소유자 또는 파일의 소유자 만이 이름을 바꾸거나 삭제할 수 있음을 의미합니다 (즉, 'file'디렉토리의 항목에 따라 작동). 개별 파일에 대한 권한은 이러한 디렉토리 작업 ( rename(), unlink())에 대해서는 작동하지 않으며 파일 자체에 대한 작업 ( open()) 에만 적용됩니다 . 이것은 "일반적인"행동입니다.
Phil P

2

가장 좋은 방법은 Posix ACL을 사용하는 것입니다. 그들은 편안하게 작업하고 필요한 모든 기능을 제공합니다.

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs


ACL에 대한 유용한 정보는 +1입니다. 그러나 몇 명의 개발자와 함께 간단한 서버를 관리하기 위해 여분의 정크가 시스템을 정지시키는 것을 원하지 않습니다. ACL을 사용하기 위해 커널을 다시 컴파일하는 것에 익숙하지 않습니다.
Xeoncross

@ Xeoncross : ACL은 아무것도 늪지 않습니다. 그것들은 일반적인 파일 권한과 같은 메타 정보입니다. "추가적"이고 복잡한 것은 아닙니다. 혼란스럽고 끈적한 / 그룹 / 어떤 솔루션보다 권한을 관리하는 가장 간단하고 가장 좋은 방법이라고 생각합니다. 두려워하지 말고 acl로 다시 마운트하고 사용해보십시오!
타이 파이터

1

파일의 소유자는 파일을 생성 한 사람이어야하고 그룹은 www-data 여야합니다. 디렉토리 / 파일의 모드는 일반적으로 755/644입니다. 디렉토리 및 파일의 경우 그룹에 쓰기 액세스 권한이 필요하지만 mod는 775/664입니다. 논이 개발자라고 가정하십시오. 이것은 모두 다음을 만듭니다 :

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;

0

@ Xeoncross의 답변에 추가하여 파일과 디렉토리에 대한 권한을 별도로 구성하는 것이 좋습니다.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

이를 통해 개발자는 / var / www 내에서 디렉토리를 만들고 수정할 수 있습니다. 개발자가 추가 디렉토리를 만들거나 더 이상 필요하지 않은 디렉토리를 제거해야하기 때문에 중요해 보입니다.

또한 개발자는 코드 파일 (HTML, PHP 파일 등 읽기)을 작성하고 수정할 수 있습니다. 그러나 여전히 다른 사람에게는 읽기 전용 액세스 만 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.