Drupal 文件与目录安全性详解(附权限和所有权修正脚本)

  服务器的文件系统应该做好安全性的配置,以确保服务器程序(如 apache)没有对文件的编辑和写权限,即是说,对服务器端口程序而言,文件是“只读”的,而文件所有权则被赋予单独的系统用户。

配置示例

  例如,大多数系统中,apache的进程由用户"apache“执行,因此这个用户应该具备对Drupal站点内的所有文件的“可读”权限,这个权限可以通过组(group)权限或者其它用户(other)权限赋予。服务器进程用户(如 apache)不应当具备对Drupal站点内文件(及目录)的“写”权限,不过对于 files 目录(上传文件的默认目录),则可以设置一个例外。

  以下是一个安全的文件权限配置示例,其中 lugir 为常规用户,apache 为服务器进程用户,files 目录是指 Drupal 的默认上传目录(即 sites/default/files),modules  目录在此作为 Drupal 站点中的目录代表,index.php 则作为 Drupal 站点内的文件代表,分别用来展示 Drupal 站点中目录和文件应有的文件权限。通过在命令行下键入 ls -al,可以得到以下输出,以查看文件权限的配置情况。

drwxrwx--- 7  apache lugir  4096 2008-01-18 11:02 files/
drwxr-x--- 32 lugir  apache 4096 2008-01-18 11:48 modules/
-rw-r----- 1  lugir  apache 873  2007-11-13 15:35 index.php

  在上例中,服务器用户(apache)对 files 目录有写权限,任何属于"lugir"组的用户对此目录也有相同的权限,但其它用户则不被允许对此目录有任何交互行为。index.php 文件(在此代表所有文件)可以被"lugir"组的成员进行编辑,apache组的成员则只能读取该文件,其它用户则不允许读写此文件(通常情况下你不希望其它用户读取你的文件,因此目录和文件的后三个权限位被设置为 ---,而不是 r-x)。

以下是一个不安全的权限配置示例:

NOTE: THIS IS AN INSECURE CONFIGURATION
drwxrwx--- 7  apache apache 4096 2008-01-18 11:02 files/
drwxrwx--- 32 lugir  apache 4096 2008-05-16 11:48 modules/
-rw-rw-rw- 1  apache apache 873  2007-11-13 15:35 index.php

  这个示例允许 apache 用户编辑 index.php 文件(因为示例中,我们以index.php代表所有其它文件,所以可以可能发生的安全问题同等假设到此Drupal站点中的所有其它文件)。将这种配置定为危险配置的原因将在下文中一一说明,如果你正使用这样一个文件权限配置,请立即将其改为第一种版本的形式。

文件权限与数值对应关系

  文件的权限使用 rwx 表示,其分别是 read(读)、write(写)、execute(执行)的缩写。

  除了用 r,w,x 这三个字母缩写外,还可以用数值来进行权限表示,其中 4 表示 read,2 表示 write,1 表示 execute。

  因此文件权限 rwxrwx--- 也可能视作 770

Drupal 站点文件权限修正脚本 - Linux 服务器
(Windows用户请从文末的参考文档中阅读适用于Windows的修正方法)

  为了修正Drupal站点中的文件权限问题,可以从Drupal站点根目录执行以下命令,此命令假设服务器进程用户为apache,假设用户 webmaster 为站点管理员,且用户 webmaster 属于 webmaster 组。请确保你在Drupal站点的权限目录运行以下命令,否则可能搞乱你的文件系统权限。

第一部分

[root@localhost]cd /path_to_drupal_installation
[root@localhost]chown -R webmaster:apache .
[root@localhost]find . -type d -exec chmod u=rwx,g=rx,o= {} \;
[root@localhost]find . -type f -exec chmod u=rw,g=r,o= {} \;

  1. 第一行命令,将当前路径切换到Drupal站点安装目录;
  2. 第二行命令,递归地查看Drupal站点下的目录和文件,并将用户webmaster和组apache设为目录和文件的所有者。不要在托管环境下执行这个命令;
  3. 第三行命令,从Drupal站点根目录开始寻找目录和子目录,并执行chmod命令将所有目录的权限更改为所有者(此例为webmaster)“可读”“可写”“可执行”,所有者组(此例为apache组)用户“可读”“可执行”,其它用户无权限;
  4. 第四行命令,从Drupal站点根目录开始寻找所有文件,并执行chmod命令将所有文件的权限更改为所有者“可读”“可写”,所有者组“可读”,其它用户无权限

  因为 files 目录与其它目录稍有不同,因此还需要执行以下命令为apache组添加“写”权限

第二部分

[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

  这些命令在 sites 目录下执行,将 files 目录及其下的所有子目录赋予以下权限:所有者“可读”“可写“”可执行”,所有者组“可读”“可写”“可执行”,其它无权限;为 files 目录下的所有文件赋予以下权限:所有者“可读“”可写“,所有者组”可读“”可写“,其它无权限。

  请记得,任何后添加的模块/主题的权限都要做相应的修改,因此最好在安装模块/主题之前先配置好其所在目录的权限。

完整的脚本

  以下提供了一个基于以上本文以上准则的权限修复脚本,你可以在每次需要修复Drupal站点的文件权限时使用此脚本。此脚本还添加了目录检测机制,以防止因为路径不正确而造成错误的文件权限修改。

#!/bin/bash

path=${1%/}
user=${2}
group="apache"
help="\nHelp: This script is used to fix permissions of a drupal installation\nyou need to provide the following arguments:\n\t 1) Path to your drupal installation\n\t 2) Username of the user that you want to give files/directories ownership\nNote: \"apache\" (apache default) is assumed as the group the server is belonging to, if this is different you need to modify it manually by editing this script\n\nUsage: (sudo) bash ${0##*/} drupal_path user_name\n"

if [ -z "${path}" ] || [ ! -d "${path}/sites" ] || [ ! -f "${path}/modules/system/system.module" ]; then
echo "Please provide a valid drupal path"
echo -e $help
exit
fi

if [ -z "${user}" ] || [ "`id -un ${user} 2> /dev/null`" != "${user}" ]; then
echo "Please provide a valid user"
echo -e $help
exit
fi

cd $path;

echo -e "Changing ownership of all contents of \"${path}\" :\n user => \"${user}\" \t group => \"${group}\"\n"
chown -R ${user}:${group} .
echo "Changing permissions of all directories inside \"${path}\" to \"750\"..."
find . -type d -exec chmod u=rwx,g=rx,o= {} \;
echo -e "Changing permissions of all files inside \"${path}\" to \"640\"...\n"
find . -type f -exec chmod u=rw,g=r,o= {} \;

cd $path/sites;

echo "Changing permissions of \"files\" directories in \"${path}/sites\" to \"770\"..."
find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
echo "Changing permissions of all files inside all \"files\" directories in \"${path}/sites\" to \"660\"..."
find . -name files -type d -exec find '{}' -type f \; | while read FILE; do chmod ug=rw,o= "$FILE"; done
echo "Changing permissions of all directories inside all \"files\" directories in \"${path}/sites\" to \"770\"..."
find . -name files -type d -exec find '{}' -type d \; | while read DIR; do chmod ug=rwx,o= "$DIR"; done

使用方法:

  请将以上代码复制到一个新建的脚本文件中,将其命令为 fix-permission.sh,并通过以下命令执行此脚本,以实现权限修复。

sudo bash fix-permissions.sh your/drupal/path your_user_name

参考文档:http://drupal.org/node/244924


付费阅读