使用 ACL 控制网页服务器文件访问权限

ACL(Access Control Lists)可以用于方便的控制 Linux 系统中的文件访问权限。一个常见的应用情景是,对某个目录中的文件以及后来新建的文件,我们希望这些文件对某个用户组默认为可写入,用 ACL 控制就相对安全,且非常方便。

以 CentOS 7 为例。为了在自己管理的 VPS 上的 LAMP 服务器里实现类似功能,比如让 Apache 创建的文件可以被一个常用的非管理员用户修改,可以将其文件夹属性设置为被 apache 用户拥有,而属于组 lusergrp。同时使用 ACL 控制在该文件夹中新建的文件和文件夹都自动继承此设置。然后让 apache 和 luser 都成为组 lusergrp 的成员。这样就可以在不改变 Apache 运行用户(默认 apache)的情况下让新增的文件(不管是 apache 还是 luser 新建的文件)都能被对方改写。

基于以上目的,查了一些文档,决定采用 ACL 控制的方式来实现。下面的是记录。

安装和配置 ACL

一般情况下,ACL 在最小化安装的 (minimal) CentOS 中是默认安装并启用的,到底有没有安装,安装一下试试看就知道了,

# yum install acl
... ... ...
Package acl-2.2.49-6.el6.x86_64 already installed and latest version
Nothing to do

对于 CentOS 7 来说,其默认的文件系统是 xfs,不需要预先设置就可以直接使用 ACL 的功能。

不过如果是 ext4 的文件系统的话,可能需要对文件系统稍作设定了。当然,ext2/ext3/ext4/xfs 都支持 ACL。有没有默认启用 ACL 支持呢?查查就知道了。下面的组合指令可以显示默认的分区/磁盘挂载选项是否开启了 ACL 支持,

# tune2fs -l /dev/mapper/vg_0-lv_root | grep "Default mount options"
Default mount options: user_xattr acl

其中 user_xattr acl 就表示在 /dev/mapper/vg_0-lv_root 上已经启用了 ACL 支持。(查看分区可使用 fdisk -l 指令。)

CentOS 上默认使用的是 Logical Volume Management (LVM) 来管理磁盘。上面的 /dev/mapper/vg_0-lv_root 就是 LVM 的一个卷组(vg, Volume Group)。可以通过

$ fdisk -l

来查看卷组的名称。

如果没有启用,就自己配置一下。配置的方式就是开启 ACL 支持。有两个途径,一个是在挂载分区的时候增加 acl 选项,另一个就是将 ACL 选项添加到默认的挂载选项中。两种方式任选其一即可。例如:

A. 挂载时增加选项 acl,

# mount -o acl /dev/sdb1 /mnt

B. 将 ACL 选项添加到默认的挂载选项中,

tune2fs -o acl /dev/sdb1

应用实例

下面假设 Web 服务器的网站目录为 /var/www/html,所有者 apache,所属组为 lusergrp。管理此网站的用户为 luser。目的是要让 apache 和 luser 对网站目录下的所有文件和文件夹以及新建的文件和文件夹都拥有可读/可写权限。(关于用户和组的操作详见这里。)

如果文件所有者不是 apache,可以通过下面的指令修改(替换 /path/to/webroot 为实际的路径),

chown -R apache:lusergrp /path/to/webroot

将 apache 和 luser 增加到附加组 lusergrp,

# usermod -a -G lusergrp apache 
# usermod -a -G lusergrp luser

如果不用管以后新建的文件的读写权限,只要将所有文件和文件夹的权限设置为 775 就可以了,

# chmod -R 775 /var/www/html

设置 ACL 规则到 /var/www/html 下所有目录,并设置为默认的 ACL 规则,就可以使此后新建的文件和文件夹——不管是 apache 还是 luser 创建的——都可以被对方读写。修改针对共同用户组 lusergrp 的 ACL 规则,

# setfacl -R -m g:lusergrp:rwX /var/www/html
# setfacl -R -d -m g:lusergrp:rwX /var/www/html

或者合并起来写,

# setfacl -Rm g:lusergrp:rwX,d:g:lusergrp:rwX /var/www/html

其中,

  • -R 表示递归到所有子目录;
  • -d 表示设置为默认规则,也就是说,以后在此目录下新建的文件和文件夹都继承此规则;
  • -m 表示修改。
  • 更多参数可以参考这里

检查一下结果,

# getfacl /var/www/html
getfacl: Removing leading '/' from absolute path names
# file: var/www/html
# owner: apache
# group: lusergrp
user::rwx
group::r-x
group:lusergrp:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:lusergrp:rwx
default:mask::rwx
default:other::r-x

这样就达到了我的目的:WordPress 运行在 apache 用户上,在其后台可以安装、更新、删除插件、主题等,如果需要修改,则使用 luser 用户登录到服务器就可以了。

更多关于 ACL 的用法可以参考这里©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/acl-vps-centos-wodpress/>。转载请保留此信息及相应链接。

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)