聊聊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。

浙公网安备 33010602011771号