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.