使用 setfacl 通过 rsync 为 Apache 创建递归权限

使用 setfacl 通过 rsync 为 Apache 创建递归权限

我在本地安装了 Dokuwiki,我定期使用 rsync 将其同步到我的服务器。我还将给我的一个朋友一个 ssh 帐户,并托管他的公共 Dokuwiki 安装。但是,我遇到了访问权限问题 - 即使镜像是只读的,Dokuwiki 仍然需要对数据目录的写入权限以进行缓存等。Apache 服务器以用户 www-data 的身份运行,每次我这样做时rsync,它重置权限。

根据本网站上的一些其他答案,我尝试使用 setfacl 设置默认权限,但它似乎不起作用 - getfacl 指示权限存在,但 Dokuwiki 不会运行,当我尝试将文件写入为用户www-data,它也不起作用。我缺少什么?

wiki/data$ sudo su www-data
$ pwd
/var/www/wiki/data
$ whoami
www-data
$ touch hi
touch: cannot touch `hi': Permission denied
$ getfacl /var/www/wiki/data
getfacl: Removing leading '/' from absolute path names
# file: var/www/wiki/data
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

这是我用来设置权限的命令:

setfacl -R -d -m u:www-data:7 /var/www/*

答案1

问题#1:Rsync 正在删除 ACL

应用 ACL 权限后,您需要注意,当您执行该操作时,rsync您将使用-A--acls开关。这指示rsync确保在进行同步时保留这些。

摘自 rsync 手册页

    -A, --acls                  preserve ACLs (implies -p)

问题#2:没有 ACL 权限

在查看您的示例时,它确实包含如下权限。

传统烫发

# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x

ACL

default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

但这些 ACL 是用于创建新对象的,并且并不完全按照您的想法工作。www-data除了默认的 ACL 权限之外,您还需要为用户创建一个条目。

例子

$ pwd
/tmp/somedir

$ mkdir data
$ setfacl -R -d -m u:gopher:7 data

$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

一个实验

现在让我们尝试data以 user 身份将文件写入目录gopher

$ sudo -u gopher touch /tmp/somedir/data/afile
touch: cannot touch `/tmp/somedir/data/afile': Permission denied

看起来熟悉?

添加额外的 ACL 权限

这是因为您需要为用户添加 ACL www-data,默认规则不是用于访问,而是用于创建新文件/目录。

$ setfacl -R -m u:gopher:7 data

现在再次检查data目录:

$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
user:gopher:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

唯一的区别是我们现在有一个 ACL 表示用户gopher有权rwx访问:

user:gopher:rwx

重复实验

尝试再次向目录写入数据:

$ sudo -u gopher touch /tmp/somedir/data/afile
$

有效!!!仔细检查生成的文件:

$ ls -l /tmp/somedir/data/afile
-rw-rw-r--+ 1 gopher gopher 0 Oct  7 21:36 /tmp/somedir/data/afile

相关内容