【问题标题】:When does a (FUSE) filesystem check acces rights?(FUSE) 文件系统何时检查访问权限?
【发布时间】:2014-08-04 10:36:57
【问题描述】:

“Unix 世界”文件系统(如 ext4)在 inode 中为每个文件存储 3 种可用用户 owner、group、other 的权限/访问权限列表。 我想知道“身份验证”何时发生;我的意思是:

假设我们有一个文件

file.txt     rwx     rw-     ---       st_uid=54    st_gid=99
             owner   group   others    

用户tim拥有uid=100gid=99

在终端运行cat file.txt,请求到达文件系统,该文件系统将tim与文件的权限进行比较;

tim不是所有者:他的uid=100与文件的uid=54不一样;

但他的gid与文件相同(99),所以他得到的响应是rw-

cat实际上是一个读取,所以用户收到内容

这个场景是在哪个系统函数中执行的?我可以通过实现自定义文件系统来修改它吗?

更新: 我的文件系统的唯一目的是稍微弄乱权限并成为概念证明(这是一个研究项目),所以任何关于我应该从哪里开始的想法都会受到高度赞赏。提前致谢!!

【问题讨论】:

  • 使用 shell 命令strace cat file.txt,您会发现如果出现 EACCES 错误,它是由文件 open() 系统调用引起的。
  • 就内核架构而言,如果 fs 模块必须自己进行(实施)权限检查,我会感到惊讶。它们可能会将“模式位”返回给内核中的常见 fs 例程。如果您希望自定义,请查看 ACL。
  • 我正在创建一个自定义 fuse 文件系统,我可以轻松更改 open/readdir/chmod.. 的行为;我唯一的问题是,即使我知道有关文件的所有详细信息,我也不知道如何找出提出请求的用户;有什么想法吗?
  • @sawdust strace 似乎是一个非常好的起点;我不知道它的存在;)
  • 但是文件系统真的需要知道哪个用户正在访问文件吗?让内核处理所有的权限检查。您的 FUSE 文件系统应该只返回存储在文件系统中的数据。

标签: linux unix linux-kernel filesystems fuse


【解决方案1】:

对于 FUSE 文件系统,解决方案很简单: FUSE 实现为每个用户向文件系统发出的请求提供了一个上下文

工作流程如下所示:

  1. 用户发出与文件系统相关的请求(即ls
  2. 内核注意到该特定文件系统是使用 FUSE 挂载的
  3. 请求被转发到自定义文件系统(使用 FUSE 创建)。在这里,您可以使用 fuse_context 访问请求的元数据,这将返回一个 uid、gid、pid。
  4. 现在球在你的球场上:你可以(几乎)做任何你想做的事,完全控制文件系统和用户的请求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2017-03-23
    • 2011-10-29
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多