Joh*_*unt 1 linux permissions ftp apache-2.2
我们在工作中遇到了一个持续的问题。我们在共享主机上设置了很多网站,我们的 cms 将许多文件写入这些网站,并允许这些网站的用户上传文件等。
问题是当用户在站点上上传文件时,该文件的所有者成为网络服务器,因此阻止我们能够通过 FTP 更改权限等。
有一些变通方法,但我们真正需要的是一种设置粘性所有者的方法(如果可能的话)在服务器上创建的新文件和目录上。例如,不是 php 以用户 apache 的身份写入文件,而是采用父目录的所有者。
我不确定这是否可能(我从未见过它完成。)有任何想法吗?
我们显然不会让 apache 登录到服务器,我怀疑我们也可以进入 apache 组。
也许我们需要一种允许 apache 至少设置文件组的方法,这样我们就可以在 php 中将组设置为我们的 ftp 用户,并为写入的任何文件设置 664 和 775?
干杯,约翰。
POSIX ACL 将允许您设置可继承的 ACL。如果为目录设置默认 acl,则会在创建新文件时沿堆栈向下继承。
$ sudo mkdir /tmp/acltest
$ ls -ld /tmp/acltest
drwxr-xr-x 2 root root 4096 2011-01-13 20:39 /tmp/acltest
$ touch /tmp/acltest
touch: setting times of `/tmp/acltest': Permission denied
Run Code Online (Sandbox Code Playgroud)
此时我的用户 (daniel) 无法在此目录中创建文件。我为目录设置了默认 acl,并在顶层目录上设置了一个用户 acl(默认适用于在此目录中创建的文件/目录,而不是实际目录本身)
$ sudo setfacl -m d:u:daniel:rwx /tmp/acltest/
$ sudo setfacl -m u:daniel:rwx /tmp/acltest/
Run Code Online (Sandbox Code Playgroud)
现在,我可以创建一个文件:
$ touch /tmp/acltest/foo
$ ls -la /tmp/acltest/foo
-rw-r--r-- 1 daniel daniel 0 2011-01-13 20:41 /tmp/acltest/foo
Run Code Online (Sandbox Code Playgroud)
此外,我可以对其他用户在此目录中创建的文件执行任何我喜欢的操作:
$ sudo mkdir /tmp/acltest/foo2
$ ls -ld /tmp/acltest/foo2
drwxrwxr-x+ 2 root root 4096 2011-01-13 20:49 /tmp/acltest/foo2
$ sudo touch /tmp/acltest/foo2/bar
$ ls -la /tmp/acltest/foo2/bar
-rw-rw-r--+ 1 root root 0 2011-01-13 20:43 /tmp/acltest/foo2/bar
Run Code Online (Sandbox Code Playgroud)
普通的 unix 权限不会让我碰这个,但是 ACL 另有说明:
$ getfacl /tmp/acltest/foo2/bar
# file: tmp/acltest/foo2/bar
# owner: root
# group: root
user::rw-
user:daniel:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
Run Code Online (Sandbox Code Playgroud)
请注意,此文件位于 /tmp/acltest 目录的子目录中,因此正常的 unix 权限不会让我对此文件执行任何操作。
事实上,用户 daniel 可以对这个文件做任何他们喜欢的事情:
$ mv /tmp/acltest/foo2/bar /tmp/acltest/foo2/bar2
$ ls -la /tmp/acltest/foo2/
total 8
drwxrwxr-x+ 2 root root 4096 2011-01-13 20:49 .
drwxrwxr-x+ 3 root root 4096 2011-01-13 20:43 ..
-rw-rw-r--+ 1 root root 0 2011-01-13 20:43 bar2
Run Code Online (Sandbox Code Playgroud)
请注意,默认 acl 只会在创建新文件和目录时传播。您需要执行一次递归设置操作以将所有内容设置到位,然后您的默认 acl 将接管。
为了使用 acls,您需要确保您的文件系统是使用 /etc/fstab 中的 acl 选项挂载的。
TL;DR POSIX ACL 将允许您设置沿文件系统树向下传播的粘性用户/组权限。
编辑:格式化和挂载选项