ฉันกำลังเตรียมที่จะปรับใช้ไซต์ Drupal 7 และฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับสิ่งที่ควรคำนึงถึงความปลอดภัยของแฟ้มและการอนุญาตไดเรกทอรีที่แนะนำ
โดยเฉพาะdefault/files/
(ยังไดเรกทอรีย่อย?) settings.php
, .htaccess
และสิ่งอื่นที่ฉันควรจะตระหนักถึง
ฉันกำลังเตรียมที่จะปรับใช้ไซต์ Drupal 7 และฉันไม่สามารถหาเอกสารใด ๆ เกี่ยวกับสิ่งที่ควรคำนึงถึงความปลอดภัยของแฟ้มและการอนุญาตไดเรกทอรีที่แนะนำ
โดยเฉพาะdefault/files/
(ยังไดเรกทอรีย่อย?) settings.php
, .htaccess
และสิ่งอื่นที่ฉันควรจะตระหนักถึง
คำตอบ:
เว็บเซิร์ฟเวอร์ของคุณควรจะสามารถอ่านไฟล์ทั้งหมด แต่ไม่สามารถเขียนลงไปได้ หากไซต์ของคุณเกี่ยวข้องกับการอัปโหลดไฟล์ให้อนุญาตเซิร์ฟเวอร์เพื่อเขียนไปยังโฟลเดอร์เดียวเท่านั้น
ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตั้งค่าที่ขึ้นเช่นเดียวกับบางสิ่งบางอย่างที่สามารถเกิดขึ้นได้หากคุณไม่ได้มีอยู่ในเอกสาร Drupal
นั่นDrupalหน้าเช่นจำนวนมากเป็นเวลานานมากและทำให้เกิดความสับสน แต่มันมีโพสต์นี้โดยเจสันผู้ตีตะปูหัว:
โพสต์โดย Jason Sale เมื่อวันที่ 1 พฤศจิกายน 2010 เวลา 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 ทั้งหมด บน Ubuntu คำสั่งเหล่านี้คือการตั้งค่า:
# 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
ตอนนี้เรามาตั้งค่าไดเรกทอรีไฟล์
# 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
ต่อไปเราจะตั้งค่าการอนุญาตเพื่อให้เว็บเซิร์ฟเวอร์สามารถเขียนไฟล์ใด ๆ ที่อยู่ในไดเรกทอรีนี้ได้เสมอ เราทำสิ่งนี้โดยใช้ 2775 ในคำสั่ง chmod ของเรา 2 หมายถึงรหัสกลุ่มจะถูกสงวนไว้สำหรับไฟล์ใหม่ใด ๆ ที่สร้างขึ้นในไดเรกทอรีนี้ สิ่งที่หมายถึงคือ www - data จะเป็นกลุ่มในไฟล์ใด ๆ ดังนั้นจึงมั่นใจได้ว่าเว็บเซิร์ฟเวอร์และผู้ใช้จะมีสิทธิ์ในการเขียนไปยังไฟล์ใหม่ใด ๆ ที่อยู่ในไดเรกทอรีนี้เสมอ 7 แรกหมายความว่าเจ้าของ (ตัวอย่าง) สามารถ R (อ่าน) W (เขียน) และ X (ดำเนินการ) ไฟล์ใด ๆ ที่นี่ 7 ที่สองหมายความว่ากลุ่ม (www-data) สามารถ RW และ X ไฟล์ใด ๆ ในไดเรกทอรีนี้ ในที่สุด 5 หมายความว่าผู้ใช้รายอื่นสามารถไฟล์ R และ X แต่ไม่ได้เขียน
chmod 2775 sites/default/files
หากมีไฟล์ใด ๆ ที่มีอยู่ในไดเรกทอรีนี้ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์มีการเขียน perms บนพวกเขา
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" นั้นไร้ความหมายโดยไม่ทราบว่าสิ่งที่ผู้ใช้เริ่มต้น: กลุ่มอยู่ในไฟล์และผู้ใช้และกลุ่มที่เว็บเซิร์ฟเวอร์ของคุณทำงาน
เอกสารอื่น ๆ ที่ Drupal เชื่อมโยงนั้นค่อนข้างดีในหัวข้อนี้ แต่อีกแหล่งข้อมูลหนึ่งคือโมดูลตรวจสอบความปลอดภัยซึ่งช่วยให้แน่ใจว่าคุณได้ตั้งค่าทุกอย่างถูกต้อง
ฉันจะตอบกลับให้พิจารณากรณีที่ไฟล์ถูกสร้างขึ้นบนเซิร์ฟเวอร์โดยใช้ FTP โดยใช้ข้อมูลประจำตัวที่แตกต่างจากที่อยู่ภายใต้ซึ่งเป็นเว็บเซิร์ฟเวอร์ทำงาน (ปกติ Apache ทำงานเป็นไม่มีใคร / ไม่มีใคร) ซึ่งหมายความว่าผู้ใช้ที่เป็นเจ้าของไฟล์ที่สร้างขึ้นด้วยตนเองก่อนที่จะรันตัวติดตั้ง 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.
นอกจากนี้หากคุณใช้งาน fastcgi php จะทำงานเป็นผู้ใช้และจะสามารถเข้าถึงไฟล์ทั้งหมดที่ผู้ใช้มีการเข้าถึงเว้นแต่คุณจะพยายามหลีกเลี่ยงปัญหานี้โดยเจตนา
สิ่งนี้ช่วยฉันในการอนุญาตปัญหา OSX ของฉัน ฉันพบมันใน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
มีโมดูลที่เรียกว่าการตรวจสอบความปลอดภัยซึ่งตรวจสอบว่าเว็บไซต์ของคุณปลอดภัยหรือไม่ ฉันพบลิงค์ที่ดีมากในการตั้งค่าการอนุญาตไซต์