我正准备部署Drupal 7网站,但找不到任何有关建议将安全意识强的文件和目录权限设置为什么的文档。
具体来说default/files/
(也子目录?) settings.php
,.htaccess
以及其他任何我应该知道的。
我正准备部署Drupal 7网站,但找不到任何有关建议将安全意识强的文件和目录权限设置为什么的文档。
具体来说default/files/
(也子目录?) settings.php
,.htaccess
以及其他任何我应该知道的。
Answers:
您的Web服务器应该能够读取所有文件,但不能写入文件。如果您的站点涉及上载文件,则授予服务器权限仅写该文件夹的权限。
Drupal文档中提供了有关如何进行设置的更多信息,以及如果不进行设置可能会发生的某些事情。
这Drupal的像这么多的页面很长,而且容易混淆。但其中包含杰森(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站点的做法是让用户属于Web服务器(通常为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
设置完成后,我将以该用户身份登录并在/ var / www / example / docroot或类似位置安装Drupal,然后手动创建文件目录并复制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
接下来,我们将设置权限,以便Web服务器始终可以写入此目录中的任何文件。我们通过在chmod命令中使用2775来执行此操作。2表示将为在此目录中创建的任何新文件保留组ID。这意味着www.data始终是任何文件上的组,从而确保Web服务器和用户始终对放置在此目录中的任何新文件都具有写权限。前7个表示所有者(示例)可以R(读)W(写)和X(执行)此处的任何文件。第二个7表示组(www-data)也可以读写该目录中的任何文件。最后,5表示其他用户可以R和X文件,但不能写入。
chmod 2775 sites/default/files
如果此目录中有任何现有文件,请确保Web服务器在其上具有写权限。
chmod g+w -R sites/default/files
现在,Drupal已准备好安装。完成后,非常重要的是返回settings.php并确保所有用户仅具有读取权限。
chmod 444 sites/default/settings.php
而已!此设置可确保您避免拥有目录的用户或Web服务器无法在files目录中写入/更改/删除文件的任何情况。
Drupal文件文件夹应可由Web服务器写入。最安全的方法是更改组并使其可写,如下所示:
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是什么以及您的Web服务器以什么用户和组运行。
其他人链接到的Drupal Docs在该主题上非常出色,但另一个资源是Security Review Module,它有助于确保正确设置所有内容。
考虑到使用FTP在服务器上创建文件的情况,我会回信,使用的凭据与运行Web服务器所使用的凭据不同(通常,Apache以没人/没人的身份运行)。这意味着拥有在运行Drupal安装程序之前手动创建的文件(还包括从Drupal存档上传到服务器上的文件)的用户不是用于运行Web服务器的用户(用户名或组均不匹配) 。这种情况也适用于使用SSH创建这些文件的情况。
default/files
目录(该目录)必须是(对于分配给Web服务器进程的用户,然后是分配给该Web服务器上运行的PHP脚本的用户):
default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>
)建议的文件/目录权限:
建议的文件/目录所有权:
以下是控制新项目的默认目录/文件权限的变量:
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
变量。
该Shell脚本位于此页面的底部: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许可问题。我是由原生用户在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