Drupal 7 사이트를 배포하려고하는데 권장되는 보안 관련 파일 및 디렉토리 권한에 대한 문서를 찾을 수 없습니다.
특히 default/files/
(또한 디렉토리 하위?) settings.php
, .htaccess
그리고 다른 것을 나는 알고 있어야합니다.
Drupal 7 사이트를 배포하려고하는데 권장되는 보안 관련 파일 및 디렉토리 권한에 대한 문서를 찾을 수 없습니다.
특히 default/files/
(또한 디렉토리 하위?) settings.php
, .htaccess
그리고 다른 것을 나는 알고 있어야합니다.
답변:
웹 서버는 모든 파일을 읽을 수는 있지만 쓸 수는 없습니다 . 사이트에 파일 업로드가 포함 된 경우 서버에 해당 폴더 하나만 쓸 수있는 권한을 부여하십시오.
이를 설정하는 방법과 그렇지 않은 경우 발생할 수있는 몇 가지 사항에 대한 자세한 내용은 Drupal docs 에서 확인할 수 있습니다 .
그 드루팔 많은 같은 페이지가 매우 길고 복잡하다. 그러나 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.php
444에
서버에서 새 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
그게 다야! 이 설정은 디렉토리를 소유 한 사용자 또는 웹 서버가 파일 디렉토리에서 파일을 쓰거나 변경 / 제거 할 수없는 상황을 방지합니다.
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를 재설정하므로 위 명령을 실행 한 후에 다시 설정해야합니다 .
chgrp -R www-data sites/*/files
하고 chmod -R g+w sites/*/files
제거합니다.
"chmod blah"또는 "chown X"에 대한 조언은 기본 user : group이 파일에 무엇인지, 웹 서버가 어떤 사용자 및 그룹을 실행하는지 모르면 의미가 없습니다.
Drupal Docs가 링크 한 Drupal Docs는이 주제에 대해 잘 알고 있지만 다른 하나의 리소스는 모든 것이 올바르게 설정되도록 하는 Security Review Module 입니다.
웹 서버가 실행되는 것과 다른 자격 증명을 사용하여 FTP를 사용하여 서버에서 파일이 생성되는 경우를 고려하여 답장합니다 (일반적으로 Apache는 nobody / nobody로 실행됩니다). 이는 Drupal 설치 프로그램을 실행하기 전에 수동으로 생성 한 파일을 소유 한 사용자 (Drupal 아카이브에서 서버에 업로드 된 파일 포함)가 웹 서버를 실행하는 데 사용 된 사용자가 아닙니다 (사용자 이름 또는 그룹이 일치하지 않음) . 이 시나리오는 SSH를 사용하여 해당 파일을 작성하는 경우에도 적용됩니다.
default/files
디렉토리)을 포함 하는 디렉토리는 (웹 서버 프로세스에 지정된 사용자, 해당 웹 서버에서 실행되는 PHP 스크립트에 지정된 사용자)이어야합니다.
default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>
)권장 파일 / 디렉토리 권한 :
권장 파일 / 디렉토리 소유권 :
새 항목에 대한 기본 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
변수로 설정 하려고 시도 합니다.
이 쉘 스크립트는이 페이지 하단에 있습니다 : 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.
이것은 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