在linux上inheritance文件所有权

我们在这里工作中有一个持续的问题。 我们有很多网站build立在共享主机上,我们的cms写了很多文件到这些网站,并允许网站的用户上传文件等。

问题是,当用户上传文件在网站上的文件的所有者成为networking服务器,因此阻止我们能够通过FTP更改权限等。

有几个解决方法,但真正需要的是设置一个粘性所有者的方法,如果可能在服务器上创build的新文件和目录。 例如,而不是PHP写入文件为用户apache它需要父目录的所有者。

我不确定这是否可能(我从来没有见过。)任何想法?

我们显然不会获得Apache的login到服务器,我怀疑我们也可以进入Apache组。

也许我们需要一种允许apache至less设置一个文件组的方式,这样我们可以在php中将组设置为我们的ftp用户,并为任何写入的文件设置664和775。

干杯,约翰。

POSIX ACL将允许您设置可inheritance的ACL。 如果您为某个目录设置默认的acl,则在创build新文件时,这个目录会沿着堆栈inheritance。

$ 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 

在这一点上我的用户(丹尼尔)不能在这个目录中创build文件。 我设置目录的默认acl,以及在最上面的目录中设置一个用户acl(默认值适用于在这个目录中创build的文件/目录,而不是实际的目录本身)

 $ sudo setfacl -md:u:daniel:rwx /tmp/acltest/ $ sudo setfacl -mu:daniel:rwx /tmp/acltest/ 

而现在,我可以创build一个文件:

 $ touch /tmp/acltest/foo $ ls -la /tmp/acltest/foo -rw-r--r-- 1 daniel daniel 0 2011-01-13 20:41 /tmp/acltest/foo 

此外,我可以做任何我喜欢的文件,其他用户在这个目录中创build:

 $ 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 

普通的unix权限不会让我接触到这个,但ACL会另外说明:

 $ getfacl /tmp/acltest/foo2/bar # file: tmp/acltest/foo2/bar # owner: root # group: root user::rw- user:daniel:rwx #effective:rw- group::rx #effective:r-- mask::rw- other::r-- 

请注意,这个文件位于/ 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 

请注意,默认的acls只会在创build新文件和目录时传播。 你需要做一次recursion设置操作来设置一切,然后你的默认acl将接pipe。

为了使用acls,你需要确保你的文件系统在/ etc / fstab中使用了acl选项。

TL; DR POSIX ACL将允许您设置在文件系统树下传播的粘性用户/组权限。

编辑:格式和安装选项

acls可能是非常危险的 – 支持各不相同。 一个更好的解决scheme是使用组粘性位,并使组可写入文件。

问题是,当用户上传文件在网站上的文件的所有者成为networking服务器,因此阻止我们能够通过FTP更改权限等。

这没有任何意义 – 用户如何成为一个networking服务器? 还是你想描述什么发生与PHP safe_mode gid检查禁用? 在这种情况下,解决scheme可能使用粘性组位与safe_mode_gid,但safe_modefunction是不推荐的 ,您应该寻找一个不依赖于它的不同解决scheme。

很多在共享主机上build立的网站

你有主机访问权限? 如果没有,那么你应该明确地考虑迁移到一个专门的或虚拟主机,你可以实际控制这些东西 – 如果你不能改变configuration,那么你唯一的select是使用共享帐户。

你还应该继续使用FTP – 这是一个安全的噩梦,很难自动化。

我解决这类问题的唯一方法是让root运行一个常规的cronjob,它设置webserver目录下文件的权限。 这有点丑,但它确实很好。

你可以使用Apache的umask设置。

http://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html

默认情况下,使用Apache上传的文件将干涉服务器的umask设置。

但是您可以select专门为Apache设置umask。

看看这个https://stackoverflow.com/questions/428416/setting-the-umask-of-the-apache-user

而不是运行cronjobs来改变所有权,你可以使用fsniper: http ://freshmeat.net/projects/fsniper

fsniper监视新文件的目录(通过inotify),并立即而不是周期性地触发脚本。