samba共享中acl映射为windows安全描述符的核心是启用vfs objects = acl_xattr并确保文件系统支持xattr和posix acl,需挂载时启用user_xattr,acl选项、内核开启acl支持、selinux允许samba读写xattr,且smb.conf中配置map acl inherit = yes、store dos attributes = yes及inherit permissions = yes。

Samba共享中ACL权限映射为Windows的复杂安全描述符(Security Descriptor),核心在于启用并正确配置Samba的vfs objects = acl_xattr模块,并确保底层文件系统支持扩展属性(xattr)和POSIX ACL。这不是自动完成的转换,而是一套需协同工作的机制。
依赖前提:文件系统与内核支持
Windows安全描述符包含所有者(Owner)、组(Group)、DACL(自主访问控制列表)、SACL(系统访问控制列表)等字段。Samba本身不存储完整SD,而是将其中关键部分——特别是DACL——映射为Linux扩展ACL(via setfacl/getfacl)并持久化在文件/目录的xattr中(如system.posix_acl_access)。因此必须满足:
- 文件系统需挂载时启用
user_xattr和acl选项(例如ext4:mount -o defaults,user_xattr,acl /dev/sda1 /data) - Linux内核需启用
CONFIG_EXT4_FS_POSIX_ACL=y等对应ACL支持 - SELinux若启用,需确保上下文允许samba进程读写xattr(如
samba_share_t类型已正确定义)
smb.conf中启用ACL映射的关键配置
仅开启acl_xattr还不够,需配合全局及共享级设置才能让Windows客户端看到并操作“属性→安全”页签中的权限条目:
- 全局段添加:
map acl inherit = yes(使新创建子目录自动继承父目录ACL) - 全局段添加:
store dos attributes = yes(保存隐藏/只读/系统等DOS属性,影响安全描述符完整性) - 共享段中启用:
vfs objects = acl_xattr(必需) - 共享段建议加:
inherit permissions = yes(配合map acl inherit,保证新建文件权限与父目录一致) - 避免使用
security = share,必须为security = user或更高(如ads),否则ACL无用户上下文可映射
Windows端如何体现与验证映射效果
当上述配置生效后,在Windows资源管理器中右键Samba共享内的文件或文件夹→“属性→安全”页签,即可看到类似NTFS的用户/组列表和权限勾选框。此时的操作(如添加域用户、设“修改”权限)会触发Samba将变更写入对应文件的xattr;反向地,用getfacl /path/to/file可在Linux端看到对应的POSIX ACL条目(如user:DOMAINuser:rwx)。注意:
- Windows显示的“完全控制”“修改”等权限名,是Samba根据POSIX rwx位+扩展ACL规则翻译而来,并非原生NTFS语义
- 若看到“无法显示当前权限”或安全页签灰显,常见原因是未启用
acl_xattr、xattr不可写、或Samba未以足够权限运行(如被systemd限制CapabilityBoundingSet) - 使用
icacls \servershareile /grant "DOMAINUser:(M)"命令成功执行,且getfacl可见对应条目,即证明映射链路通达
特殊场景:与Active Directory集成时的SID映射
当Samba作为AD域成员(security = ads)时,Windows传来的ACE中含域用户SID,Samba需通过winbind或idmap_sss将SID解析为本地UID/GID,再转为POSIX ACL条目。此时必须确保:
-
idmap config * : backend = tdb或更推荐sss(配合SSSD) -
winbind use default domain = yes(简化用户名显示) - SSSD配置中
services = nss, pam, sudo, ifp, ssh且domains = YOURDOMAIN已正确定义











