我必须承认,我从未真正完全获得* nix文件系统权限模型。哦,rwxrwxrwx的东西并不太复杂,但是当程序创建新文件以及我如何处理它们时,我很容易感到困惑。
我当前的问题是一个(闭源)java-applet的混合物,它通过ftp和php进行文件上传(它在专用服务器上,数据并不是真正关键,所以我不太关心世界可写)。
所以,我有两个用户:ftp(1000)和apache / php(81)。群体不匹配,所以他们基本上是“其他人”,如果我是正确的。
“导入”目录,由ftp。
设置为0777如果访问者访问上传页面,则由我的脚本创建以其用户名命名的子目录。比方说,访问者的用户名是“foo”,所以它是“import / foo”,设置为0777,用户为81 / php。
接下来,访问者使用java applet将文件上传到此目录(test.jpg)。文件的权限现在是rw-r - r--,用户ftp。
我不明白的第一件事是:我可以通过php取消链接该文件 为什么?用户不匹配,文件不是世界可写的 这是因为父目录的世界写权限?可以理解的是,我不能通过php来chown或chmod。
到目前为止没有问题,因为只要我能阅读和取消链接,每件事都可以。java applet能够上传整个目录,这很不错。如果我这样做,新的子目录import / foo / test具有权限rwxr-xr-x / ftp。这个目录中的文件是rw-r - r - / ftp。
现在我运气不好。我不能对这些文件做任何事情(除了阅读,我做成功),没有取消链接,没有chmod / chowning。他们只是坐在那里吞噬磁盘空间。
那么,默认权限新文件背后的计划是什么?我的猜测是他们通过umask设置了权限,只要创建脚本没有将其修改为其他内容。我是对的吗?
我该怎么办呢?我的意思是,一个明智的人会做什么?我可以/我应该更改ftp用户的umask吗? (我刚刚了解了umask昨天)。我对此不太满意,因为这会影响所有ftp流量,不是吗?此外,服务器是专用的,但我不是管理员,因此我的访问权限受到限制。
我刚才有了另一个想法。在开始这篇文章之前,我阅读了基本的linux权限内容。首先,粘滞位未设置在目录链中的任何位置。然后,它是:“设置用户ID位”
所以,我目前的计划是编写一个简单的shell脚本,其所有者ftp是另一个可执行的setuid。该脚本只是将导入目录所有权中的文件传输给用户php
然后,在每次导入后,我只是exec()
来自我的php脚本的文件,并进一步处理文件。
更新:我只是尝试通过winscp(通过ftp连接)设置uid位(4755),但它以某种方式不起作用 - 它似乎“忘记”只有uid位(其他位置位)。这是为什么?为什么主人不能自己设置uid?是特定于服务器还是通常情况?
更新2:
维基百科说这一切
由于安全漏洞的可能性增加,许多操作系统在应用于可执行shell脚本时会忽略setuid属性。
用户root是否仍然可以设置uid-bit?
答案 0 :(得分:1)
第一个回答
正确,您有权修改目录,以便取消链接文件。该文件是否可读或无关。
第二个回答
是的,你是正确的,除非脚本/ applet然后将文件权限chmod为其他东西,否则将使用用户的默认umask
第三个回答
为ftp设置默认的umask是最简单的解决方案,但正如您所说,这会影响由ftp用户创建的所有文件。如果该用户仅用于通过applet上传(并且它应该是真的),那么这不是我要说的问题。
另一个选择是运行一个执行脚本的cron作业(就像你建议的那样),从FTP上传区域到webroot上的某个地方chmoding /拥有这些文件(可能还有病毒扫描等)。
您没有说明为什么将这些文件只读给Apache是一个问题(或者说FTP根目录不在Web根目录下?),或许可以澄清这有助于指出一个合理的解决方案?一般来说,除非你先经过审查,否则你不想信任用户给你的任何东西。
编辑 - 刚看到你不是机器的管理员,这让事情变得困难。答案 1 :(得分:0)
我今天学到的东西:对于脚本,setuid位经常被停用。
我已经确定的解决方案:apache / php获取某些脚本(webroot之外的一个目录中的所有脚本)的sudoer权限,可以作为ftp-或apache-user运行。然后我可以使用system / exec / etc从php调用带有sudo的脚本。
我不知道sudo可以这样配置。 惊人