/ var / www에서 Apache 2 사용자 www-data의 권한을 처리하는 가장 좋은 방법은 무엇입니까?


214

누구든지 파일을 처리하기위한 훌륭한 솔루션을 가지고 /var/www있습니까? 이름 기반 가상 호스트를 실행 중이고 Apache 2 사용자는 www-data 입니다.

정규 사용자와 루트가 2 명 있습니다. 따라서 파일을 엉망으로 만들 /var/www때보 다 ...

chown -R www-data:www-data

... 항상 이것을 다루는 좋은 방법은 무엇입니까?

보충적인 질문 : 그렇다면 어떻게 하드 코어 권한을 사용합니까?

이것은 협업 개발 환경에서 항상 문제였습니다.


답변:


206

@Zoredache의 답변 을 확장하려고합니다 .

  • 새 그룹 (www-pub)을 만들고 해당 그룹에 사용자를 추가하십시오.

    groupadd www-pub

    usermod -a -G www-pub usera ##은 -a를 사용하여 기존 그룹에 추가해야합니다.

    usermod -a -G www-pub userb

    groups usera ## 사용자를위한 표시 그룹

  • / var / www 아래의 모든 소유권을 root : www-pub로 변경하십시오.

    chown -R root:www-pub /var/www 재귀에 대한 ## -R

  • 모든 폴더의 권한을 2775로 변경

    chmod 2775 /var/www ## 2 = 그룹 ID 설정, 7 = 소유자 (루트), 7 = 그룹 (www-pub), 5 = 세계 (아파치 www-data 사용자 포함)

    그룹 ID 설정 ( SETGID ) 비트 (2)는 그룹 (www-pub)이 해당 폴더에서 작성된 모든 새 파일 / 폴더에 복사되도록합니다. 다른 옵션은 사용자 ID를 복사하는 SETUID (4)와 소유자 만 파일을 삭제할 수 있다고 생각하는 STICKY (1)입니다.

    거기의 -R재귀 옵션,하지만 파일과 폴더를 구별하지 않습니다, 그래서 당신은해야 찾을 사용 과 같이 :

    find /var/www -type d -exec chmod 2775 {} +

  • 모든 파일을 0664로 변경

    find /var/www -type f -exec chmod 0664 {} +

  • 사용자의 umask를 0002로 변경하십시오.

    umask는 기본 파일 생성 권한을 제어합니다. 0002는 파일에 664와 디렉토리 775가 있음을 의미합니다. 필자의 경우 umask맨 아래 줄을 편집하여 /etc/profile한 사용자가 만든 파일을 www- chmod그들에게 필요없이 그룹 .

파일과 디렉토리를 만들고로 소유자, 그룹 및 권한을 확인하여이 모든 것을 테스트하십시오 ls -l.

참고 : 그룹 변경 사항을 적용하려면 로그 아웃 / 로그인해야합니다!


6
@Tom find이 명령을 사용하는 것이 좋습니다 . 파일 / 디렉토리가 많고 GNU find를 사용 +하는 경우 제공하는 작은 성능 팁 중 하나는 "가능한 한 많은 파일에서 명령을 실행하는 것이 더 빠르기 때문에 \;명령이 여러 파일에서 작동 하도록하는 것입니다. 이렇게하면 파일 당 한 번이 아니라 한 번에 하나씩 수행됩니다. 이렇게하면 매번 명령을 시작하는 데 걸리는 시간이 절약됩니다. " 또한 백 슬래시가 필요 없으므로 입력하기가 더 쉽습니다.
aculich

2
@가 아닌 +를 사용하도록 @aculich의 제안으로 업데이트되었습니다.
Tom

1
@SunnyJ. "외부 인용 부호없이) 이것을 시도하십시오 :"find / var / www -type f -exec chmod 0664 '{}'\ + "시도하십시오. '{}'과 (과) 사이에는 공백이 있습니다.
Buttle Butkus

1
감사합니다. 참고 사항-대답에 포함 된 "사용자 ID를 복사하는 SETUID (4)"가 잘못되었다고 생각합니다. Linux / Unix의 디렉토리에 적용하면 SETUID가 무시됩니다.- Ref
Yarin

1
좋아, 그럼으로 usera그리고 userb당신은 의미합니까 www-dataftpuser? 나는 www-data원래 질문에있는의 언급과 혼동되는 것을 발견 했다. 또한 소유자를 root? 로 설정하면 어떤 이점이 있습니까? 우리는 그것을 설정해야합니까 ftpuser?
gskema

60

사용 권한을 구성하는 방법을 완전히 확신하지 못하지만 시작점이 될 수 있습니다. 아마도 더 좋은 방법이있을 것입니다. 두 사용자 모두 / var / www / 아래의 내용을 변경할 수 있기를 원한다고 가정합니다.

  • 새 그룹 (www-pub)을 만들고 해당 그룹에 사용자를 추가하십시오.
  • / var / www 아래의 모든 소유권을 root : www-pub로 변경하십시오.
  • 모든 폴더의 권한을 2775로 변경
  • 모든 파일을 0664로 변경하십시오.
  • 사용자의 umask를 0002로 변경하십시오.

즉, 사용자 중 하나가 만든 새 파일은 username : www-pub 0664 여야하고 생성되는 모든 디렉토리는 username : www-pub 2775입니다. Apache는 '다른 사용자'구성 요소를 통해 모든 것에 대한 읽기 액세스 권한을 갖습니다. 디렉토리의 SETGID 비트는 폴더를 소유 한 그룹이 작성중인 모든 파일을 소유하도록합니다. 그룹의 모든 사람이 파일을 편집 할 수 있도록 쓰기 비트가 설정되도록하려면 umask를 조정해야합니다.

하드 코어에 관해서는 권한을 사용합니다. 사이트 / 서버에 따라 다릅니다. 편집자가 1-2 명 밖에없고 일이 너무 심하게 부러지지 않도록해야한다면 쉬워 질 것입니다. 비즈니스에 더 복잡한 것이 필요하면 더 복잡한 것을 설정합니다.


1
가능한 추가-웹 서버가 작성해야하는 캐시 / 업로드 디렉토리를 www-data : www-data 및 775로 설정하십시오.
gacrux

'기타'권한에 의존하는 대신 아파치 그룹에 사용자를 추가하는 것이 효과적입니까? 당신이하고있는 모든 파일을 업로드하고 아파치에 의해 그 파일을 읽을 수 있어야하는 경우 세 번째 그룹은 그 파일을 편집 해야하는 경우에만 유용한 것 같습니다.
Simurr

1
이 @Zoredache를 조금 확장 할 수 있습니까? 나는 rwx 비트, chmod, chown, adduser, usermod의 기본 사용법을 찾았지만 8 진수 권한, umask 및 그 밖의 모든 첫 번째 숫자로 나를 잃어 버렸습니다. 개요 접근 방식을 보여주는 일부 샘플 명령은 크게 감사하겠습니다.
Tom

1
이렇게하면 모든 사용자가 다른 모든 사용자 파일에 액세스 할 수 있습니다! 이것은 예를 들어, 사용자 A가 사용자 B의 config.php 파일을 읽을 수 있습니다 ... 그 MySQL의 자격 증명을 stoling 의미
drAlberT

1
acl을 사용하면 보안과 협업 성을 모두 다룰 수 있습니다 :)
drAlberT

39

POSIX ACL (액세스 제어 목록)이 도움이 될 것 같습니다. user : group : other 모델에 비해 세분화 된 권한 모델을 허용합니다. 더 명확하고 파일 시스템의 브랜치에 대한 "기본"동작을 설정할 수 있기 때문에 머릿속에서 쉽게 유지할 수있는 것으로 나타났습니다.

예를 들어, 각 사용자의 권한을 명시 적으로 지정할 수 있습니다.

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

또는 일부 공유 그룹을 기반으로 할 수 있습니다.

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

그리고 아마도 당신은 아파치 사용자를 읽기 전용으로 유지하고 싶을 것입니다

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

매뉴얼 페이지 :

지도 시간


2
방법입니다 ! +1
drAlberT

승리 +1에 대한 ACL ... 자세한 내용은 serverfault.com/a/360120/41823
Yarin

1
ACL과 기본 권한에 대한 성능 저하가 있는지 궁금합니다.
Buttle Butkus

2
불행히도 표준 설치 / 배포에서 ACL이 너무 자주 누락됩니다. 내가 관리하는 모든 서버에서 커널을 컴파일하거나 때로는 파일 시스템을 변경하는 것은 고통입니다. 또한 파일을 백업 할 때 특히 서버를 전환하는 경우 매우주의해야합니다. ACL은 훌륭하지만 현재 지원이 너무 낮아 서버 및 주변 환경에 대한 모든 것을 완전히 제어하지 못하는 사람에게는 권장하지 않습니다. 그러나 ACL이 실제로 의미가있는 부분을 지적하면 +1입니다!
Ninj

좋은 답변 +1; www-data전체 사이트 에 대해 아파치 프로세스 읽기 / 쓰기 권한 ( 예 : setfacl 또는 chmod-또는 둘 다를 통해)을 읽기 전용으로 변경하는 것에 대한 참고 사항 -> 모든 쓰기 (브라우저 측에서 플러그인 / 모듈 업로드 / 업데이트)를 분명히 차단합니다. 예를 들어 대부분의 CMS). 많은 인기있는 사람들은 그룹 수준이 아닌 사용자 권한 수준에 대한 쓰기 액세스 만 테스트한다고 생각합니다. 여전히 업데이트 할 수 있지만 업데이트는 수동으로 작성해야하며 쓰기 폴더 (logs / temp / uploads / etc)에 대한 모든 사용자 지정 권한이 있어야합니다. 귀하의 사이트에서 작동한다면 읽기 전용은 훌륭한 보안입니다.
bshea

10

이 질문했다 다시 물었다 등과 같은 논의 메타에이 질문을 받았다 때, 현재의 모범 사례는, 2009 년에 사용할 수 있습니다보다 나은 방법을 제공합니다. 이 답변은 협업 웹 개발 환경을 안전하게 처리 하기위한 최신 솔루션을 제공하려고합니다 .


안전한 웹 서버 및 공동 개발을 위해서는 파일 권한 이상의 것이 있습니다.

  • 모든 사이트에 대해 별도의 사용자가 있어야합니다 ( 예 :을 사용하여 모든 사이트를 제공하지는 않음) www-data. 오늘날 아파치는 정적 콘텐츠 파일 만을 제공하지 않고 동적 웹 사이트를 실행 하는 경우가 거의 없으므로 중요 합니다. 이 답변은 가장 일반적인 서버 사이트 언어 인 PHP에 중점을두고 있지만 다른 원칙에도 동일한 원칙이 적용됩니다.

    단일 사이트에 보안 문제가있는 경우 동일한 사용자로 실행중인 모든 사이트로 확산 될 수 있습니다. 공격자는 데이터베이스 로그인 정보를 포함하여 사용자가 보는 모든 내용을보고 사용자에게 쓰기 권한이있는 모든 사이트를 수정할 수 있습니다.

  • SFTP ( SSH 파일 전송 프로토콜)를 사용하십시오 . 보안을 위해 FTP를 사용하지 않아야하지만 (암호와 내용을 일반 텍스트로 전송하기 때문에) 안전한 대체 SFTP에는 협업 웹 개발을위한 완벽한 솔루션 인 기능도 있습니다.

    사이트와 사이트 당 한 명의 사용자를 격리 한 후에는 웹 개발자에게 액세스 권한을 부여해야합니다. 이러한 사이트 사용자의 비밀번호를 제공하거나 원래 사용자 계정을 사용하여 사이트 파일에 액세스하는 대신 SSH 키 를 사용 하여 로그인 할 수 있습니다 .

    모든 개발자는 키 쌍을 생성하고 개인 키를 비밀로 유지할 수 있습니다. 그런 다음 ~/.ssh/authorized_keys개발자가 작업중인 모든 웹 사이트 사용자 계정 의 공개 키가 파일에 추가됩니다 . 이는 비밀번호 및 로그인 관리에 많은 이점이 있습니다.

    • 모든 개발자는 사이트 별 사용자 배열과 관련된 모든 암호를 기억하거나 저장해야하는 부담없이 여러 웹 사이트에 액세스 할 수 있습니다.

    • 누군가 회사를 떠날 때마다 비밀번호를 변경하고 공유 할 필요가 없습니다.

    • 매우 강력한 암호를 사용하거나 암호 기반 로그인을 모두 비활성화 할 수 있습니다.

  • PHP-FPM을 사용하십시오 . 사용자로서 PHP를 실행하는 현재 접근 방식입니다. 모든 사용자, 즉 사이트 당 하나의 풀에 대해 새 을 만듭니다 . 단일 사이트가 소비 할 수있는 리소스 양을 지정할 수 있으므로 보안과 성능 모두에 가장 좋습니다.

    예를 들어 NeverEndingSecurity의 linux에서 별도의 user / uid 및 그룹으로 php-fpm 실행을 참조하십시오 . HowtoForge의 Ubuntu 16.04에서 Apache와 함께 PHP-FPM 사용 과 같은 자습서가 있으며 사용자 분리를 통해 보안을 강화하기 위해 PHP-FPM을 사용하지 않고 서버에서 단일 FPM 소켓을 사용하도록 안내합니다.

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