返回顶部

聊聊juicefs权限控制

起因

项目使用juicefs作为文件系统对外提供服务,元数据存储在postgresql中,数据存储在minio中,同时minio也可以作为对象网关对外提供服务。有部分文件可能会有转储的需求,多用户操作自然会涉及到权限控制,想着了解一下

调研

一、文件存储

在 JuiceFS 挂载时启用 POSIX ACL

JuiceFS 默认启用UID/GID 自动映射,会与本地自动进行同步,此外 JuiceFS 支持 POSIX ACL,可以直接对用户和用户组设置更细粒度的权限。在经过网上查到的使用 -o allow_other,acl 参数挂载时碰壁。

allow_other参数:该选项允许其他用户(包括非挂载用户)访问挂载的文件系统,JuiceFS 依赖 FUSE(用户空间文件系统),所以需要安装fuse (centos参考: yum install -y fuse fuse-devel),此外 allow_other 需要在 /etc/fuse.conf 中启用 user_allow_other

acl参数:启动失败,报错大致是没这个选项! 找资料发现可以在format的时候加上--enable-acl来替代,此外mount时可以加的参数有--enable-xattr

acl 选项允许使用 setfacl 和 getfacl 命令来管理 ACL 规则。

使用 setfacl 设定文件和目录权限

如果希望用户 user1 只能读取 /mnt/juicefs/data 目录,不能删除或修改文件:

setfacl -m u:user1:r-- /mnt/juicefs/data

或者禁止用户 user2 删除 /mnt/juicefs/data/file.txt:

setfacl -m u:user2:-w /mnt/juicefs/data/file.txt

也可以针对组设定权限:

setfacl -m g:group1:r-x /mnt/juicefs/data

二、对象存储

配置 MinIO 的 IAM 策略(防止直接访问对象存储)

对象网关部分用户、用户组权限本文暂未详述,可参考JuiceFS v1.2-beta1,Gateway 升级,多用户场景权限管理更灵活

如果担心用户绕过 JuiceFS 直接访问 MinIO,可以配置 MinIO 的 IAM 策略,限制用户的 API 操作,例如:

{
  "Version": "2025-01-01",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": ["s3:DeleteObject", "s3:PutObject"],
      "Resource": ["arn:aws:s3:::juicefs-bucket/*"],
      "Principal": {"AWS": ["arn:aws:iam::account-id:user/user1"]}
    }
  ]
}

这样 user1 无法通过 MinIO API 删除或上传对象。

三、postgresql数据库

PostgreSQL 层面约束(限制元数据修改)

JuiceFS 依赖 PostgreSQL 存储元数据,如果不希望某些用户能修改 jfs_node 表中的数据,可以为 PostgreSQL 设定合适的权限:

REVOKE UPDATE, DELETE ON jfs_node FROM user1;

这样 user1 不能直接修改数据库中的元数据,防止通过 SQL 方式篡改文件系统信息。

补充

setfacl使用

  • 为特定用户添加权限 setfacl -m u:username:rw- /path/to/file,为用户 username 设置对文件的读写权限。

  • 为特定组添加权限setfacl -m g:groupname:r-x /path/to/file,为组 groupname 设置读和执行权限。

  • 设置默认 ACL(目录) setfacl -m d:u:username:rwx /path/to/dir,新创建的文件或子目录将继承此权限。

  • 递归设置 ACL setfacl -R -m u:username:rwx /path/to/dir,递归为目录及其所有内容设置权限。

  • 删除特定 ACL 条目setfacl -x u:username /path/to/file,删除用户 username 的 ACL 条目。

  • 删除所有扩展 ACL setfacl -b /path/to/file,删除所有扩展 ACL,仅保留基本 POSIX 权限。

getfacl使用

  • 查看文件 ACL getfacl /path/to/file

  • 查看目录 ACL getfacl /path/to/dir

jfs_node表中mode权限转换

postgresql数据库中jfs_node表中mode存储的是十进制,而我们通常使用八进制来表示权限信息。
比如文件权限是-rw-r-xr--,八进制表示为654,对应的十进制就是428

posted @ 2025-03-10 17:22  十方央丶  阅读(137)  评论(0)    收藏  举报