【问题标题】:Linux: changing file ownership without a copy?Linux:在没有副本的情况下更改文件所有权?
【发布时间】:2015-09-25 03:29:21
【问题描述】:

我有一个 REST 服务器,其目的是组织各种用户生成的文件。为简单起见,服务器和用户都可以访问共享的网络文件系统。

工作流程如下:用户在临时文件夹中生成文件。然后他通知服务器,然后服务器将文件放在自己的位置,并将一些元数据存储在数据库中。然后服务器应该拥有这些文件并根据需要处理它们的删除。

我的问题如下:由于文件可能很大,我想避免昂贵的复制,而是简单地将文件从临时文件夹移动到最终目的地。但是,移动文件会阻止服务器更改其所有权 (see here for example)。

有没有办法解决这个问题,而不需要 1)复制文件,以及 2)以 root 身份运行服务器?

编辑:几个精度:

  • 要移动的文件可以是具有文件层次结构的目录
  • 最好让服务器拥有最终位置的文件以限制其他用户的访问。

【问题讨论】:

  • 用户和服务器是否可以在同一个组中,这样您就可以通过这种方式处理权限而无需 chown 文件?
  • @EricRenouf :如果服务器不拥有该文件,它不能限制其他用户的权限。基本上我希望用户将所有权授予服务器并放弃他们的权限,以便稍后他们将通过服务器独占访问文件。
  • 对于像 ZFS 和 btrfs 这样的文件系统,复制文件应该很便宜。我不确定(这里不适合测试),但我想那些将文件识别为重复文件并且实际上没有存储两次的文件系统很可能在文件具有不同所有者时仍然有效。

标签: linux security unix permissions


【解决方案1】:

您应该为所有用户和服务器使用一个用户组。使临时目录归该组所有,并将其设置为组可写和 sgid。

chown :groupname /path/to/temp
chmod g+s /path/to/temp
chmod 770 /path/to/temp

然后服务器可以轻松地获取文件的所有权。当然这意味着用户可以写其他用户的文件,但我想这不是问题,因为他们在那里停留的时间很短?

【讨论】:

  • 谢谢,我会尝试并报告。
  • setgid 不适用于移动到那里的文件,仅适用于在那里创建的文件(cp 也会创建)。移动只是被视为重命名,因此文件的所有其他属性保持不变。
  • 此解决方案的另一个问题是文件的 unix 所有权保留给其初始创建者,服务器无法真正采用文件(在 unix 所有权的意义上)。跨度>
【解决方案2】:

如果您创建一个单独的用户只是为了处理 chown,您可以为该用户提供 CAP_CHOWN 功能,并且您可以拥有该用户拥有的单个可执行文件,并在其上设置了 setuid 位(因此它以该用户身份执行)。

为了安全,这个可执行文件应该做的越少越好,检查越多越好。

它应该在服务器用户移动之后为服务器用户执行 chown。它应该存在于其他用户不可写的目录中;它可以进行检查以确保它对要求 chown 的文件的所有属性(当前所有者、位置等)感到满意,它可以对服务器用户进行硬编码(因此其他人无法使用它),等等

这可能必须是一个小型 C 程序,因为大多数系统不允许您在脚本中使用 setuid。你可以在网上找到几个做 chown 的小示例程序——一个是 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多