我有一个REST服务器,其目的是组织各种用户生成的文件。为了简单起见,服务器和用户都可以访问共享网络文件系统。
工作流程如下:用户在临时文件夹中生成文件。然后,他通知服务器,然后将文件放在自己的位置并将一些元数据存储在数据库中。然后,服务器应该拥有这些文件并根据需要进行删除。
我的问题如下:由于文件可能很大,我想避免昂贵的副本,而只是将文件从临时文件夹移动到最终目的地。但是,移动文件会阻止服务器更改其所有权(see here for example)。
有没有解决方法,没有1)复制文件,2)以root身份运行服务器?
编辑:几个精确度:
答案 0 :(得分:10)
如果您创建一个单独的用户来处理chown,您可以为该用户提供CAP_CHOWN功能,并且您可以拥有该用户拥有setuid位的单个可执行文件(因此它将以该用户身份执行) )。
为了安全起见,这个可执行文件应尽可能少地执行,并尽可能多地进行检查。
服务器用户执行移动后,应该为服务器用户执行chown。它应该存在于其他用户无法写入的目录中;它可以进行检查以确保它对所要求的文件的所有属性(当前所有者,位置等)感到满意,它可以让服务器用户硬编码(因此没有其他人可以使用它),等
这可能必须是一个小型的C程序,因为大多数系统都不允许您将setuid与脚本一起使用。你可以在网上找到几个小的示例程序 - 一个是here
答案 1 :(得分:1)
您应该为所有用户和服务器使用用户组。创建该组拥有的临时目录,并将其设置为group-writable和sgid。
chown :groupname /path/to/temp
chmod g+s /path/to/temp
chmod 770 /path/to/temp
然后服务器可以轻松采用文件的所有权。当然这意味着用户可以写其他用户的文件,但我想这不是一个值得关注的问题,因为他们会在那里停留很短的时间?