阅读:3369回复:0
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= {} ; [*]第一行命令,将当前路径切换到Drupal站点安装目录; [*]第二行命令,递归地查看Drupal站点下的目录和文件,并将用户webmaster和组apache设为目录和文件的所有者。不要在托管环境下执行这个命令; [*]第三行命令,从Drupal站点根目录开始寻找目录和子目录,并执行chmod命令将所有目录的权限更改为所有者(此例为webmaster)“可读”“可写”“可执行”,所有者组(此例为apache组)用户“可读”“可执行”,其它用户无权限; [*]第四行命令,从Drupal站点根目录开始寻找所有文件,并执行chmod命令将所有文件的权限更改为所有者“可读”“可写”,所有者组“可读”,其它用户无权限 第二部分 [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 installationnyou need to provide the following arguments:nt 1) Path to your drupal installationnt 2) Username of the user that you want to give files/directories ownershipnNote: "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 scriptnnUsage: (sudo) bash ${0##*/} drupal_path user_namen" 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 |
|