FreeBSD14.3中ZFS文件系统与samba设置仅指定用户可编辑的共享
起因:为了安全考虑,将公司的NAS服务器迁移到了FreeBSD系统,并使用3个容量相同,但品牌不同的SSD硬盘组成了mirror存储池,同时还继续使用Samba来设置共享。但是,在Debian13环境下,ACL权限的配置和FreeBSD14.X 环境下有很多不同。 因为ZFS文件系统,采用的时NFSv4 ACL协议。这导致在Linux系统下可以用的命令,在FreeBSD中有很大不同。
一、配置目标
在zpool池 dataXY中,有数据集 dataShare 挂载到了 /mnt/storage ,计划创建一个samba共享 /mnt/storage/File ,使其只可以被userA和userB 读、写、执行,其他的samba用户,只能查看该共享内的文件。
二、创建一个用于两个用户的交集组
创建 groupAB(若不存在):
pw groupadd groupAB
pw groupmod groupAB -m userA,userB目录归组设为 groupAB(不修改用户主组):
chown root:groupAB /mnt/storage/File三、配置ACL权限
3.1 清除已有 ACL
setfacl -b /mnt/storage/File3.2 配置 NFSv4 ACL(关键)
设置 groupAB 完全权限,并可继承:
setfacl -m group:groupAB:full_set:fdi:allow /mnt/storage/File设置 owner 完全权限(一般自动存在,但确保无误):
setfacl -m group:groupAB:read_data/write_data/append_data/execute/read_xattr/write_xattr/read_attributes/write_attributes/delete/delete_child/read_acl/write_acl/write_owner:file_inherit/dir_inherit:allow /mnt/storage/File设置 everyone@(其他用户)只读、可遍历:
setfacl -m everyone@:read_data/execute/read_xattr/read_attributes/read_acl/synchronize:file_inherit/dir_inherit:allow /mnt/storage/File四、避免samba权限配置覆盖ACL
设置数据集:
zfs set aclmode=passthrough dataXY/dataShare
zfs set aclinherit=passthrough dataXY/dataShare这保证 Samba 不会覆盖 ACL,也不会破坏继承。
五、Samba共享的配置
在 /usr/local/etc/smb4.conf 中:
[File]path = /mnt/storage/Fileread only = nowrite list = @groupABforce group = groupABbrowseable = yescreate mask = 0664directory mask = 0775解释:
write list = @groupAB只允许 groupAB 写入force group = groupAB让 Samba 创建的文件归属于 groupAB(无需更改用户主组)- ACL 决定最终权限,不依赖 chmod mask
- 其他用户可访问但只能读
六、最终效果
| 用户 | 权限 | 新建文件权限 |
| userA | rwX | 自动继承 groupAB rwX |
| userB | rwX | 自动继承 groupAB rwX |
| 其他用户 | rX | 无权写 |
注意: 由于采用标准的不同,ACL权限的配置命令,在两大操作系统中有诸多不同, 3.2 中的配置,是成功与否的关键。
