권장되는 디렉토리 권한은 무엇입니까?


145

Drupal 7 사이트를 배포하려고하는데 권장되는 보안 관련 파일 및 디렉토리 권한에 대한 문서를 찾을 수 없습니다.

특히 default/files/(또한 디렉토리 하위?) settings.php, .htaccess그리고 다른 것을 나는 알고 있어야합니다.


1
여기에 답변이 있습니다 : drupal.stackexchange.com/questions/52695/…
무료 급진파

이것을 아름답게 설명하고 블로그의 모든 측면을 추상적으로 다루는 블로그가 있습니다. technologymythbuster.blogspot.com/2018/06/…
Kalpesh Popat

답변:


69

웹 서버는 모든 파일을 읽을 수는 있지만 쓸 수는 없습니다 . 사이트에 파일 업로드가 포함 된 경우 서버에 해당 폴더 하나만 쓸 수있는 권한을 부여하십시오.

이를 설정하는 방법과 그렇지 않은 경우 발생할 수있는 몇 가지 사항에 대한 자세한 내용은 Drupal docs 에서 확인할 수 있습니다 .


13
이것은 웹 서버가 쓰기 가능해야하는 sites / default / files 디렉토리에는 해당되지 않습니다. 그렇지 않으면 많은 문제가 발생합니다.
rooby

3
@rooby 두 번째 문장은 그것을 명확하게합니다.
kenorb

14
"사이트에 파일 업로드가 포함 된 경우"라고 표시되어 있지만 이것이 파일 디렉토리에 대한 쓰기 액세스 권한이 필요한 유일한 이유는 아닙니다. 가장 일반적인 예는 js / css 집계로, 관련없는 사용자가 파일을 업로드합니다. 다른 모듈들도 해당 디렉토리가 쓰기 가능할 것으로 예상 할 수 있습니다.
rooby 2019

91

드루팔 많은 같은 페이지가 매우 길고 복잡하다. 그러나 Jason의 글이 머리에 맞았습니다.

Jason Sale 님이 2010 년 11 월 1 일 오후 12시 40 분에 게시

이 글과 모든 것을 작성해 주셔서 감사하지만이 페이지를 읽는 사람들의 99 %가 폴더 목록 옆에있는 숫자 목록 만 있으면됩니다.

  • /default 755에
  • /default/files 744 (또는 755)의 모든 하위 폴더 및 파일 포함
  • /default/themes 755의 모든 하위 폴더 및 파일 포함
  • /default/modules 755의 모든 하위 폴더 및 파일 포함
  • /default/settings.php그리고 /default/default.settings.php444에

7
주제가 길고 혼란 스럽다. 페이지는 상황의 현실에 적합합니다.
greggles

17
... 드루팔 문서의! 이것이 바로 간단하고 이해하기 쉬운 것으로 변경해야하는 이유입니다! 특히 보안에 관한 한. 보안에 관한 것이기 때문입니다! 그것이 우리 모두의 것이기 때문입니다. 감염된 서버는 경험이없는 Drupal 사용자의 문제 일뿐입니다. 그것은 우리 모두의 문제입니다. 따라서 개발자 나르시즘에서 영감을 얻은 복잡하고 잘못 작성된 문서를 유지하여 복잡성과 복잡성을 보여주고 자신이 처리 할 수있는 방법을 보여주는 것은 그리 도움이되지 않습니다. 간단한 파일 권한 트리 그래픽을 남길 요점이 없습니다. webchick는 그것에 동의합니다.
nilsun

3
/ default / files에 755가있는 이유는 무엇입니까? 누군가가 프론트 엔드를 해킹하거나 구성이 잘못되어 악의적 인 것을 업로드하는 경우를 대비하여 항상 744가 아니어야합니까? 755를 가질 이유가 있습니까? / tmp는 어떻습니까?
Webdrips

1
settings.php 파일은 440이어야합니다. "기타"는 settings.php를 볼 수 없습니다. sudo 명령없이 쓸 수있게하려면 740입니다.
Bryden

왜 파일과 tmp 폴더의 .htaccess 파일을 웹 서버가 작성해야하는지 궁금하십니까? settings.php로 444를 표시하는 것이 안전하지 않습니다. 내가 묻는 이유는 웹 서버를 통해 junkfile.php 파일을 해커가 파일 폴더에 업로드 한 다음 .htaccess 파일을 교체 할 수 있기 때문입니다. 내가 맞아?
kiranking

82

서버에서 새 Drupal 사이트를 만드는 방법은 웹 서버 (일반적으로 Apache) 그룹의 일부인 사용자를 보유하고 해당 사용자에게 모든 Drupal 파일을 소유하게하는 것입니다. 우분투에서는 다음과 같은 명령을 설정합니다.

# Create a new example user, setting up /var/www/example as their home dir.
useradd -s /bin/bash -d /var/www/example -m example

# Now add that user to the Apache group. On Ubuntu/Debian this group is usually
# called www-data, on CentOS it's usually apache.
usermod -a -G www-data example

# Set up a password for this user.
passwd example

일단 설정 한 후에는 해당 사용자로 로그인하여 Drupal을 / var / www / example / docroot 또는 유사한 곳에 설치 한 다음 파일 디렉토리를 직접 작성하고 settings.php 파일을 복사하십시오. Drupal에서 복사하기 전에 예제 사용자로 로그인하기 때문에 모든 핵심 Drupal 파일 및 스크립트 (.htaccess 파일 포함)에서 파일 소유권 및 권한이 자동으로 올바르게 구성되어야합니다.

su - example
cd docroot
cp sites/default/default.settings.php sites/default/settings.php

# Temporarily give the web server write permissions to settings.php
chgrp www-data sites/default/settings.php
chmod g+w sites/default/settings.php

이제 files 디렉토리를 설정하자.

# Create the directory.
mkdir sites/default/files

# Now set the group to the Apache group. -R means recursive, and -v means 
# verbose mode.
chgrp -Rv www-data sites/default/files

다음으로 웹 서버가이 디렉토리에있는 모든 파일에 항상 쓸 수 있도록 권한을 설정합니다. chmod 명령에서 2775를 사용하여이 작업을 수행합니다. 2는이 디렉토리에서 작성된 새 파일에 대해 그룹 ID가 보존됨을 의미합니다. 즉, www--data는 항상 파일의 그룹이되므로 웹 서버와 사용자는 항상이 디렉토리에있는 새 파일에 대한 쓰기 권한을 갖게됩니다. 처음 7은 소유자 (예)가 여기에있는 모든 파일을 R (읽기) W (쓰기) 및 X (실행) 할 수 있음을 의미합니다. 두 번째 7은 그룹 (www-data)이이 디렉토리의 모든 파일을 RW 및 X 할 수 있음을 의미합니다. 마지막으로 5는 다른 사용자가 R 및 X 파일을 쓸 수는 있지만 쓸 수는 없음을 의미합니다.

 chmod 2775 sites/default/files

이 디렉토리에 기존 파일이 있으면 웹 서버에 쓰기 권한이 있는지 확인하십시오.

 chmod g+w -R sites/default/files

이제 Drupal을 설치할 준비가되었습니다. 완료되면 settings.php로 돌아와서 모든 사용자에게 읽기 권한 만 부여 하는 것이 매우 중요합니다.

 chmod 444 sites/default/settings.php

그게 다야! 이 설정은 디렉토리를 소유 한 사용자 또는 웹 서버가 파일 디렉토리에서 파일을 쓰거나 변경 / 제거 할 수없는 상황을 방지합니다.


.htacess를 settings.php로 444 jsut로 설정하는 것이 안전하지 않습니까? 어쨌든 그 파일은 드루팔 코어에서 거의 업데이트되지 않습니다.
kiranking

.htaccess를 444로 설정할 수 있지만 Drupal 코어를 업그레이드 할 때 두통이 심해져 사이트를 더 안전하게 만들지 않습니다.
q0rban

30

Drupal 파일 폴더는 웹 서버에서 쓸 수 있어야합니다. 가장 안전한 방법은 다음과 같이 그룹을 변경하고 그룹에 쓰기 가능하게 만드는 것입니다.

chgrp www-data sites/default/files
chmod g+w sites/default/files

파일 업로드 폴더는 제쳐두고 가장 안전합니다. 모든 파일의 경우 chmod 644, 디렉토리의 경우 755입니다.

이것은 Drupal-site 폴더에서 실행될 때 .현재 경로에 대한 것입니다 :

find . -type f | xargs chmod 644
find . -type d | xargs chmod 755

chmod g+w모든 파일과 폴더에서 chmod를 재설정하므로 위 명령을 실행 한 후에 다시 설정해야합니다 .


2
이 답변은 당신이 우분투에 있다고 가정합니다. 귀하의 사이트는 해당 서버에서 실행되는 유일한 사이트입니다. 또한 자동으로 발생하는 대신 (예 : umask 변경) 한 번만 문제를 해결합니다.
greggles

반드시 우분투 일 필요는 없으며 동일한 서버에서 여러 사이트가 실행되고 있어도 여전히 유용한 조치입니다. umask를 변경하는 것은 (이미 설정이 있어야 함) Linux에 익숙하지 않은 사람들에게 권장하지 않습니다. 나는 이것이 완벽한 안보는 아니라는 것을 알고 있지만, 여기서 선의 적이되도록합시다.
mikl

다중 사이트 에서 상태 페이지 오류를 실행 chgrp -R www-data sites/*/files하고 chmod -R g+w sites/*/files제거합니다.
leymannx

20

"chmod blah"또는 "chown X"에 대한 조언은 기본 user : group이 파일에 무엇인지, 웹 서버가 어떤 사용자 및 그룹을 실행하는지 모르면 의미가 없습니다.

Drupal Docs가 링크 한 Drupal Docs는이 주제에 대해 잘 알고 있지만 다른 하나의 리소스는 모든 것이 올바르게 설정되도록 하는 Security Review Module 입니다.


9

웹 서버가 실행되는 것과 다른 자격 증명을 사용하여 FTP를 사용하여 서버에서 파일이 생성되는 경우를 고려하여 답장합니다 (일반적으로 Apache는 nobody / nobody로 실행됩니다). 이는 Drupal 설치 프로그램을 실행하기 전에 수동으로 생성 한 파일을 소유 한 사용자 (Drupal 아카이브에서 서버에 업로드 된 파일 포함)가 웹 서버를 실행하는 데 사용 된 사용자가 아닙니다 (사용자 이름 또는 그룹이 일치하지 않음) . 이 시나리오는 SSH를 사용하여 해당 파일을 작성하는 경우에도 적용됩니다.

  • settings.php 파일은 Drupal 설치 프로그램에서 쓰기 가능해야하지만 설치가 완료되면 읽기 전용으로 설정하는 것이 좋습니다 (설치 프로그램에서 제안하고 Drupal은 파일이 실제로 읽기 전용인지 주기적으로 확인합니다). 설명하는 시나리오에서이 파일의 권한은 644 이상이어야합니다.
  • .htaccess 파일 (적어도 두 곳에 있음)에는 644 권한이 있어야합니다. 파일을 만든 사용자는 다음 버전의 Drupal에 .htaccess 파일이있는 경우 파일을 덮어 쓸 수 있습니다. 보안 문제를 피하기 위해 해당 파일에 줄을 추가했을 때 이미 한 번 발생했습니다. 사용 권한을 444로 설정할 수도 있지만이 경우 파일을 업데이트해야 할 때 사용 권한을 다시 644로 변경해야합니다.
  • 모듈에 의해 생성 된 파일 ( default/files디렉토리)을 포함 하는 디렉토리는 (웹 서버 프로세스에 지정된 사용자, 해당 웹 서버에서 실행되는 PHP 스크립트에 지정된 사용자)이어야합니다.
    • 읽을 수있는
    • 쓰기 가능
    • 통과 가능 (모듈에 도달 할 수 있어야 함 default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

drupal.org/node/244924 에서 스레드를 읽은 후 특히 drupal.org/node/244924#comment-8186447 을 읽은 후 660 RW-RW 만 가져 오기 위해 파일을 업로드하는 방법을 제공하는 방법은 없습니다. 실행 비트가 없습니다. 주요 보안 문제가 아닙니까?
kiranking

8

권장 파일 / 디렉토리 권한 :

  • Drupal 웹 루트는 세계에서 읽을 수 있어야합니다 ( updater.inc 참조 ) : 0755
  • 공개 업로드 디렉토리 : 0755 또는 0775
  • 개인 업로드 디렉토리의 경우 : 0750 또는 0770
  • 공개 업로드 파일 : 0644 또는 0664
  • 개인 업로드 파일의 경우 : 0640 또는 0660
  • 업로드 디렉토리 내 .htaccess의 경우 ( file_create_htaccess () 참조 ) : 0444 (기본값) 또는 0644
  • 모든 (및 기타 기밀 파일)에 대한 settings.php 읽기 전용 : 0440
  • 다른 모든 웹 디렉토리의 경우 : 0755
  • 다른 모든 웹 파일의 경우 : 0644

권장 파일 / 디렉토리 소유권 :

  • 모든 업로드 디렉토리 / 파일의 소유자는 Apache 사용자로 설정되어야합니다.
  • 모든 웹 / 소스 디렉토리 / 파일의 소유자는 Apache 이외의 사용자로 설정되어야합니다.
  • (선택 사항) 모든 소스 그룹을 Apache 그룹으로 설정해야합니다.

새 항목에 대한 기본 dir / file 권한을 제어하는 ​​변수는 다음과 같습니다.

file_chmod_directory: 0775
file_chmod_file: 0664

다음은 권한 수정을위한 스크립트입니다. fix-permissions.sh


더 읽어보기 :


다음은 공개 / 개인 디렉토리의 원격 호스트에 대한 권한을 수정하는 데 사용하는 스크립트입니다.

#!/bin/sh -e
# Script to correct public/private directory and files permissions.
[ -z "$1" ] && { echo Usage: $0 @remote.dst; exit 1; }

DST="$1" && shift
GET_HTTP_GROUP='ps axo user,group,comm | egrep "(apache|httpd)" | grep -v ^root | uniq | cut -d\  -f 1'

drush $* $DST ssh 'PUB=$(drush dd %files) && PRIV=$(drush dd %private) && AGROUP=$('"$GET_HTTP_GROUP"') && chgrp -vR $AGROUP $PUB $PRIV && chmod -vR u+rwX,g+rwX,o+rX $PUB $PRIV'

참고 : 위의 코드는 Apache 그룹검색 하여 GET_HTTP_GROUP변수로 설정 하려고 시도 합니다.


아주 좋은 치트 시트, 북마크. 잘 했어 ..
kiranking

4

이 쉘 스크립트는이 페이지 하단에 있습니다 : https://www.drupal.org/node/244924

권한을 올바르게 설정하기 위해 가끔씩 실행합니다.

#!/bin/bash
# Help menu
print_help() {
cat <<-HELP
This script is used to fix permissions of a Drupal installation
you need to provide the following arguments:
1) Path to your Drupal installation.
2) Username of the user that you want to give files/directories ownership.
3) HTTPD group name (defaults to www-data for Apache).
Usage: (sudo) bash ${0##*/} --drupal_path=PATH --drupal_user=USER --httpd_group=GROUP
Example: (sudo) bash ${0##*/} --drupal_path=/usr/local/apache2/htdocs --drupal_user=john --httpd_group=www-data
HELP
exit 0
}
if [ $(id -u) != 0 ]; then
  printf "**************************************\n"
  printf "* Error: You must run this with sudo. *\n"
  printf "**************************************\n"
  print_help
  exit 1
fi
drupal_path=${1%/}
drupal_user=${2}
httpd_group="${3:-www-data}"
# Parse Command Line Arguments
while [ $# -gt 0 ]; do
  case "$1" in
    --drupal_path=*)
      drupal_path="${1#*=}"
      ;;
    --drupal_user=*)
      drupal_user="${1#*=}"
      ;;
    --httpd_group=*)
      httpd_group="${1#*=}"
      ;;
    --help) print_help;;
    *)
      printf "***********************************************************\n"
      printf "* Error: Invalid argument, run --help for valid arguments. *\n"
      printf "***********************************************************\n"
      exit 1
  esac
  shift
done
if [ -z "${drupal_path}" ] || [ ! -d "${drupal_path}/sites" ] || [ ! -f "${drupal_path}/core/modules/system/system.module" ] && [ ! -f "${drupal_path}/modules/system/system.module" ]; then
  printf "*********************************************\n"
  printf "* Error: Please provide a valid Drupal path. *\n"
  printf "*********************************************\n"
  print_help
  exit 1
fi
if [ -z "${drupal_user}" ] || [[ $(id -un "${drupal_user}" 2> /dev/null) != "${drupal_user}" ]]; then
  printf "*************************************\n"
  printf "* Error: Please provide a valid user. *\n"
  printf "*************************************\n"
  print_help
  exit 1
fi
cd $drupal_path
printf "Changing ownership of all contents of "${drupal_path}":\n user => "${drupal_user}" \t group => "${httpd_group}"\n"
chown -R ${drupal_user}:${httpd_group} .
printf "Changing permissions of all directories inside "${drupal_path}" to "rwxr-x---"...\n"
find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
printf "Changing permissions of all files inside "${drupal_path}" to "rw-r-----"...\n"
find . -type f -exec chmod u=rw,g=r,o= '{}' \;
printf "Changing permissions of "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
cd sites
find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
printf "Changing permissions of all files inside all "files" directories in "${drupal_path}/sites" to "rw-rw----"...\n"
printf "Changing permissions of all directories inside all "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
for x in ./*/files; do
    find ${x} -type d -exec chmod ug=rwx,o= '{}' \;
    find ${x} -type f -exec chmod ug=rw,o= '{}' \;
done
echo "Done setting proper permissions on files and directories"
Copy the code above to a file, name it "fix-permissions.sh" and run it as follows:
sudo bash fix-permissions.sh --drupal_path=your/drupal/path --drupal_user=your_user_name

Note: The server group name is assumed "www-data", if it differs use the --httpd_group=GROUP argument.

2

또한 fastcgi를 실행하는 경우 PHP는 사용자로 실행되며, 의도적으로 피하려고하지 않는 한 사용자가 액세스 할 수있는 모든 파일에 액세스 할 수 있습니다.


1

이것은 OSX Permission 문제에 도움이되었습니다. 나는 원형질 사용자에 의해 https://www.drupal.org/node/244924#comment-3741738 에서 찾았습니다 . 마이그레이션 후 문제가있는 것 같습니다.

[root@localhost]cd /path_to_drupal_installation/sites
[root@localhost]find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
[root@localhost]find . -name files -type d -exec find '{}' -type f \; | while read FILE; do chmod ug=rw,o= "$FILE"; done
[root@localhost]find . -name files -type d -exec find '{}' -type d \; | while read DIR; do chmod ug=rwx,o= "$DIR"; done

-3

사이트가 안전한지 여부를 확인하는 보안 검토 라는 모듈이 있습니다 . 또한 사이트 권한을 설정 하는 매우 좋은 링크 를 찾았습니다 .

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